about summary refs log tree commit diff
path: root/src/libsyntax/parse
diff options
context:
space:
mode:
authorJakub Wieczorek <jakubw@jakubw.net>2012-12-08 20:22:43 +0000
committerGraydon Hoare <graydon@mozilla.com>2012-12-17 16:50:40 -0800
commit1968cb315af9d128ee4457738fddd1eba275277f (patch)
tree99dc401a2713e3502c9b53333b74767adad53e98 /src/libsyntax/parse
parent5bf7ba077330c4cdb75802a4ca2497af24d21c4e (diff)
downloadrust-1968cb315af9d128ee4457738fddd1eba275277f.tar.gz
rust-1968cb315af9d128ee4457738fddd1eba275277f.zip
Add support for destructuring vectors in match expressions
Diffstat (limited to 'src/libsyntax/parse')
-rw-r--r--src/libsyntax/parse/parser.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 47f65ed2f8d..50ed0df28a0 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1794,6 +1794,39 @@ impl Parser {
         };
     }
 
+    fn parse_pat_vec_elements(refutable: bool) -> (~[@pat], Option<@pat>) {
+        let mut elements = ~[];
+        let mut tail = None;
+        let mut first = true;
+
+        while self.token != token::RBRACKET {
+            if first { first = false; }
+            else { self.expect(token::COMMA); }
+
+            let mut is_tail = false;
+            if self.token == token::DOTDOT {
+                self.bump();
+                is_tail = true;
+            }
+
+            let subpat = self.parse_pat(refutable);
+            if is_tail {
+                match subpat {
+                    @{ node: pat_wild, _ } => (),
+                    @{ node: pat_ident(_, _, _), _ } => (),
+                    @{ span, _ } => self.span_fatal(
+                        span, ~"expected an identifier or `_`"
+                    )
+                }
+                tail = Some(subpat);
+                break;
+            }
+
+            elements.push(subpat);
+        }
+        return (elements, tail);
+    }
+
     fn parse_pat_fields(refutable: bool) -> (~[ast::field_pat], bool) {
         let mut fields = ~[];
         let mut etc = false;
@@ -1929,6 +1962,13 @@ impl Parser {
                 pat = pat_tup(fields);
             }
           }
+          token::LBRACKET => {
+            self.bump();
+            let (elements, tail) = self.parse_pat_vec_elements(refutable);
+            hi = self.span.hi;
+            self.expect(token::RBRACKET);
+            pat = ast::pat_vec(elements, tail);
+          }
           copy tok => {
             if !is_ident_or_path(tok)
                 || self.is_keyword(~"true")