Implement vector destructuring from tail

This commit is contained in:
Seo Sanghyeon 2013-02-27 03:58:46 +09:00
parent 58618fb8cf
commit 9e85589ad3
17 changed files with 241 additions and 159 deletions

View file

@ -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)