2016-06-07 53 views
2

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)

回答

2

可以使用expand_expr功能做了充分的擴展(如果讓,宏,等...)。您需要一個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(..)類似。