diff options
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index adcaa006247..38cd09abad4 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2024,23 +2024,28 @@ pub impl Parser { fn parse_pat_vec_elements( &self, refutable: bool - ) -> (~[@pat], Option<@pat>) { - let mut elements = ~[]; - let mut tail = None; + ) -> (~[@pat], Option<@pat>, ~[@pat]) { + let mut before = ~[]; + let mut slice = None; + let mut after = ~[]; let mut first = true; + let mut before_slice = 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 mut is_slice = false; + if before_slice { + if *self.token == token::DOTDOT { + self.bump(); + is_slice = true; + before_slice = false; + } } let subpat = self.parse_pat(refutable); - if is_tail { + if is_slice { match subpat { @ast::pat { node: pat_wild, _ } => (), @ast::pat { node: pat_ident(_, _, _), _ } => (), @@ -2048,13 +2053,17 @@ pub impl Parser { span, ~"expected an identifier or `_`" ) } - tail = Some(subpat); - break; + slice = Some(subpat); + } else { + if before_slice { + before.push(subpat); + } else { + after.push(subpat); + } } - - elements.push(subpat); } - return (elements, tail); + + (before, slice, after) } fn parse_pat_fields(&self, refutable: bool) -> (~[ast::field_pat], bool) { @@ -2208,10 +2217,11 @@ pub impl Parser { } token::LBRACKET => { self.bump(); - let (elements, tail) = self.parse_pat_vec_elements(refutable); + let (before, slice, after) = + self.parse_pat_vec_elements(refutable); hi = self.span.hi; self.expect(&token::RBRACKET); - pat = ast::pat_vec(elements, tail); + pat = ast::pat_vec(before, slice, after); } copy tok => { if !is_ident_or_path(&tok) |
