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



对于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方法或调用ExtCtxtexpander()方法来获得它。

实际代码为:

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(..)类似。

最新更新