Remove empty VisInherited type
diff --git a/src/data.rs b/src/data.rs
index 3a7c025..e872fb9 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -100,7 +100,7 @@
         }),
 
         /// Inherited, i.e. private.
-        pub Inherited(VisInherited {}),
+        pub Inherited,
     }
 }
 
@@ -195,7 +195,7 @@
                 })
             } }
             |
-            epsilon!() => { |_| Visibility::Inherited(VisInherited {}) }
+            epsilon!() => { |_| Visibility::Inherited }
         ));
     }
 }
@@ -273,8 +273,4 @@
             });
         }
     }
-
-    impl ToTokens for VisInherited {
-        fn to_tokens(&self, _tokens: &mut Tokens) {}
-    }
 }
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 09ec5ca..4c54cb3 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -378,8 +378,6 @@
 
 fn fold_vis_crate(&mut self, i: VisCrate) -> VisCrate { fold_vis_crate(self, i) }
 
-fn fold_vis_inherited(&mut self, i: VisInherited) -> VisInherited { fold_vis_inherited(self, i) }
-
 fn fold_vis_public(&mut self, i: VisPublic) -> VisPublic { fold_vis_public(self, i) }
 
 fn fold_vis_restricted(&mut self, i: VisRestricted) -> VisRestricted { fold_vis_restricted(self, i) }
@@ -2729,11 +2727,6 @@
     }
 }
 
-pub fn fold_vis_inherited<V: Folder + ?Sized>(_visitor: &mut V, _i: VisInherited) -> VisInherited {
-    VisInherited {
-    }
-}
-
 pub fn fold_vis_public<V: Folder + ?Sized>(_visitor: &mut V, _i: VisPublic) -> VisPublic {
     VisPublic {
         pub_token: Token ! [ pub ](tokens_helper(_visitor, &(_i . pub_token).0)),
@@ -2767,11 +2760,7 @@
                 _visitor.fold_vis_restricted(_binding_0),
             )
         }
-        Inherited(_binding_0, ) => {
-            Inherited (
-                _visitor.fold_vis_inherited(_binding_0),
-            )
-        }
+        Inherited => { Inherited }
     }
 }
 
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index e63cffb..0963158 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -374,8 +374,6 @@
 
 fn visit_vis_crate(&mut self, i: &'ast VisCrate) { visit_vis_crate(self, i) }
 
-fn visit_vis_inherited(&mut self, i: &'ast VisInherited) { visit_vis_inherited(self, i) }
-
 fn visit_vis_public(&mut self, i: &'ast VisPublic) { visit_vis_public(self, i) }
 
 fn visit_vis_restricted(&mut self, i: &'ast VisRestricted) { visit_vis_restricted(self, i) }
@@ -2108,9 +2106,6 @@
     tokens_helper(_visitor, &(& _i . crate_token).0);
 }
 
-pub fn visit_vis_inherited<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast VisInherited) {
-}
-
 pub fn visit_vis_public<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast VisPublic) {
     tokens_helper(_visitor, &(& _i . pub_token).0);
 }
@@ -2134,9 +2129,7 @@
         Restricted(ref _binding_0, ) => {
             _visitor.visit_vis_restricted(_binding_0);
         }
-        Inherited(ref _binding_0, ) => {
-            _visitor.visit_vis_inherited(_binding_0);
-        }
+        Inherited => { }
     }
 }
 
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 44a4a2e..ac36821 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -374,8 +374,6 @@
 
 fn visit_vis_crate_mut(&mut self, i: &mut VisCrate) { visit_vis_crate_mut(self, i) }
 
-fn visit_vis_inherited_mut(&mut self, i: &mut VisInherited) { visit_vis_inherited_mut(self, i) }
-
 fn visit_vis_public_mut(&mut self, i: &mut VisPublic) { visit_vis_public_mut(self, i) }
 
 fn visit_vis_restricted_mut(&mut self, i: &mut VisRestricted) { visit_vis_restricted_mut(self, i) }
@@ -2108,9 +2106,6 @@
     tokens_helper(_visitor, &mut (& mut _i . crate_token).0);
 }
 
-pub fn visit_vis_inherited_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut VisInherited) {
-}
-
 pub fn visit_vis_public_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut VisPublic) {
     tokens_helper(_visitor, &mut (& mut _i . pub_token).0);
 }
@@ -2134,9 +2129,7 @@
         Restricted(ref mut _binding_0, ) => {
             _visitor.visit_vis_restricted_mut(_binding_0);
         }
-        Inherited(ref mut _binding_0, ) => {
-            _visitor.visit_vis_inherited_mut(_binding_0);
-        }
+        Inherited => { }
     }
 }
 
diff --git a/src/lib.rs b/src/lib.rs
index a8c4a39..8fd6e0a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -30,8 +30,7 @@
 pub use attr::{AttrStyle, Attribute, MetaItem, MetaItemList, MetaNameValue, NestedMetaItem};
 
 mod data;
-pub use data::{Field, Variant, VariantData, VisCrate, VisInherited, VisPublic, VisRestricted,
-               Visibility};
+pub use data::{Field, Variant, VariantData, VisCrate, VisPublic, VisRestricted, Visibility};
 
 mod expr;
 pub use expr::{Expr, ExprAddrOf, ExprArray, ExprAssign, ExprAssignOp, ExprBinary, ExprBlock,
diff --git a/src/macros.rs b/src/macros.rs
index 1710444..9b73717 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -59,7 +59,7 @@
         pub enum $name:ident {
             $(
                 $(#[$variant_attr:meta])*
-                pub $variant:ident($member:ident $($rest:tt)*),
+                pub $variant:ident $( ($member:ident $($rest:tt)*) )*,
             )*
         }
 
@@ -70,7 +70,7 @@
             pub enum $name {
                 $(
                     $(#[$variant_attr])*
-                    $variant($member),
+                    $variant $( ($member) )*,
                 )*
             }
         }
@@ -78,20 +78,26 @@
         $(
             maybe_ast_struct! {
                 $(#[$variant_attr])*
-                pub struct $member $($rest)*
+                $(
+                    pub struct $member $($rest)*
+                )*
             }
 
-            impl From<$member> for $name {
-                fn from(e: $member) -> $name {
-                    $name::$variant(e)
+            $(
+                impl From<$member> for $name {
+                    fn from(e: $member) -> $name {
+                        $name::$variant(e)
+                    }
                 }
-            }
+            )*
         )*
 
         #[cfg(feature = "printing")]
         generate_to_tokens! {
             $($remaining)*
-            enum $name { $($variant [$($rest)*],)* }
+            ()
+            tokens
+            $name { $($variant $( [$($rest)*] )*,)* }
         }
     )
 }
@@ -100,18 +106,29 @@
 macro_rules! generate_to_tokens {
     (do_not_generate_to_tokens $($foo:tt)*) => ();
 
-    (enum $name:ident { $($variant:ident [$($rest:tt)*],)* }) => (
+    (($($arms:tt)*) $tokens:ident $name:ident { $variant:ident, $($next:tt)*}) => {
+        generate_to_tokens!(
+            ($($arms)* $name::$variant => {})
+            $tokens $name { $($next)* }
+        );
+    };
+
+    (($($arms:tt)*) $tokens:ident $name:ident { $variant:ident [$($rest:tt)*], $($next:tt)*}) => {
+        generate_to_tokens!(
+            ($($arms)* $name::$variant(ref _e) => to_tokens_call!(_e, $tokens, $($rest)*),)
+            $tokens $name { $($next)* }
+        );
+    };
+
+    (($($arms:tt)*) $tokens:ident $name:ident {}) => {
         impl ::quote::ToTokens for $name {
-            fn to_tokens(&self, tokens: &mut ::quote::Tokens) {
+            fn to_tokens(&self, $tokens: &mut ::quote::Tokens) {
                 match *self {
-                    $(
-                        $name::$variant(ref _e) =>
-                            to_tokens_call!(_e, tokens, $($rest)*),
-                    )*
+                    $($arms)*
                 }
             }
         }
-    );
+    };
 }
 
 #[cfg(all(feature = "printing", feature = "full"))]
@@ -135,7 +152,9 @@
 macro_rules! maybe_ast_struct {
     (
         $(#[$attr:meta])*
-        pub struct $name:ident
+        $(
+            pub struct $name:ident
+        )*
     ) => ();
 
     ($($rest:tt)*) => (ast_struct! { $($rest)* });
diff --git a/syn_codegen/src/main.rs b/syn_codegen/src/main.rs
index 3624655..68ac85b 100644
--- a/syn_codegen/src/main.rs
+++ b/syn_codegen/src/main.rs
@@ -245,23 +245,23 @@
     // A single variant of an ast_enum_of_structs!
     struct EosVariant {
         name: Ident,
-        member: Path,
+        member: Option<Path>,
         inner: Option<AstItem>,
     }
     named!(eos_variant -> EosVariant, do_parse!(
         many0!(Attribute::parse_outer) >>
         keyword!(pub) >>
         variant: syn!(Ident) >>
-        member: map!(parens!(alt!(
+        member: option!(map!(parens!(alt!(
             call!(ast_struct_inner) => { |x: AstItem| (Path::from(x.ast.ident), Some(x)) }
             |
             syn!(Path) => { |x| (x, None) }
-        )), |x| x.0) >>
+        )), |x| x.0)) >>
         punct!(,) >>
         (EosVariant {
             name: variant,
-            member: member.0,
-            inner: member.1,
+            member: member.clone().map(|x| x.0),
+            inner: member.map(|x| x.1).unwrap_or_default(),
         })
     ));
 
@@ -281,8 +281,10 @@
                 let enum_item = {
                     let variants = body.0.iter().map(|v| {
                         let name = v.name;
-                        let member = &v.member;
-                        quote!(#name(#member))
+                        match v.member {
+                            Some(ref member) => quote!(#name(#member)),
+                            None => quote!(#name),
+                        }
                     });
                     parse_tokens::<DeriveInput>(quote! {
                         pub enum #id { #(#variants),* }
diff --git a/tests/test_derive_input.rs b/tests/test_derive_input.rs
index 4462b1c..a1eebdd 100644
--- a/tests/test_derive_input.rs
+++ b/tests/test_derive_input.rs
@@ -43,7 +43,7 @@
 
     let expected = DeriveInput {
         ident: "Unit".into(),
-        vis: Visibility::Inherited(VisInherited {}),
+        vis: Visibility::Inherited,
         attrs: Vec::new(),
         generics: Generics::default(),
         body: Body::Struct(BodyStruct {
@@ -234,7 +234,7 @@
                             Field {
                                 colon_token: None,
                                 ident: None,
-                                vis: Visibility::Inherited(VisInherited {}),
+                                vis: Visibility::Inherited,
                                 attrs: Vec::new(),
                                 ty: TypePath {
                                     qself: None,
@@ -255,7 +255,7 @@
                             Field {
                                 ident: None,
                                 colon_token: None,
-                                vis: Visibility::Inherited(VisInherited {}),
+                                vis: Visibility::Inherited,
                                 attrs: Vec::new(),
                                 ty: TypePath {
                                     qself: None,
@@ -361,7 +361,7 @@
 
     let expected = DeriveInput {
         ident: "Dummy".into(),
-        vis: Visibility::Inherited(VisInherited {}),
+        vis: Visibility::Inherited,
         attrs: vec![
             Attribute {
                 bracket_token: Default::default(),
@@ -423,7 +423,7 @@
 
     let expected = DeriveInput {
         ident: "S".into(),
-        vis: Visibility::Inherited(VisInherited {}),
+        vis: Visibility::Inherited,
         attrs: vec![
             Attribute {
                 bracket_token: Default::default(),
@@ -461,7 +461,7 @@
 
     let expected = DeriveInput {
         ident: "S".into(),
-        vis: Visibility::Inherited(VisInherited {}),
+        vis: Visibility::Inherited,
         attrs: vec![
             Attribute {
                 bracket_token: Default::default(),