about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorErick Tryzelaar <erick.tryzelaar@gmail.com>2014-07-28 17:32:51 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2014-07-29 16:01:36 -0700
commite841a88b9298b0d1fef93192d8e163b44645fc73 (patch)
tree9ae56039fa607f96398be46cd12ce141b8065f31 /src/libsyntax
parent1200ad0f06fc1ecc9a5ccf320e704c95786dbfe3 (diff)
downloadrust-e841a88b9298b0d1fef93192d8e163b44645fc73.tar.gz
rust-e841a88b9298b0d1fef93192d8e163b44645fc73.zip
syntax: add support for quoting arms
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/ext/base.rs3
-rw-r--r--src/libsyntax/ext/quote.rs8
-rw-r--r--src/libsyntax/parse/parser.rs54
3 files changed, 40 insertions, 25 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs
index a66d6839ab0..d00406e07b7 100644
--- a/src/libsyntax/ext/base.rs
+++ b/src/libsyntax/ext/base.rs
@@ -382,6 +382,9 @@ fn initial_syntax_expander_table() -> SyntaxEnv {
     syntax_expanders.insert(intern("quote_pat"),
                        builtin_normal_expander(
                             ext::quote::expand_quote_pat));
+    syntax_expanders.insert(intern("quote_arm"),
+                       builtin_normal_expander(
+                            ext::quote::expand_quote_arm));
     syntax_expanders.insert(intern("quote_stmt"),
                        builtin_normal_expander(
                             ext::quote::expand_quote_stmt));
diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs
index 8f236cebcf4..dcfb0198127 100644
--- a/src/libsyntax/ext/quote.rs
+++ b/src/libsyntax/ext/quote.rs
@@ -349,6 +349,14 @@ pub fn expand_quote_pat(cx: &mut ExtCtxt,
     base::MacExpr::new(expanded)
 }
 
+pub fn expand_quote_arm(cx: &mut ExtCtxt,
+                        sp: Span,
+                        tts: &[ast::TokenTree])
+                        -> Box<base::MacResult> {
+    let expanded = expand_parse_call(cx, sp, "parse_arm", vec!(), tts);
+    base::MacExpr::new(expanded)
+}
+
 pub fn expand_quote_ty(cx: &mut ExtCtxt,
                        sp: Span,
                        tts: &[ast::TokenTree])
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 878994369d0..945a643d2b4 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -2727,37 +2727,41 @@ impl<'a> Parser<'a> {
         self.commit_expr_expecting(discriminant, token::LBRACE);
         let mut arms: Vec<Arm> = Vec::new();
         while self.token != token::RBRACE {
-            let attrs = self.parse_outer_attributes();
-            let pats = self.parse_pats();
-            let mut guard = None;
-            if self.eat_keyword(keywords::If) {
-                guard = Some(self.parse_expr());
-            }
-            self.expect(&token::FAT_ARROW);
-            let expr = self.parse_expr_res(RESTRICT_STMT_EXPR);
-
-            let require_comma =
-                !classify::expr_is_simple_block(expr)
-                && self.token != token::RBRACE;
-
-            if require_comma {
-                self.commit_expr(expr, &[token::COMMA], &[token::RBRACE]);
-            } else {
-                self.eat(&token::COMMA);
-            }
-
-            arms.push(ast::Arm {
-                attrs: attrs,
-                pats: pats,
-                guard: guard,
-                body: expr
-            });
+            arms.push(self.parse_arm());
         }
         let hi = self.span.hi;
         self.bump();
         return self.mk_expr(lo, hi, ExprMatch(discriminant, arms));
     }
 
+    pub fn parse_arm(&mut self) -> Arm {
+        let attrs = self.parse_outer_attributes();
+        let pats = self.parse_pats();
+        let mut guard = None;
+        if self.eat_keyword(keywords::If) {
+            guard = Some(self.parse_expr());
+        }
+        self.expect(&token::FAT_ARROW);
+        let expr = self.parse_expr_res(RESTRICT_STMT_EXPR);
+
+        let require_comma =
+            !classify::expr_is_simple_block(expr)
+            && self.token != token::RBRACE;
+
+        if require_comma {
+            self.commit_expr(expr, &[token::COMMA], &[token::RBRACE]);
+        } else {
+            self.eat(&token::COMMA);
+        }
+
+        ast::Arm {
+            attrs: attrs,
+            pats: pats,
+            guard: guard,
+            body: expr,
+        }
+    }
+
     /// Parse an expression
     pub fn parse_expr(&mut self) -> Gc<Expr> {
         return self.parse_expr_res(UNRESTRICTED);