对于Overflower,我试图将所有算术运算(二进制+
,-
,*
,/
,%
,<<
,>>
和一元-
)替换为相应的trait方法调用。但是,我正在用宏碰壁。理想情况下,我会处理已经扩展的宏,但这似乎不起作用。
我遵循了 syntax::fold::Folder::fold_mac(..)
中的建议并调用了 noop_fold_mac(mac, self)
,但这似乎对宏内部的内容没有任何作用,例如 assert_eq!(2, 1 + 1)
.我不关心代码预扩展,那么如何在扩展代码上进行宏工作?
我可能可以直接处理TokenTrees
,但这很麻烦。
我正在使用rustc 1.11.0-nightly (915b003e3 2016-06-02)
expand_expr
函数进行完全扩展(如果let,宏等...)。你需要一个MacroExpander
,你可以通过将一个对ExtCtxt
的可变引用传递给MacroExpander::new
方法或调用ExtCtxt
的expander()
方法来获得它。
实际代码为:
fn fold_expr(&mut self, expr: P<Expr>) -> P<Expr> {
..
if let ExprKind::Mac(_) = expr.node {
let expanded = expand_expr(expr.unwrap(), &mut self.cx.expander());
return self.fold_expr(expanded);
}
..
}
编辑:为了完整起见,还应该使用ItemKind::Mac展开项目;有一个syntax::ext::expand::expand_item(..)
方法的工作方式与expand_expr(..)
类似。