diff options
| author | Jakub Wieczorek <jakubw@jakubw.net> | 2012-12-08 20:22:43 +0000 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2012-12-17 16:50:40 -0800 |
| commit | 1968cb315af9d128ee4457738fddd1eba275277f (patch) | |
| tree | 99dc401a2713e3502c9b53333b74767adad53e98 /src/libsyntax/parse | |
| parent | 5bf7ba077330c4cdb75802a4ca2497af24d21c4e (diff) | |
| download | rust-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.rs | 40 |
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") |
