如何从过程宏中处理扩展的宏?

时间:2016-06-07 04:05:28

标签: plugins macros rust

对于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)

1 个答案:

答案 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(..)的工作方式类似。