经过一番研究后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
}
..
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |