Я хочу, чтобы мой процедурный макрос заменил некоторые методы BinaryOps. Как установить интервалы, чтобы при возникновении ошибок мои пользователи не были полностью смущены?Как правильно обрабатывать промежутки в процедурных макросах?
5
A
ответ
1
После того, как я посмотрел на источник rustc
, я пришел к выводу, что, следуя модели «расширения», вы получите наилучшие результаты. Поэтому мы сохраняем оригинал Span
, но для expn_id
, который мы можем получить, позвонив по телефону ExtCtxt::backtrace()
.
Представляется целесообразным установить это в обоих случаях, указанных в вопросе. Оператор можно рассматривать как расширенный в путь (вызов функции) и исходное двоичное выражение выражение, расширенное в вызове функции. Код:
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
}
..
}
Смежные вопросы
- 1. Как обрабатывать расширенные макросы из процедурных макросов?
- 2. График временной шкалы - как обрабатывать временные промежутки?
- 3. Как правильно обрабатывать фокус
- 4. Как правильно обрабатывать ThreadInterruptedException?
- 5. Как правильно обрабатывать зсапЕ()
- 6. Как правильно обрабатывать исключения?
- 7. как правильно обрабатывать обещания?
- 8. Как правильно обрабатывать ZoneLocalMapping.ResultType.Ametiguous?
- 9. Как обрабатывать массив правильно
- 10. Как правильно обрабатывать System.Net.Mail.SmtpException?
- 11. Как правильно обрабатывать System.Web.HttpRequestValidationException
- 12. Doxygen для процедурных программ
- 13. Выполнение процедурных запросов в Perl
- 14. расширяющие макросы в макросах
- 15. Weird гигиены в макросах
- 16. Как правильно обрабатывать обновление страницы?
- 17. Как правильно обрабатывать журналы ошибок?
- 18. Как правильно обрабатывать запрос ajax
- 19. Как правильно обрабатывать прерывания потока
- 20. Как правильно обрабатывать вызовы NSTimer?
- 21. QSortFilterProxyModel как правильно обрабатывать QStandardItems
- 22. Node.js: Как правильно обрабатывать обещание
- 23. Как правильно обрабатывать наследование python
- 24. Как правильно обрабатывать/отлаживать HttpExceptions?
- 25. Как правильно обрабатывать асинхронные действия?
- 26. Как правильно обрабатывать системные исключения?
- 27. Как правильно обрабатывать исключения задач
- 28. Как правильно обрабатывать вложенные FrameLayout
- 29. Как правильно обрабатывать прерывания звука?
- 30. Как правильно обрабатывать запрос кодировки?
Можете привести пример? Вы хотите, чтобы span выделял только BinaryOp или целое двоичное выражение? – kennytm
Каждому Expr требуется пролет. У нас есть оригинальный 'BinaryOp'' Expr', оператор 'Expr' (который не изменяется, поэтому они сохраняют '' Span ''), вновь созданный 'MethodCall'' Expr' с 'Span' для обоих 'Expr' и' Ident' метода. Это те последние два «Спана», которые меня интересуют. – llogiq