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?
5
A
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
}
..
}
Bir örnek verebilir misiniz? Açıklığın sadece BinaryOp'u veya tüm ikili ifadeyi vurgulamasını mı istiyorsunuz? – kennytm
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