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![=]((p.0).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) {