2016-06-02 29 views
5

Prosedürel makamın bazı BinaryOps'leri yöntemlerle değiştirmesini istiyorum. Hataları nasıl ayarlayabilirim ki, hatalar oluşursa, kullanıcılarm tamamen karışmazlar?Usul makroları ile doğru şekilde nasıl uyulur?

+0

Bir örnek verebilir misiniz? Açıklığın sadece BinaryOp'u veya tüm ikili ifadeyi vurgulamasını mı istiyorsunuz? – kennytm

+0

Her Expr'nin bir süreye ihtiyacı var. Orijinal 'BinaryOp' Expr', 'Expr's operatör (değişmemiş, bu yüzden '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' "Expr" ve yöntemin "Ident". Bu, ilgilendiğim ikinci "Span" lar. – llogiq

cevap

1

Bazıları, rustc kaynağına baktıktan sonra, "genişleme" modelini izleyerek en iyi sonuçları veren sonuca vardım. Bu yüzden Span orijinalini saklıyoruz, ancak numaralı telefonu arayarak alabileceğimiz expn_id için.

Her iki durumda da bu soruda ana hatlarıyla belirtilmesi iyi bir fikir gibi görünüyor. operatörü, (işlev çağrısı) yoluna genişletildi ve işlev çağrısı olarak genişletilen orijinal ikili işlemi ifadesi olarak görülebilir. Kodda:

match expr.unwrap() { 
    .. 
    Expr { node: ExprKind::Binary(Spanned { node: Add, span: op }, l, r), span, .. } => { 
     let bt = self.cx.backtrace(); // get the expansion ID 
     let path = self.cx.path(Span { expn_id: bt, ..op }, vec![crate_name, trait_name, fn_name]); 
     let epath = self.cx.expr_path(path); // path expression 
     let args_expanded = self.fold_exprs(args); 
     self.cx.expr_call(Span { expn_id: bt, ..span }, epath, args_expanded) 
     //^outer expression 
    } 
    .. 
} 
İlgili konular