Chcę, aby moje makro proceduralne zastąpiło niektóre BinaryOps metodami. Jak ustawić przęsła, aby w przypadku wystąpienia błędów moi użytkownicy nie byli całkowicie zdezorientowani?Jak poprawnie radzić sobie z rozpiętościami w makrach proceduralnych?
5
A
Odpowiedz
1
Po zapoznaniu się ze źródłem doszedłem do wniosku, że po modelu "ekspansji" daje najlepsze rezultaty. Tak więc zachowujemy oryginalny Span
, ale dla expn_id
, który możemy uzyskać dzwoniąc pod numer ExtCtxt::backtrace()
.
Wydaje się, że dobrym pomysłem jest ustawienie tego w obu przypadkach opisanych w pytaniu. Operator może być postrzegany jako rozwinięty w ścieżkę (wywołanie funkcji), a oryginalny wyrażenie binarne jako rozszerzony do wywołania funkcji. W kodzie:
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
}
..
}
Powiązane problemy
- 1. Jak radzić sobie z autorotacją w AVCaptureVideoPreviewLayer?
- 2. Jak radzić sobie z przepełnieniem w C
- 3. Jak radzić sobie z StackOverflowError w Javie?
- 4. jak radzić sobie z unicode w mako?
- 5. Jak radzić sobie z IEnumerable w F #?
- 6. Jak radzić sobie z IOException w Iterable.forEach?
- 7. Jak radzić sobie z połączeniami z hgsubversion?
- 8. Jak radzić sobie z podprojektami z autotoolami?
- 9. Jak radzić sobie z deserializacją z polimorfizmem?
- 10. Jak radzić sobie z unique_ptr z SWIG
- 11. Jak radzić sobie z polimorfizmem z JSF2?
- 12. Jak radzić sobie z nieujemnymi modami?
- 13. Jak radzić sobie z Eclipse CDT + Cygwin?
- 14. Jak radzić sobie z nieciągłością Git?
- 15. Jak radzić sobie z błędami pobierania JavaScript?
- 16. Jak radzić sobie z awarią AsyncTask
- 17. Jak radzić sobie z GooglePlayServicesRepairableException i GooglePlayServicesNotAvailableException
- 18. Jak radzić sobie z org.apache.tomcat.util.threads.TaskQueue.take() hotspot?
- 19. Jak radzić sobie z wyjątkami REST?
- 20. swift - Jak radzić sobie z niezamkniętym wyjątkiem
- 21. gettext, jak radzić sobie z homonimami?
- 22. Jak radzić sobie z danymi wynikowymi fetchxml?
- 23. Jak radzić sobie z tym błędem git
- 24. Jak radzić sobie z monstrualnymi działaniami Struts?
- 25. Jak radzić sobie z Simultaneous javascript xmlhttpdquests?
- 26. Jak radzić sobie z przestrzenią nazw Haskell?
- 27. Jak radzić sobie z błędem ETIMEDOUT?
- 28. Jak radzić sobie z usługą RestClient :: ServerBrokeConnection
- 29. Jak radzić sobie z ObjectResult w Entity Framework 4
- 30. Jak radzić sobie z konfigurowaniem środowiska w makefile?
Czy możesz podać przykład? Chcesz, aby zakres podświetlał tylko BinaryOp lub całe wyrażenie binarne? – kennytm
Każdy Expr potrzebuje rozpiętości. Mamy oryginalne 'BinaryOp'' Expr', operatora 'Expr' (które są niezmienione, więc zachowują swoje' Span's), nowo utworzone 'MethodCall'' Expr' z 'Span's dla obu 'Expr' i" Ident "metody. To te dwa ostatnie "Span", którymi jestem zainteresowany. – llogiq