about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorJohn Clements <clements@racket-lang.org>2013-06-06 14:17:18 -0700
committerJohn Clements <clements@racket-lang.org>2013-06-06 14:21:07 -0700
commiteff49fc48b96b2d1ab30060499a8f2d6aeb97f9e (patch)
treebadadef94c230dd70cb36d570b8bd8a67c9d296a /src/libsyntax
parent2d59ebadb934e7f576662a46b8f150bb50008424 (diff)
downloadrust-eff49fc48b96b2d1ab30060499a8f2d6aeb97f9e.tar.gz
rust-eff49fc48b96b2d1ab30060499a8f2d6aeb97f9e.zip
implement fold traversing macros
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/fold.rs41
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))
         }
     }
 }