Reorganize DeriveInput
diff --git a/src/item.rs b/src/item.rs
index 3305678..0fa91ea 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -110,6 +110,18 @@
             pub ty: Box<Type>,
             pub semi_token: Token![;],
         }),
+        /// A struct definition (`struct` or `pub struct`).
+        ///
+        /// E.g. `struct Foo<A> { x: A }`
+        pub Struct(ItemStruct {
+            pub attrs: Vec<Attribute>,
+            pub vis: Visibility,
+            pub struct_token: Token![struct],
+            pub ident: Ident,
+            pub generics: Generics,
+            pub fields: Fields,
+            pub semi_token: Option<Token![;]>,
+        }),
         /// An enum definition (`enum` or `pub enum`).
         ///
         /// E.g. `enum Foo<A, B> { C<A>, D<B> }`
@@ -122,18 +134,6 @@
             pub brace_token: token::Brace,
             pub variants: Delimited<Variant, Token![,]>,
         }),
-        /// A struct definition (`struct` or `pub struct`).
-        ///
-        /// E.g. `struct Foo<A> { x: A }`
-        pub Struct(ItemStruct {
-            pub attrs: Vec<Attribute>,
-            pub vis: Visibility,
-            pub struct_token: Token![struct],
-            pub ident: Ident,
-            pub generics: Generics,
-            pub data: VariantData,
-            pub semi_token: Option<Token![;]>,
-        }),
         /// A union definition (`union` or `pub union`).
         ///
         /// E.g. `union Foo<A, B> { x: A, y: B }`
@@ -143,7 +143,7 @@
             pub union_token: Token![union],
             pub ident: Ident,
             pub generics: Generics,
-            pub data: VariantData,
+            pub fields: FieldsNamed,
         }),
         /// A Trait declaration (`trait` or `pub trait`).
         ///
@@ -256,8 +256,17 @@
 
 impl From<DeriveInput> for Item {
     fn from(input: DeriveInput) -> Item {
-        match input.body {
-            Body::Enum(data) => Item::Enum(ItemEnum {
+        match input.data {
+            Data::Struct(data) => Item::Struct(ItemStruct {
+                attrs: input.attrs,
+                vis: input.vis,
+                struct_token: data.struct_token,
+                ident: input.ident,
+                generics: input.generics,
+                fields: data.fields,
+                semi_token: data.semi_token,
+            }),
+            Data::Enum(data) => Item::Enum(ItemEnum {
                 attrs: input.attrs,
                 vis: input.vis,
                 enum_token: data.enum_token,
@@ -266,14 +275,13 @@
                 brace_token: data.brace_token,
                 variants: data.variants,
             }),
-            Body::Struct(data) => Item::Struct(ItemStruct {
+            Data::Union(data) => Item::Union(ItemUnion {
                 attrs: input.attrs,
                 vis: input.vis,
-                struct_token: data.struct_token,
+                union_token: data.union_token,
                 ident: input.ident,
                 generics: input.generics,
-                data: data.data,
-                semi_token: data.semi_token,
+                fields: data.fields,
             }),
         }
     }
@@ -1026,8 +1034,7 @@
         ident: syn!(Ident) >>
         generics: syn!(Generics) >>
         where_clause: option!(syn!(WhereClause)) >>
-        fields: braces!(call!(Delimited::parse_terminated_with,
-                              Field::parse_struct)) >>
+        fields: syn!(FieldsNamed) >>
         (ItemUnion {
             attrs: attrs,
             vis: vis,
@@ -1037,7 +1044,7 @@
                 where_clause: where_clause,
                 .. generics
             },
-            data: VariantData::Struct(fields.0, fields.1),
+            fields: fields,
         })
     ));
 
@@ -1379,7 +1386,6 @@
 mod printing {
     use super::*;
     use attr::FilterAttrs;
-    use data::VariantData;
     use quote::{ToTokens, Tokens};
 
     impl ToTokens for ItemExternCrate {
@@ -1515,17 +1521,17 @@
             self.struct_token.to_tokens(tokens);
             self.ident.to_tokens(tokens);
             self.generics.to_tokens(tokens);
-            match self.data {
-                VariantData::Struct(..) => {
+            match self.fields {
+                Fields::Named(ref fields) => {
                     self.generics.where_clause.to_tokens(tokens);
-                    self.data.to_tokens(tokens);
+                    fields.to_tokens(tokens);
                 }
-                VariantData::Tuple(..) => {
-                    self.data.to_tokens(tokens);
+                Fields::Unnamed(ref fields) => {
+                    fields.to_tokens(tokens);
                     self.generics.where_clause.to_tokens(tokens);
                     TokensOrDefault(&self.semi_token).to_tokens(tokens);
                 }
-                VariantData::Unit => {
+                Fields::Unit => {
                     self.generics.where_clause.to_tokens(tokens);
                     TokensOrDefault(&self.semi_token).to_tokens(tokens);
                 }
@@ -1541,9 +1547,7 @@
             self.ident.to_tokens(tokens);
             self.generics.to_tokens(tokens);
             self.generics.where_clause.to_tokens(tokens);
-            // XXX: Should we handle / complain when using a
-            // non-VariantData::Struct Variant in Union?
-            self.data.to_tokens(tokens);
+            self.fields.to_tokens(tokens);
         }
     }