对于overflower,我正在尝试替换所有算术运算(二进制+
,-
,*
,/
,%
,<<
,>>
和一元-
)以及相应的特征方法调用。但是,我正在用宏来打墙。理想情况下,我会处理已经扩展的宏,但这似乎不起作用。
我已按照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)
答案 0 :(得分:3)
您可以使用expand_expr
功能进行完全扩展(如果允许,宏等等)。您需要一个MacroExpander
,您可以通过将ExtCtxt
的可变引用传递给MacroExpander::new
方法,或致电ExtCtxt
&#39; s {{1}方法。
实际代码是:
expander()
编辑:为了完整性,还应该使用ItemKind :: Mac展开Items; 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);
}
..
}
方法与syntax::ext::expand::expand_item(..)
的工作方式类似。