Ich möchte, dass mein Prozedurmakro einige BinaryOps durch Methoden ersetzt. Wie stelle ich die Spannen so ein, dass meine Benutzer bei Fehlern nicht völlig verwirrt sind?Wie behandelt man Spannen in prozeduralen Makros richtig?
5
A
Antwort
1
Nach einigem Blick in rustc
's Quelle kam ich zu dem Schluss, dass nach dem "Expansion" -Modell die besten Ergebnisse erzielt. So behalten wir das Original Span
aber für die expn_id
, die wir erhalten können, indem wir ExtCtxt::backtrace()
anrufen.
Es scheint eine gute Idee zu sein, dies in beiden in der Frage beschriebenen Fällen zu setzen. Der -Operator kann als in den (Funktionsaufruf-) Pfad expandiert betrachtet werden, und die ursprüngliche binäre Operation Ausdruck als in den Funktionsaufruf erweitert. In Code:
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
}
..
}
Verwandte Themen
- 1. Wie man Versprechungen richtig behandelt?
- 2. Wie System.Net.Mail.SmtpException richtig behandelt?
- 3. QSortFilterProxyModel Wie man QStandardItems richtig behandelt
- 4. Wie behandelt man onError in RxJava (Android) richtig?
- 5. Erweiterung Makros in Makros
- 6. Wie behandelt man `UIAlertController` richtig, wenn die Quellansicht geändert wird?
- 7. Wie man Klickereignisse auf dem Widget richtig behandelt
- 8. Wie können Audiounterbrechungen richtig behandelt werden?
- 9. Wie behandelt man Ausnahmen?
- 10. Wie behandelt man System.Data.Entity.Validation.DbEntityValidationException?
- 11. Wie man Python-Makros in LibreOffice ausführt?
- 12. Wie man Ausnahmen in Junit behandelt
- 13. Wie man EOFException behandelt?
- 14. Wie behandelt man das Frontend in Lumen
- 15. Wie behandelt man zwei Bindestriche in ReST
- 16. Makros in Makros
- 17. Verschachteltes Spannen
- 18. Wie behandelt man Klickereignisse in Meteor?
- 19. Wie behandelt man Code-Ausnahmen in node.js?
- 20. Wie behandelt man Nebenwirkungen in react/redux?
- 21. Volley behandelt keine mehrwertigen Header richtig
- 22. jQuery: Wie man den Änderungstext der Spanne behandelt
- 23. Wie wird Unique-Constraint-Verletzung in SDN4 richtig behandelt?
- 24. Wie werden Fehler in einer n-Tier-Anwendung richtig behandelt?
- 25. Wie behandelt man Alpha in einem manuellen Overlay-Mischvorgang?
- 26. Wie behandelt man Laravel NotFoundHttpException?
- 27. Wie behandelt man PHP-Funktionsfehler?
- 28. java.util.concurrent.CompletionStage - Wie behandelt man Ausnahmen?
- 29. UIManagedDocument - Wie behandelt man UIDocumentStateSavingError?
- 30. Wie behandelt man findElements Ergebnis?
Können Sie ein Beispiel geben? Sie möchten, dass der Bereich nur die BinaryOp oder den gesamten binären Ausdruck hervorhebt? – kennytm
Jeder Expr benötigt eine Spanne. Wir haben das Original 'BinaryOp'' Expr', den Operator 'Expr' (die unverändert sind, so behalten sie ihre' Span's), das neu erstellte 'MethodCall'' Expr' mit 'Span's für beide 'Expr' und die' Ident' der Methode. Es sind die letzten beiden Span's, an denen ich interessiert bin. – llogiq