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) {
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(),