diff options
| author | John Clements <clements@racket-lang.org> | 2013-06-06 14:17:18 -0700 |
|---|---|---|
| committer | John Clements <clements@racket-lang.org> | 2013-06-06 14:21:07 -0700 |
| commit | eff49fc48b96b2d1ab30060499a8f2d6aeb97f9e (patch) | |
| tree | badadef94c230dd70cb36d570b8bd8a67c9d296a /src/libsyntax | |
| parent | 2d59ebadb934e7f576662a46b8f150bb50008424 (diff) | |
| download | rust-eff49fc48b96b2d1ab30060499a8f2d6aeb97f9e.tar.gz rust-eff49fc48b96b2d1ab30060499a8f2d6aeb97f9e.zip | |
implement fold traversing macros
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/fold.rs | 41 |
1 files changed, 38 insertions, 3 deletions
diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 7562930b655..9796fcd8bac 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -116,11 +116,43 @@ fn fold_arg_(a: arg, fld: @ast_fold) -> arg { id: fld.new_id(a.id), } } + //used in noop_fold_expr, and possibly elsewhere in the future fn fold_mac_(m: &mac, fld: @ast_fold) -> mac { spanned { - node: match m.node { mac_invoc_tt(*) => copy m.node }, - span: fld.new_span(m.span), + node: match m.node { + mac_invoc_tt(p,ref tts) => + mac_invoc_tt(fld.fold_path(p), + fold_tts(*tts,fld)) + }, + span: fld.new_span(m.span) + } +} + +fn fold_tts(tts : &[token_tree], fld: @ast_fold) -> ~[token_tree] { + do tts.map |tt| { + match *tt { + tt_tok(span, ref tok) => + tt_tok(span,maybe_fold_ident(tok,fld)), + tt_delim(ref tts) => + tt_delim(fold_tts(*tts,fld)), + tt_seq(span, ref pattern, ref sep, is_optional) => + tt_seq(span, + fold_tts(*pattern,fld), + sep.map(|tok|maybe_fold_ident(tok,fld)), + is_optional), + tt_nonterminal(sp,ref ident) => + tt_nonterminal(sp,fld.fold_ident(*ident)) + } + } +} + +// apply ident folder if it's an ident, otherwise leave it alone +fn maybe_fold_ident(t : &token::Token, fld: @ast_fold) -> token::Token { + match *t { + token::IDENT(id,followed_by_colons) => + token::IDENT(fld.fold_ident(id),followed_by_colons), + _ => copy *t } } @@ -291,7 +323,10 @@ pub fn noop_fold_item_underscore(i: &item_, fld: @ast_fold) -> item_ { } item_mac(ref m) => { // FIXME #2888: we might actually want to do something here. - item_mac(copy *m) + // ... okay, we're doing something. It would probably be nicer + // to add something to the ast_fold trait, but I'll defer + // that work. + item_mac(fold_mac_(m,fld)) } } } |
