about summary refs log tree commit diff
path: root/src/libsyntax/ext/tt
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2013-11-24 23:08:53 -0800
committerSteven Fackler <sfackler@palantir.com>2013-11-26 13:56:02 -0800
commitc144752a2de4ffe3a2a22da9a8309ca2ecd85c58 (patch)
tree66ab1d0cce647d2f0863a94bdb127a511ad8fe62 /src/libsyntax/ext/tt
parent09f84aa8f4298489828720c048ec7f769338c0e2 (diff)
downloadrust-c144752a2de4ffe3a2a22da9a8309ca2ecd85c58.tar.gz
rust-c144752a2de4ffe3a2a22da9a8309ca2ecd85c58.zip
Support multiple item macros
Closes #4375
Diffstat (limited to 'src/libsyntax/ext/tt')
-rw-r--r--src/libsyntax/ext/tt/macro_rules.rs13
1 files changed, 10 insertions, 3 deletions
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs
index 343116df642..3cc00ef8199 100644
--- a/src/libsyntax/ext/tt/macro_rules.rs
+++ b/src/libsyntax/ext/tt/macro_rules.rs
@@ -24,6 +24,7 @@ use parse::attr::parser_attr;
 use parse::token::{get_ident_interner, special_idents, gensym_ident, ident_to_str};
 use parse::token::{FAT_ARROW, SEMI, nt_matchers, nt_tt, EOF};
 use print;
+use util::small_vector::SmallVector;
 
 struct ParserAnyMacro {
     parser: @Parser,
@@ -54,9 +55,15 @@ impl AnyMacro for ParserAnyMacro {
         self.ensure_complete_parse(true);
         ret
     }
-    fn make_item(&self) -> Option<@ast::item> {
-        let attrs = self.parser.parse_outer_attributes();
-        let ret = self.parser.parse_item(attrs);
+    fn make_items(&self) -> SmallVector<@ast::item> {
+        let mut ret = SmallVector::zero();
+        loop {
+            let attrs = self.parser.parse_outer_attributes();
+            match self.parser.parse_item(attrs) {
+                Some(item) => ret.push(item),
+                None => break
+            }
+        }
         self.ensure_complete_parse(false);
         ret
     }