Flatten discriminant into one field
diff --git a/src/data.rs b/src/data.rs
index e872fb9..a860ce4 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -13,10 +13,8 @@
/// Type of variant.
pub data: VariantData,
- pub eq_token: Option<Token![=]>,
-
/// Explicit discriminant, e.g. `Foo = 1`
- pub discriminant: Option<Expr>,
+ pub discriminant: Option<(Token![=], Expr)>,
}
}
@@ -210,8 +208,8 @@
tokens.append_all(&self.attrs);
self.ident.to_tokens(tokens);
self.data.to_tokens(tokens);
- if let Some(ref disc) = self.discriminant {
- TokensOrDefault(&self.eq_token).to_tokens(tokens);
+ if let Some((ref eq_token, ref disc)) = self.discriminant {
+ eq_token.to_tokens(tokens);
disc.to_tokens(tokens);
}
}
diff --git a/src/derive.rs b/src/derive.rs
index edadba2..5442a7c 100644
--- a/src/derive.rs
+++ b/src/derive.rs
@@ -136,17 +136,12 @@
|
epsilon!() => { |_| VariantData::Unit }
) >>
- disr: option!(do_parse!(
- eq: punct!(=) >>
- disr: syn!(Expr) >>
- (eq, disr)
- )) >>
+ disr: option!(tuple!(punct!(=), syn!(Expr))) >>
(Variant {
ident: id,
attrs: attrs,
data: data,
- eq_token: disr.as_ref().map(|p| Token.0)),
- discriminant: disr.map(|p| p.1),
+ discriminant: disr,
})
));
}
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 4c54cb3..3c7cefc 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -2695,8 +2695,10 @@
attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
ident: _visitor.fold_ident(_i . ident),
data: _visitor.fold_variant_data(_i . data),
- eq_token: (_i . eq_token).map(|it| { Token ! [ = ](tokens_helper(_visitor, &(it).0)) }),
- discriminant: (_i . discriminant).map(|it| { _visitor.fold_expr(it) }),
+ discriminant: (_i . discriminant).map(|it| { (
+ Token ! [ = ](tokens_helper(_visitor, &(( it ) . 0).0)),
+ _visitor.fold_expr(( it ) . 1),
+ ) }),
}
}
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 0963158..63f6ae9 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -2081,8 +2081,10 @@
for it in & _i . attrs { _visitor.visit_attribute(it) };
_visitor.visit_ident(& _i . ident);
_visitor.visit_variant_data(& _i . data);
- if let Some(ref it) = _i . eq_token { tokens_helper(_visitor, &(it).0) };
- if let Some(ref it) = _i . discriminant { _visitor.visit_expr(it) };
+ if let Some(ref it) = _i . discriminant {
+ tokens_helper(_visitor, &(& ( it ) . 0).0);
+ _visitor.visit_expr(& ( it ) . 1);
+ };
}
pub fn visit_variant_data<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast VariantData) {
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index ac36821..f9117f2 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -2081,8 +2081,10 @@
for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
_visitor.visit_ident_mut(& mut _i . ident);
_visitor.visit_variant_data_mut(& mut _i . data);
- if let Some(ref mut it) = _i . eq_token { tokens_helper(_visitor, &mut (it).0) };
- if let Some(ref mut it) = _i . discriminant { _visitor.visit_expr_mut(it) };
+ if let Some(ref mut it) = _i . discriminant {
+ tokens_helper(_visitor, &mut (& mut ( it ) . 0).0);
+ _visitor.visit_expr_mut(& mut ( it ) . 1);
+ };
}
pub fn visit_variant_data_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut VariantData) {
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index a1eebdd..34c88bb 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -228,7 +228,6 @@
Variant {
ident: "Ok".into(),
attrs: Vec::new(),
- eq_token: None,
data: VariantData::Tuple(
vec![
Field {
@@ -249,7 +248,6 @@
Variant {
ident: "Err".into(),
attrs: Vec::new(),
- eq_token: None,
data: VariantData::Tuple(
vec![
Field {
@@ -271,52 +269,56 @@
ident: "Surprise".into(),
attrs: Vec::new(),
data: VariantData::Unit,
- eq_token: Some(Default::default()),
- discriminant: Some(Expr {
- node: Lit {
- value: LitKind::Other(Literal::isize(0)),
- span: Default::default(),
- }.into(),
- attrs: Vec::new(),
- }),
+ discriminant: Some((
+ Default::default(),
+ Expr {
+ node: Lit {
+ value: LitKind::Other(Literal::isize(0)),
+ span: Default::default(),
+ }.into(),
+ attrs: Vec::new(),
+ },
+ )),
},
Variant {
ident: "ProcMacroHack".into(),
attrs: Vec::new(),
data: VariantData::Unit,
- eq_token: Some(Default::default()),
- discriminant: Some(Expr {
- node: ExprField {
- base: Box::new(Expr {
- node: ExprTuple {
- paren_token: Default::default(),
- args: vec![
- Expr {
- node: ExprKind::Lit(Lit {
- value: LitKind::Other(Literal::integer(0)),
- span: Default::default(),
- }),
- attrs: Vec::new(),
- },
- Expr {
- node: ExprKind::Lit(Lit {
- value: LitKind::Other(Literal::string("data")),
- span: Default::default(),
- }),
- attrs: Vec::new(),
- },
- ].into(),
- }.into(),
- attrs: Vec::new(),
- }),
- dot_token: Default::default(),
- member: Member::Unnamed(Index {
- index: 0,
- span: Default::default(),
- }),
- }.into(),
- attrs: Vec::new(),
- }),
+ discriminant: Some((
+ Default::default(),
+ Expr {
+ node: ExprField {
+ base: Box::new(Expr {
+ node: ExprTuple {
+ paren_token: Default::default(),
+ args: vec![
+ Expr {
+ node: ExprKind::Lit(Lit {
+ value: LitKind::Other(Literal::integer(0)),
+ span: Default::default(),
+ }),
+ attrs: Vec::new(),
+ },
+ Expr {
+ node: ExprKind::Lit(Lit {
+ value: LitKind::Other(Literal::string("data")),
+ span: Default::default(),
+ }),
+ attrs: Vec::new(),
+ },
+ ].into(),
+ }.into(),
+ attrs: Vec::new(),
+ }),
+ dot_token: Default::default(),
+ member: Member::Unnamed(Index {
+ index: 0,
+ span: Default::default(),
+ }),
+ }.into(),
+ attrs: Vec::new(),
+ },
+ )),
},
].into(),
brace_token: Default::default(),