summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorPaul Stansifer <paul.stansifer@gmail.com>2012-07-06 18:04:28 -0700
committerPaul Stansifer <paul.stansifer@gmail.com>2012-07-09 17:44:46 -0700
commit54741b9427541df4508a3a7423102a677ba3dce9 (patch)
tree59e443febfea46a250d7b1672fa3505f2d3eedfd /src/libsyntax/parse
parentcaa83b41bba2b63c8b55193d176d40f5eb0fa9a8 (diff)
downloadrust-54741b9427541df4508a3a7423102a677ba3dce9.tar.gz
rust-54741b9427541df4508a3a7423102a677ba3dce9.zip
Allow defining token tree macros. They should work now!
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/lexer.rs4
-rw-r--r--src/libsyntax/parse/parser.rs14
2 files changed, 12 insertions, 6 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs
index 600aa9f4c42..b3ba35dea2e 100644
--- a/src/libsyntax/parse/lexer.rs
+++ b/src/libsyntax/parse/lexer.rs
@@ -98,9 +98,9 @@ impl tt_reader_as_reader of reader for tt_reader {
         tt_next_token(self)
     }
     fn fatal(m: str) -> ! {
-        self.span_diagnostic.span_fatal(copy self.cur_span, m);
+        self.sp_diag.span_fatal(copy self.cur_span, m);
     }
-    fn span_diag() -> span_handler { self.span_diagnostic }
+    fn span_diag() -> span_handler { self.sp_diag }
     fn interner() -> @interner<@str> { self.interner }
     fn peek() -> {tok: token::token, sp: span} {
         { tok: self.cur_tok, sp: self.cur_span }
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index a2d0ad33afc..b800dc7fda3 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1022,9 +1022,12 @@ class parser {
             /* `!`, as an operator, is prefix, so we know this isn't that */
             if self.token == token::NOT {
                 self.bump();
-                let m_body = self.parse_token_tree();
+                let tts = self.parse_unspanned_seq(
+                    token::LBRACE, token::RBRACE, seq_sep_none(),
+                    |p| p.parse_token_tree());
                 let hi = self.span.hi;
-                ret pexpr(self.mk_mac_expr(lo, hi, mac_invoc_tt(pth,m_body)));
+
+                ret pexpr(self.mk_mac_expr(lo, hi, mac_invoc_tt(pth, tts)));
             } else {
                 hi = pth.span.hi;
                 ex = expr_path(pth);
@@ -2642,14 +2645,17 @@ class parser {
             self.parse_item_class()
         } else if !self.is_any_keyword(copy self.token)
             && self.look_ahead(1) == token::NOT
+            && is_plain_ident(self.look_ahead(2))
         {
             // item macro.
             let pth = self.parse_path_without_tps();
             #error("parsing invocation of %s", *pth.idents[0]);
             self.expect(token::NOT);
             let id = self.parse_ident();
-            let tt = self.parse_token_tree();
-            let m = ast::mac_invoc_tt(pth, tt);
+            let tts = self.parse_unspanned_seq(token::LBRACE, token::RBRACE,
+                                               seq_sep_none(),
+                                               |p| p.parse_token_tree());
+            let m = ast::mac_invoc_tt(pth, tts);
             let m: ast::mac = {node: m,
                                span: {lo: self.span.lo,
                                       hi: self.span.hi,