Collapse parallel Option fields in exprs
diff --git a/src/expr.rs b/src/expr.rs
index 4cef442..225fc65 100644
--- a/src/expr.rs
+++ b/src/expr.rs
@@ -586,11 +586,9 @@
pub attrs: Vec<Attribute>,
pub let_token: Token![let],
pub pat: Box<Pat>,
- pub colon_token: Option<Token![:]>,
- pub ty: Option<Box<Type>>,
- pub eq_token: Option<Token![=]>,
+ pub ty: Option<(Token![:], Box<Type>)>,
/// Initializer expression to set the value, if any
- pub init: Option<Box<Expr>>,
+ pub init: Option<(Token![=], Box<Expr>)>,
pub semi_token: Token![;],
}
}
@@ -614,8 +612,7 @@
pub by_ref: Option<Token![ref]>,
pub mutability: Option<Token![mut]>,
pub ident: Ident,
- pub at_token: Option<Token![@]>,
- pub subpat: Option<Box<Pat>>,
+ pub subpat: Option<(Token![@], Box<Pat>)>,
}),
/// A struct or struct variant pattern, e.g. `Variant {x, y, ..}`.
@@ -735,8 +732,7 @@
pub struct Arm {
pub attrs: Vec<Attribute>,
pub pats: Delimited<Pat, Token![|]>,
- pub if_token: Option<Token![if]>,
- pub guard: Option<Box<Expr>>,
+ pub guard: Option<(Token![if], Box<Expr>)>,
pub rocket_token: Token![=>],
pub body: Box<Expr>,
pub comma: Option<Token![,]>,
@@ -1679,10 +1675,9 @@
) >>
(Arm {
rocket_token: rocket,
- if_token: guard.as_ref().map(|p| Token.0)),
attrs: attrs,
pats: pats,
- guard: guard.map(|p| Box::new(p.1)),
+ guard: guard.map(|(if_, guard)| (if_, Box::new(guard))),
body: Box::new(body.0),
comma: body.1,
})
@@ -2062,14 +2057,12 @@
init: option!(tuple!(punct!(=), syn!(Expr))) >>
semi: punct!(;) >>
(Stmt::Local(Box::new(Local {
- let_token: let_,
- semi_token: semi,
- colon_token: ty.as_ref().map(|p| Token.0)),
- eq_token: init.as_ref().map(|p| Token.0)),
- pat: Box::new(pat),
- ty: ty.map(|p| Box::new(p.1)),
- init: init.map(|p| Box::new(p.1)),
attrs: attrs,
+ let_token: let_,
+ pat: Box::new(pat),
+ ty: ty.map(|(colon, ty)| (colon, Box::new(ty))),
+ init: init.map(|(eq, expr)| (eq, Box::new(expr))),
+ semi_token: semi,
})))
));
@@ -2172,8 +2165,7 @@
by_ref: by_ref,
mutability: mutability,
ident: name,
- at_token: subpat.as_ref().map(|p| Token.0)),
- subpat: subpat.map(|p| Box::new(p.1)),
+ subpat: subpat.map(|(at, pat)| (at, Box::new(pat))),
})
));
}
@@ -2237,7 +2229,6 @@
mutability: mutability,
ident: ident,
subpat: None,
- at_token: None,
}.into();
if let Some(boxed) = boxed {
pat = PatBox {
@@ -2985,9 +2976,9 @@
fn to_tokens(&self, tokens: &mut Tokens) {
tokens.append_all(&self.attrs);
self.pats.to_tokens(tokens);
- if self.guard.is_some() {
- TokensOrDefault(&self.if_token).to_tokens(tokens);
- self.guard.to_tokens(tokens);
+ if let Some((ref if_token, ref guard)) = self.guard {
+ if_token.to_tokens(tokens);
+ guard.to_tokens(tokens);
}
self.rocket_token.to_tokens(tokens);
self.body.to_tokens(tokens);
@@ -3008,9 +2999,9 @@
self.by_ref.to_tokens(tokens);
self.mutability.to_tokens(tokens);
self.ident.to_tokens(tokens);
- if self.subpat.is_some() {
- TokensOrDefault(&self.at_token).to_tokens(tokens);
- self.subpat.to_tokens(tokens);
+ if let Some((ref at_token, ref subpat)) = self.subpat {
+ at_token.to_tokens(tokens);
+ subpat.to_tokens(tokens);
}
}
}
@@ -3193,13 +3184,13 @@
tokens.append_all(self.attrs.outer());
self.let_token.to_tokens(tokens);
self.pat.to_tokens(tokens);
- if self.ty.is_some() {
- TokensOrDefault(&self.colon_token).to_tokens(tokens);
- self.ty.to_tokens(tokens);
+ if let Some((ref colon_token, ref ty)) = self.ty {
+ colon_token.to_tokens(tokens);
+ ty.to_tokens(tokens);
}
- if self.init.is_some() {
- TokensOrDefault(&self.eq_token).to_tokens(tokens);
- self.init.to_tokens(tokens);
+ if let Some((ref eq_token, ref init)) = self.init {
+ eq_token.to_tokens(tokens);
+ init.to_tokens(tokens);
}
self.semi_token.to_tokens(tokens);
}
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 1f60d88..3013ab5 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -453,8 +453,10 @@
Arm {
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
pats: FoldHelper::lift(_i . pats, |it| { _visitor.fold_pat(it) }),
- if_token: (_i . if_token).map(|it| { Token ! [ if ](tokens_helper(_visitor, &(it).0)) }),
- guard: (_i . guard).map(|it| { Box::new(_visitor.fold_expr(* it)) }),
+ guard: (_i . guard).map(|it| { (
+ Token ! [ if ](tokens_helper(_visitor, &(( it ) . 0).0)),
+ Box::new(_visitor.fold_expr(* ( it ) . 1)),
+ ) }),
rocket_token: Token ! [ => ](tokens_helper(_visitor, &(_i . rocket_token).0)),
body: Box::new(_visitor.fold_expr(* _i . body)),
comma: (_i . comma).map(|it| { Token ! [ , ](tokens_helper(_visitor, &(it).0)) }),
@@ -1928,10 +1930,14 @@
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)),
- colon_token: (_i . colon_token).map(|it| { Token ! [ : ](tokens_helper(_visitor, &(it).0)) }),
- ty: (_i . ty).map(|it| { Box::new(_visitor.fold_type(* it)) }),
- eq_token: (_i . eq_token).map(|it| { Token ! [ = ](tokens_helper(_visitor, &(it).0)) }),
- init: (_i . init).map(|it| { Box::new(_visitor.fold_expr(* it)) }),
+ ty: (_i . ty).map(|it| { (
+ Token ! [ : ](tokens_helper(_visitor, &(( it ) . 0).0)),
+ Box::new(_visitor.fold_type(* ( it ) . 1)),
+ ) }),
+ init: (_i . init).map(|it| { (
+ Token ! [ = ](tokens_helper(_visitor, &(( it ) . 0).0)),
+ Box::new(_visitor.fold_expr(* ( it ) . 1)),
+ ) }),
semi_token: Token ! [ ; ](tokens_helper(_visitor, &(_i . semi_token).0)),
}
}
@@ -2123,8 +2129,10 @@
by_ref: (_i . by_ref).map(|it| { Token ! [ ref ](tokens_helper(_visitor, &(it).0)) }),
mutability: (_i . mutability).map(|it| { Token ! [ mut ](tokens_helper(_visitor, &(it).0)) }),
ident: _visitor.fold_ident(_i . ident),
- at_token: (_i . at_token).map(|it| { Token ! [ @ ](tokens_helper(_visitor, &(it).0)) }),
- subpat: (_i . subpat).map(|it| { Box::new(_visitor.fold_pat(* it)) }),
+ subpat: (_i . subpat).map(|it| { (
+ Token ! [ @ ](tokens_helper(_visitor, &(( it ) . 0).0)),
+ Box::new(_visitor.fold_pat(* ( it ) . 1)),
+ ) }),
}
}
# [ cfg ( feature = "full" ) ]
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index df1f9d6..120d1fd 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -428,8 +428,10 @@
pub fn visit_arm<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Arm) {
for it in & _i . attrs { _visitor.visit_attribute(it) };
for el in & _i . pats { let it = el.item(); _visitor.visit_pat(it) };
- if let Some(ref it) = _i . if_token { tokens_helper(_visitor, &(it).0) };
- if let Some(ref it) = _i . guard { _visitor.visit_expr(& * * it) };
+ if let Some(ref it) = _i . guard {
+ tokens_helper(_visitor, &(& ( it ) . 0).0);
+ _visitor.visit_expr(& * ( it ) . 1);
+ };
tokens_helper(_visitor, &(& _i . rocket_token).0);
_visitor.visit_expr(& * _i . body);
if let Some(ref it) = _i . comma { tokens_helper(_visitor, &(it).0) };
@@ -1519,10 +1521,14 @@
for it in & _i . attrs { _visitor.visit_attribute(it) };
tokens_helper(_visitor, &(& _i . let_token).0);
_visitor.visit_pat(& * _i . pat);
- if let Some(ref it) = _i . colon_token { tokens_helper(_visitor, &(it).0) };
- if let Some(ref it) = _i . ty { _visitor.visit_type(& * * it) };
- if let Some(ref it) = _i . eq_token { tokens_helper(_visitor, &(it).0) };
- if let Some(ref it) = _i . init { _visitor.visit_expr(& * * it) };
+ if let Some(ref it) = _i . ty {
+ tokens_helper(_visitor, &(& ( it ) . 0).0);
+ _visitor.visit_type(& * ( it ) . 1);
+ };
+ if let Some(ref it) = _i . init {
+ tokens_helper(_visitor, &(& ( it ) . 0).0);
+ _visitor.visit_expr(& * ( it ) . 1);
+ };
tokens_helper(_visitor, &(& _i . semi_token).0);
}
@@ -1658,8 +1664,10 @@
if let Some(ref it) = _i . by_ref { tokens_helper(_visitor, &(it).0) };
if let Some(ref it) = _i . mutability { tokens_helper(_visitor, &(it).0) };
_visitor.visit_ident(& _i . ident);
- if let Some(ref it) = _i . at_token { tokens_helper(_visitor, &(it).0) };
- if let Some(ref it) = _i . subpat { _visitor.visit_pat(& * * it) };
+ if let Some(ref it) = _i . subpat {
+ tokens_helper(_visitor, &(& ( it ) . 0).0);
+ _visitor.visit_pat(& * ( it ) . 1);
+ };
}
# [ cfg ( feature = "full" ) ]
pub fn visit_pat_lit<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast PatLit) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index d8f10fa..00d9c17 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -428,8 +428,10 @@
pub fn visit_arm_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Arm) {
for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
for mut el in & mut _i . pats { let it = el.item_mut(); _visitor.visit_pat_mut(it) };
- if let Some(ref mut it) = _i . if_token { tokens_helper(_visitor, &mut (it).0) };
- if let Some(ref mut it) = _i . guard { _visitor.visit_expr_mut(& mut * * it) };
+ if let Some(ref mut it) = _i . guard {
+ tokens_helper(_visitor, &mut (& mut ( it ) . 0).0);
+ _visitor.visit_expr_mut(& mut * ( it ) . 1);
+ };
tokens_helper(_visitor, &mut (& mut _i . rocket_token).0);
_visitor.visit_expr_mut(& mut * _i . body);
if let Some(ref mut it) = _i . comma { tokens_helper(_visitor, &mut (it).0) };
@@ -1519,10 +1521,14 @@
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);
- if let Some(ref mut it) = _i . colon_token { tokens_helper(_visitor, &mut (it).0) };
- if let Some(ref mut it) = _i . ty { _visitor.visit_type_mut(& mut * * it) };
- if let Some(ref mut it) = _i . eq_token { tokens_helper(_visitor, &mut (it).0) };
- if let Some(ref mut it) = _i . init { _visitor.visit_expr_mut(& 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);
+ };
+ if let Some(ref mut it) = _i . init {
+ tokens_helper(_visitor, &mut (& mut ( it ) . 0).0);
+ _visitor.visit_expr_mut(& mut * ( it ) . 1);
+ };
tokens_helper(_visitor, &mut (& mut _i . semi_token).0);
}
@@ -1658,8 +1664,10 @@
if let Some(ref mut it) = _i . by_ref { tokens_helper(_visitor, &mut (it).0) };
if let Some(ref mut it) = _i . mutability { tokens_helper(_visitor, &mut (it).0) };
_visitor.visit_ident_mut(& mut _i . ident);
- if let Some(ref mut it) = _i . at_token { tokens_helper(_visitor, &mut (it).0) };
- if let Some(ref mut it) = _i . subpat { _visitor.visit_pat_mut(& mut * * it) };
+ if let Some(ref mut it) = _i . subpat {
+ tokens_helper(_visitor, &mut (& mut ( it ) . 0).0);
+ _visitor.visit_pat_mut(& mut * ( it ) . 1);
+ };
}
# [ cfg ( feature = "full" ) ]
pub fn visit_pat_lit_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut PatLit) {
diff --git a/tests/test_expr.rs b/tests/test_expr.rs
index 66da76e..821e37a 100644
--- a/tests/test_expr.rs
+++ b/tests/test_expr.rs
@@ -94,7 +94,7 @@
assert_let!(Item::Fn(ItemFn { ref block, .. }) = actual.items[1]; {
assert_let!(Stmt::Local(ref local) = block.stmts[0]; {
- assert_let!(Local { init: Some(ref init_expr), .. } = **local; {
+ assert_let!(Local { init: Some((_, ref init_expr)), .. } = **local; {
assert_let!(Expr::Catch(..) = **init_expr);
});
});