2016-06-07 2 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); 
    } 
    .. 
} 

Edit: Для полноты, следует также расширить Элементы с ItemKind :: Mac; существует метод syntax::ext::expand::expand_item(..), работающий аналогично expand_expr(..).

Смежные вопросы