Parse multiple patterns in if-let and while-let
diff --git a/src/expr.rs b/src/expr.rs
index 11cee91..e770fde 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -242,7 +242,7 @@
pub attrs: Vec<Attribute>,
pub if_token: Token![if],
pub let_token: Token![let],
- pub pat: Box<Pat>,
+ pub pats: Punctuated<Pat, Token![|]>,
pub eq_token: Token![=],
pub expr: Box<Expr>,
pub then_branch: Block,
@@ -268,7 +268,7 @@
pub label: Option<Label>,
pub while_token: Token![while],
pub let_token: Token![let],
- pub pat: Box<Pat>,
+ pub pats: Punctuated<Pat, Token![|]>,
pub eq_token: Token![=],
pub expr: Box<Expr>,
pub body: Block,
@@ -764,7 +764,7 @@
pub struct Local {
pub attrs: Vec<Attribute>,
pub let_token: Token![let],
- pub pat: Box<Pat>,
+ pub pats: Punctuated<Pat, Token![|]>,
pub ty: Option<(Token![:], Box<Type>)>,
pub init: Option<(Token![=], Box<Expr>)>,
pub semi_token: Token![;],
@@ -1758,14 +1758,14 @@
named!(parse -> Self, do_parse!(
if_: keyword!(if) >>
let_: keyword!(let) >>
- pat: syn!(Pat) >>
+ pats: call!(Punctuated::parse_separated_nonempty) >>
eq: punct!(=) >>
cond: expr_no_struct >>
then_block: braces!(Block::parse_within) >>
else_block: option!(else_block) >>
(ExprIfLet {
attrs: Vec::new(),
- pat: Box::new(pat),
+ pats: pats,
let_token: let_,
eq_token: eq,
expr: Box::new(cond),
@@ -2043,7 +2043,7 @@
label: option!(syn!(Label)) >>
while_: keyword!(while) >>
let_: keyword!(let) >>
- pat: syn!(Pat) >>
+ pats: call!(Punctuated::parse_separated_nonempty) >>
eq: punct!(=) >>
value: expr_no_struct >>
while_block: syn!(Block) >>
@@ -2052,7 +2052,7 @@
eq_token: eq,
let_token: let_,
while_token: while_,
- pat: Box::new(pat),
+ pats: pats,
expr: Box::new(value),
body: while_block,
label: label,
@@ -2384,14 +2384,14 @@
named!(stmt_local -> Stmt, do_parse!(
attrs: many0!(Attribute::parse_outer) >>
let_: keyword!(let) >>
- pat: syn!(Pat) >>
+ pats: call!(Punctuated::parse_separated_nonempty) >>
ty: option!(tuple!(punct!(:), syn!(Type))) >>
init: option!(tuple!(punct!(=), syn!(Expr))) >>
semi: punct!(;) >>
(Stmt::Local(Local {
attrs: attrs,
let_token: let_,
- pat: Box::new(pat),
+ pats: pats,
ty: ty.map(|(colon, ty)| (colon, Box::new(ty))),
init: init.map(|(eq, expr)| (eq, Box::new(expr))),
semi_token: semi,
@@ -3010,7 +3010,7 @@
tokens.append_all(self.attrs.outer());
self.if_token.to_tokens(tokens);
self.let_token.to_tokens(tokens);
- self.pat.to_tokens(tokens);
+ self.pats.to_tokens(tokens);
self.eq_token.to_tokens(tokens);
wrap_bare_struct(tokens, &self.expr);
self.then_branch.to_tokens(tokens);
@@ -3036,7 +3036,7 @@
self.label.to_tokens(tokens);
self.while_token.to_tokens(tokens);
self.let_token.to_tokens(tokens);
- self.pat.to_tokens(tokens);
+ self.pats.to_tokens(tokens);
self.eq_token.to_tokens(tokens);
wrap_bare_struct(tokens, &self.expr);
self.body.to_tokens(tokens);
@@ -3565,7 +3565,7 @@
fn to_tokens(&self, tokens: &mut Tokens) {
tokens.append_all(self.attrs.outer());
self.let_token.to_tokens(tokens);
- self.pat.to_tokens(tokens);
+ self.pats.to_tokens(tokens);
if let Some((ref colon_token, ref ty)) = self.ty {
colon_token.to_tokens(tokens);
ty.to_tokens(tokens);
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 3676070..e53ff9a 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -1142,7 +1142,7 @@
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
if_token: Token ! [ if ](tokens_helper(_visitor, &(_i . if_token).0)),
let_token: Token ! [ let ](tokens_helper(_visitor, &(_i . let_token).0)),
- pat: Box::new(_visitor.fold_pat(* _i . pat)),
+ pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
eq_token: Token ! [ = ](tokens_helper(_visitor, &(_i . eq_token).0)),
expr: Box::new(_visitor.fold_expr(* _i . expr)),
then_branch: _visitor.fold_block(_i . then_branch),
@@ -1342,7 +1342,7 @@
label: (_i . label).map(|it| { _visitor.fold_label(it) }),
while_token: Token ! [ while ](tokens_helper(_visitor, &(_i . while_token).0)),
let_token: Token ! [ let ](tokens_helper(_visitor, &(_i . let_token).0)),
- pat: Box::new(_visitor.fold_pat(* _i . pat)),
+ pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
eq_token: Token ! [ = ](tokens_helper(_visitor, &(_i . eq_token).0)),
expr: Box::new(_visitor.fold_expr(* _i . expr)),
body: _visitor.fold_block(_i . body),
@@ -2051,7 +2051,7 @@
Local {
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
let_token: Token ! [ let ](tokens_helper(_visitor, &(_i . let_token).0)),
- pat: Box::new(_visitor.fold_pat(* _i . pat)),
+ pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
ty: (_i . ty).map(|it| { (
Token ! [ : ](tokens_helper(_visitor, &(( it ) . 0).0)),
Box::new(_visitor.fold_type(* ( it ) . 1)),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index c42740a..1298276 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -901,7 +901,7 @@
for it in & _i . attrs { _visitor.visit_attribute(it) };
tokens_helper(_visitor, &(& _i . if_token).0);
tokens_helper(_visitor, &(& _i . let_token).0);
- _visitor.visit_pat(& * _i . pat);
+ for el in Punctuated::pairs(& _i . pats) { let it = el.value(); _visitor.visit_pat(it) };
tokens_helper(_visitor, &(& _i . eq_token).0);
_visitor.visit_expr(& * _i . expr);
_visitor.visit_block(& _i . then_branch);
@@ -1057,7 +1057,7 @@
if let Some(ref it) = _i . label { _visitor.visit_label(it) };
tokens_helper(_visitor, &(& _i . while_token).0);
tokens_helper(_visitor, &(& _i . let_token).0);
- _visitor.visit_pat(& * _i . pat);
+ for el in Punctuated::pairs(& _i . pats) { let it = el.value(); _visitor.visit_pat(it) };
tokens_helper(_visitor, &(& _i . eq_token).0);
_visitor.visit_expr(& * _i . expr);
_visitor.visit_block(& _i . body);
@@ -1620,7 +1620,7 @@
pub fn visit_local<'ast, V: Visit<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Local) {
for it in & _i . attrs { _visitor.visit_attribute(it) };
tokens_helper(_visitor, &(& _i . let_token).0);
- _visitor.visit_pat(& * _i . pat);
+ for el in Punctuated::pairs(& _i . pats) { let it = el.value(); _visitor.visit_pat(it) };
if let Some(ref it) = _i . ty {
tokens_helper(_visitor, &(& ( it ) . 0).0);
_visitor.visit_type(& * ( it ) . 1);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 44e6e35..95a358a 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -902,7 +902,7 @@
for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . if_token).0);
tokens_helper(_visitor, &mut (& mut _i . let_token).0);
- _visitor.visit_pat_mut(& mut * _i . pat);
+ for mut el in Punctuated::pairs_mut(& mut _i . pats) { let it = el.value_mut(); _visitor.visit_pat_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . eq_token).0);
_visitor.visit_expr_mut(& mut * _i . expr);
_visitor.visit_block_mut(& mut _i . then_branch);
@@ -1058,7 +1058,7 @@
if let Some(ref mut it) = _i . label { _visitor.visit_label_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . while_token).0);
tokens_helper(_visitor, &mut (& mut _i . let_token).0);
- _visitor.visit_pat_mut(& mut * _i . pat);
+ for mut el in Punctuated::pairs_mut(& mut _i . pats) { let it = el.value_mut(); _visitor.visit_pat_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . eq_token).0);
_visitor.visit_expr_mut(& mut * _i . expr);
_visitor.visit_block_mut(& mut _i . body);
@@ -1621,7 +1621,7 @@
pub fn visit_local_mut<V: VisitMut + ?Sized>(_visitor: &mut V, _i: &mut Local) {
for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
tokens_helper(_visitor, &mut (& mut _i . let_token).0);
- _visitor.visit_pat_mut(& mut * _i . pat);
+ for mut el in Punctuated::pairs_mut(& mut _i . pats) { let it = el.value_mut(); _visitor.visit_pat_mut(it) };
if let Some(ref mut it) = _i . ty {
tokens_helper(_visitor, &mut (& mut ( it ) . 0).0);
_visitor.visit_type_mut(& mut * ( it ) . 1);