Implement vector destructuring from tail
This commit is contained in:
parent
58618fb8cf
commit
9e85589ad3
17 changed files with 241 additions and 159 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue