Flatten ImplItem into an enum
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index 7bfbbc1..31e7e7a 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -208,7 +208,7 @@
 # [ cfg ( feature = "full" ) ]
 fn fold_impl_item_const(&mut self, i: ImplItemConst) -> ImplItemConst { fold_impl_item_const(self, i) }
 # [ cfg ( feature = "full" ) ]
-fn fold_impl_item_kind(&mut self, i: ImplItemKind) -> ImplItemKind { fold_impl_item_kind(self, i) }
+fn fold_impl_item_macro(&mut self, i: ImplItemMacro) -> ImplItemMacro { fold_impl_item_macro(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn fold_impl_item_method(&mut self, i: ImplItemMethod) -> ImplItemMethod { fold_impl_item_method(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -1444,28 +1444,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn fold_impl_item<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItem) -> ImplItem {
-    ImplItem {
-        attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
-        node: _visitor.fold_impl_item_kind(_i . node),
-    }
-}
-# [ cfg ( feature = "full" ) ]
-pub fn fold_impl_item_const<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItemConst) -> ImplItemConst {
-    ImplItemConst {
-        vis: _visitor.fold_visibility(_i . vis),
-        defaultness: _visitor.fold_defaultness(_i . defaultness),
-        const_token: _i . const_token,
-        ident: _i . ident,
-        colon_token: _i . colon_token,
-        ty: _visitor.fold_ty(_i . ty),
-        eq_token: _i . eq_token,
-        expr: _visitor.fold_expr(_i . expr),
-        semi_token: _i . semi_token,
-    }
-}
-# [ cfg ( feature = "full" ) ]
-pub fn fold_impl_item_kind<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItemKind) -> ImplItemKind {
-    use ::ImplItemKind::*;
+    use ::ImplItem::*;
     match _i {
         Const(_binding_0, ) => {
             Const (
@@ -1484,14 +1463,37 @@
         }
         Macro(_binding_0, ) => {
             Macro (
-                _visitor.fold_macro(_binding_0),
+                _visitor.fold_impl_item_macro(_binding_0),
             )
         }
     }
 }
 # [ cfg ( feature = "full" ) ]
+pub fn fold_impl_item_const<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItemConst) -> ImplItemConst {
+    ImplItemConst {
+        attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
+        vis: _visitor.fold_visibility(_i . vis),
+        defaultness: _visitor.fold_defaultness(_i . defaultness),
+        const_token: _i . const_token,
+        ident: _i . ident,
+        colon_token: _i . colon_token,
+        ty: _visitor.fold_ty(_i . ty),
+        eq_token: _i . eq_token,
+        expr: _visitor.fold_expr(_i . expr),
+        semi_token: _i . semi_token,
+    }
+}
+# [ cfg ( feature = "full" ) ]
+pub fn fold_impl_item_macro<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItemMacro) -> ImplItemMacro {
+    ImplItemMacro {
+        attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
+        mac: _visitor.fold_macro(_i . mac),
+    }
+}
+# [ cfg ( feature = "full" ) ]
 pub fn fold_impl_item_method<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItemMethod) -> ImplItemMethod {
     ImplItemMethod {
+        attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
         defaultness: _visitor.fold_defaultness(_i . defaultness),
         sig: _visitor.fold_method_sig(_i . sig),
@@ -1501,6 +1503,7 @@
 # [ cfg ( feature = "full" ) ]
 pub fn fold_impl_item_type<V: Folder + ?Sized>(_visitor: &mut V, _i: ImplItemType) -> ImplItemType {
     ImplItemType {
+        attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
         vis: _visitor.fold_visibility(_i . vis),
         defaultness: _visitor.fold_defaultness(_i . defaultness),
         type_token: _i . type_token,
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index 6f7e5d7..4b3019a 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -181,7 +181,7 @@
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item_const(&mut self, i: &ImplItemConst) { visit_impl_item_const(self, i) }
 # [ cfg ( feature = "full" ) ]
-fn visit_impl_item_kind(&mut self, i: &ImplItemKind) { visit_impl_item_kind(self, i) }
+fn visit_impl_item_macro(&mut self, i: &ImplItemMacro) { visit_impl_item_macro(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item_method(&mut self, i: &ImplItemMethod) { visit_impl_item_method(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -1127,24 +1127,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItem) {
-    for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
-    _visitor.visit_impl_item_kind(&_i . node);
-}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_impl_item_const<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItemConst) {
-    _visitor.visit_visibility(&_i . vis);
-    _visitor.visit_defaultness(&_i . defaultness);
-    // Skipped field _i . const_token;
-    // Skipped field _i . ident;
-    // Skipped field _i . colon_token;
-    _visitor.visit_ty(&_i . ty);
-    // Skipped field _i . eq_token;
-    _visitor.visit_expr(&_i . expr);
-    // Skipped field _i . semi_token;
-}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_impl_item_kind<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItemKind) {
-    use ::ImplItemKind::*;
+    use ::ImplItem::*;
     match *_i {
         Const(ref _binding_0, ) => {
             _visitor.visit_impl_item_const(&* _binding_0);
@@ -1156,12 +1139,31 @@
             _visitor.visit_impl_item_type(&* _binding_0);
         }
         Macro(ref _binding_0, ) => {
-            _visitor.visit_macro(&* _binding_0);
+            _visitor.visit_impl_item_macro(&* _binding_0);
         }
     }
 }
 # [ cfg ( feature = "full" ) ]
+pub fn visit_impl_item_const<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItemConst) {
+    for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
+    _visitor.visit_visibility(&_i . vis);
+    _visitor.visit_defaultness(&_i . defaultness);
+    // Skipped field _i . const_token;
+    // Skipped field _i . ident;
+    // Skipped field _i . colon_token;
+    _visitor.visit_ty(&_i . ty);
+    // Skipped field _i . eq_token;
+    _visitor.visit_expr(&_i . expr);
+    // Skipped field _i . semi_token;
+}
+# [ cfg ( feature = "full" ) ]
+pub fn visit_impl_item_macro<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItemMacro) {
+    for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
+    _visitor.visit_macro(&_i . mac);
+}
+# [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_method<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItemMethod) {
+    for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     _visitor.visit_defaultness(&_i . defaultness);
     _visitor.visit_method_sig(&_i . sig);
@@ -1169,6 +1171,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_type<V: Visitor + ?Sized>(_visitor: &mut V, _i: &ImplItemType) {
+    for it in (_i . attrs).iter() { _visitor.visit_attribute(&it) };
     _visitor.visit_visibility(&_i . vis);
     _visitor.visit_defaultness(&_i . defaultness);
     // Skipped field _i . type_token;
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index 874d29f..45425fa 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -181,7 +181,7 @@
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item_const_mut(&mut self, i: &mut ImplItemConst) { visit_impl_item_const_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
-fn visit_impl_item_kind_mut(&mut self, i: &mut ImplItemKind) { visit_impl_item_kind_mut(self, i) }
+fn visit_impl_item_macro_mut(&mut self, i: &mut ImplItemMacro) { visit_impl_item_macro_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
 fn visit_impl_item_method_mut(&mut self, i: &mut ImplItemMethod) { visit_impl_item_method_mut(self, i) }
 # [ cfg ( feature = "full" ) ]
@@ -1127,24 +1127,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItem) {
-    for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
-    _visitor.visit_impl_item_kind_mut(&mut _i . node);
-}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_impl_item_const_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemConst) {
-    _visitor.visit_visibility_mut(&mut _i . vis);
-    _visitor.visit_defaultness_mut(&mut _i . defaultness);
-    // Skipped field _i . const_token;
-    // Skipped field _i . ident;
-    // Skipped field _i . colon_token;
-    _visitor.visit_ty_mut(&mut _i . ty);
-    // Skipped field _i . eq_token;
-    _visitor.visit_expr_mut(&mut _i . expr);
-    // Skipped field _i . semi_token;
-}
-# [ cfg ( feature = "full" ) ]
-pub fn visit_impl_item_kind_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemKind) {
-    use ::ImplItemKind::*;
+    use ::ImplItem::*;
     match *_i {
         Const(ref mut _binding_0, ) => {
             _visitor.visit_impl_item_const_mut(&mut * _binding_0);
@@ -1156,12 +1139,31 @@
             _visitor.visit_impl_item_type_mut(&mut * _binding_0);
         }
         Macro(ref mut _binding_0, ) => {
-            _visitor.visit_macro_mut(&mut * _binding_0);
+            _visitor.visit_impl_item_macro_mut(&mut * _binding_0);
         }
     }
 }
 # [ cfg ( feature = "full" ) ]
+pub fn visit_impl_item_const_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemConst) {
+    for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
+    _visitor.visit_visibility_mut(&mut _i . vis);
+    _visitor.visit_defaultness_mut(&mut _i . defaultness);
+    // Skipped field _i . const_token;
+    // Skipped field _i . ident;
+    // Skipped field _i . colon_token;
+    _visitor.visit_ty_mut(&mut _i . ty);
+    // Skipped field _i . eq_token;
+    _visitor.visit_expr_mut(&mut _i . expr);
+    // Skipped field _i . semi_token;
+}
+# [ cfg ( feature = "full" ) ]
+pub fn visit_impl_item_macro_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemMacro) {
+    for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
+    _visitor.visit_macro_mut(&mut _i . mac);
+}
+# [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_method_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemMethod) {
+    for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
     _visitor.visit_visibility_mut(&mut _i . vis);
     _visitor.visit_defaultness_mut(&mut _i . defaultness);
     _visitor.visit_method_sig_mut(&mut _i . sig);
@@ -1169,6 +1171,7 @@
 }
 # [ cfg ( feature = "full" ) ]
 pub fn visit_impl_item_type_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut ImplItemType) {
+    for mut it in (_i . attrs).iter_mut() { _visitor.visit_attribute_mut(&mut it) };
     _visitor.visit_visibility_mut(&mut _i . vis);
     _visitor.visit_defaultness_mut(&mut _i . defaultness);
     // Skipped field _i . type_token;
diff --git a/src/item.rs b/src/item.rs
index 0416b95..4226720 100644
--- a/src/item.rs
+++ b/src/item.rs
@@ -349,16 +349,10 @@
     }
 }
 
-ast_struct! {
-    pub struct ImplItem {
-        pub attrs: Vec<Attribute>,
-        pub node: ImplItemKind,
-    }
-}
-
 ast_enum_of_structs! {
-    pub enum ImplItemKind {
+    pub enum ImplItem {
         pub Const(ImplItemConst {
+            pub attrs: Vec<Attribute>,
             pub vis: Visibility,
             pub defaultness: Defaultness,
             pub const_token: tokens::Const,
@@ -370,12 +364,14 @@
             pub semi_token: tokens::Semi,
         }),
         pub Method(ImplItemMethod {
+            pub attrs: Vec<Attribute>,
             pub vis: Visibility,
             pub defaultness: Defaultness,
             pub sig: MethodSig,
             pub block: Block,
         }),
         pub Type(ImplItemType {
+            pub attrs: Vec<Attribute>,
             pub vis: Visibility,
             pub defaultness: Defaultness,
             pub type_token: tokens::Type,
@@ -384,10 +380,11 @@
             pub ty: Ty,
             pub semi_token: tokens::Semi,
         }),
-        pub Macro(Macro),
+        pub Macro(ImplItemMacro {
+            pub attrs: Vec<Attribute>,
+            pub mac: Macro,
+        }),
     }
-
-    do_not_generate_to_tokens
 }
 
 ast_struct! {
@@ -1144,19 +1141,17 @@
         })
     ));
 
-    impl Synom for ImplItem {
-        named!(parse -> Self, alt!(
-            impl_item_const
-            |
-            impl_item_method
-            |
-            impl_item_type
-            |
-            impl_item_mac
-        ));
-    }
+    impl_synom!(ImplItem "item in impl block" alt!(
+        syn!(ImplItemConst) => { ImplItem::Const }
+        |
+        syn!(ImplItemMethod) => { ImplItem::Method }
+        |
+        syn!(ImplItemType) => { ImplItem::Type }
+        |
+        syn!(ImplItemMacro) => { ImplItem::Macro }
+    ));
 
-    named!(impl_item_const -> ImplItem, do_parse!(
+    impl_synom!(ImplItemConst "const item in impl block" do_parse!(
         attrs: many0!(call!(Attribute::parse_outer)) >>
         vis: syn!(Visibility) >>
         defaultness: syn!(Defaultness) >>
@@ -1167,23 +1162,21 @@
         eq: syn!(Eq) >>
         value: syn!(Expr) >>
         semi: syn!(Semi) >>
-        (ImplItem {
+        (ImplItemConst {
             attrs: attrs,
-            node: ImplItemConst {
-                vis: vis,
-                defaultness: defaultness,
-                const_token: const_,
-                ident: ident,
-                colon_token: colon,
-                ty: ty,
-                eq_token: eq,
-                expr: value,
-                semi_token: semi,
-            }.into(),
+            vis: vis,
+            defaultness: defaultness,
+            const_token: const_,
+            ident: ident,
+            colon_token: colon,
+            ty: ty,
+            eq_token: eq,
+            expr: value,
+            semi_token: semi,
         })
     ));
 
-    named!(impl_item_method -> ImplItem, do_parse!(
+    impl_synom!(ImplItemMethod "method in impl block" do_parse!(
         outer_attrs: many0!(call!(Attribute::parse_outer)) >>
         vis: syn!(Visibility) >>
         defaultness: syn!(Defaultness) >>
@@ -1200,42 +1193,40 @@
             many0!(call!(Attribute::parse_inner)),
             call!(Block::parse_within)
         )) >>
-        (ImplItem {
+        (ImplItemMethod {
             attrs: {
                 let mut attrs = outer_attrs;
                 attrs.extend((inner_attrs_stmts.0).0);
                 attrs
             },
-            node: ImplItemMethod {
-                vis: vis,
-                defaultness: defaultness,
-                sig: MethodSig {
-                    constness: constness,
-                    unsafety: unsafety,
-                    abi: abi,
-                    ident: ident,
-                    decl: FnDecl {
-                        fn_token: fn_,
-                        paren_token: inputs.1,
-                        inputs: inputs.0,
-                        output: ret,
-                        variadic: false,
-                        generics: Generics {
-                            where_clause: where_clause,
-                            .. generics
-                        },
-                        dot_tokens: None,
+            vis: vis,
+            defaultness: defaultness,
+            sig: MethodSig {
+                constness: constness,
+                unsafety: unsafety,
+                abi: abi,
+                ident: ident,
+                decl: FnDecl {
+                    fn_token: fn_,
+                    paren_token: inputs.1,
+                    inputs: inputs.0,
+                    output: ret,
+                    variadic: false,
+                    generics: Generics {
+                        where_clause: where_clause,
+                        .. generics
                     },
+                    dot_tokens: None,
                 },
-                block: Block {
-                    brace_token: inner_attrs_stmts.1,
-                    stmts: (inner_attrs_stmts.0).1,
-                },
-            }.into(),
+            },
+            block: Block {
+                brace_token: inner_attrs_stmts.1,
+                stmts: (inner_attrs_stmts.0).1,
+            },
         })
     ));
 
-    named!(impl_item_type -> ImplItem, do_parse!(
+    impl_synom!(ImplItemType "type in impl block" do_parse!(
         attrs: many0!(call!(Attribute::parse_outer)) >>
         vis: syn!(Visibility) >>
         defaultness: syn!(Defaultness) >>
@@ -1244,27 +1235,25 @@
         eq: syn!(Eq) >>
         ty: syn!(Ty) >>
         semi: syn!(Semi) >>
-        (ImplItem {
+        (ImplItemType {
             attrs: attrs,
-            node: ImplItemType {
-                vis: vis,
-                defaultness: defaultness,
-                type_token: type_,
-                ident: ident,
-                eq_token: eq,
-                ty: ty,
-                semi_token: semi,
-            }.into(),
+            vis: vis,
+            defaultness: defaultness,
+            type_token: type_,
+            ident: ident,
+            eq_token: eq,
+            ty: ty,
+            semi_token: semi,
         })
     ));
 
-    named!(impl_item_mac -> ImplItem, do_parse!(
+    impl_synom!(ImplItemMacro "macro in impl block" do_parse!(
         attrs: many0!(call!(Attribute::parse_outer)) >>
         mac: syn!(Macro) >>
         cond!(!mac.is_braced(), syn!(Semi)) >>
-        (ImplItem {
+        (ImplItemMacro {
             attrs: attrs,
-            node: ImplItemKind::Macro(mac),
+            mac: mac,
         })
     ));
 
@@ -1584,46 +1573,54 @@
         }
     }
 
-    impl ToTokens for ImplItem {
+    impl ToTokens for ImplItemConst {
         fn to_tokens(&self, tokens: &mut Tokens) {
             tokens.append_all(self.attrs.outer());
-            match self.node {
-                ImplItemKind::Const(ref item) => {
-                    item.vis.to_tokens(tokens);
-                    item.defaultness.to_tokens(tokens);
-                    item.const_token.to_tokens(tokens);
-                    item.ident.to_tokens(tokens);
-                    item.colon_token.to_tokens(tokens);
-                    item.ty.to_tokens(tokens);
-                    item.eq_token.to_tokens(tokens);
-                    item.expr.to_tokens(tokens);
-                    item.semi_token.to_tokens(tokens);
-                }
-                ImplItemKind::Method(ref item) => {
-                    item.vis.to_tokens(tokens);
-                    item.defaultness.to_tokens(tokens);
-                    item.sig.to_tokens(tokens);
-                    item.block.brace_token.surround(tokens, |tokens| {
-                        tokens.append_all(self.attrs.inner());
-                        tokens.append_all(&item.block.stmts);
-                    });
-                }
-                ImplItemKind::Type(ref item) => {
-                    item.vis.to_tokens(tokens);
-                    item.defaultness.to_tokens(tokens);
-                    item.type_token.to_tokens(tokens);
-                    item.ident.to_tokens(tokens);
-                    item.eq_token.to_tokens(tokens);
-                    item.ty.to_tokens(tokens);
-                    item.semi_token.to_tokens(tokens);
-                }
-                ImplItemKind::Macro(ref mac) => {
-                    mac.to_tokens(tokens);
-                    if !mac.is_braced() {
-                        // FIXME needs a span
-                        tokens::Semi::default().to_tokens(tokens);
-                    }
-                }
+            self.vis.to_tokens(tokens);
+            self.defaultness.to_tokens(tokens);
+            self.const_token.to_tokens(tokens);
+            self.ident.to_tokens(tokens);
+            self.colon_token.to_tokens(tokens);
+            self.ty.to_tokens(tokens);
+            self.eq_token.to_tokens(tokens);
+            self.expr.to_tokens(tokens);
+            self.semi_token.to_tokens(tokens);
+        }
+    }
+
+    impl ToTokens for ImplItemMethod {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            tokens.append_all(self.attrs.outer());
+            self.vis.to_tokens(tokens);
+            self.defaultness.to_tokens(tokens);
+            self.sig.to_tokens(tokens);
+            self.block.brace_token.surround(tokens, |tokens| {
+                tokens.append_all(self.attrs.inner());
+                tokens.append_all(&self.block.stmts);
+            });
+        }
+    }
+
+    impl ToTokens for ImplItemType {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            tokens.append_all(self.attrs.outer());
+            self.vis.to_tokens(tokens);
+            self.defaultness.to_tokens(tokens);
+            self.type_token.to_tokens(tokens);
+            self.ident.to_tokens(tokens);
+            self.eq_token.to_tokens(tokens);
+            self.ty.to_tokens(tokens);
+            self.semi_token.to_tokens(tokens);
+        }
+    }
+
+    impl ToTokens for ImplItemMacro {
+        fn to_tokens(&self, tokens: &mut Tokens) {
+            tokens.append_all(self.attrs.outer());
+            self.mac.to_tokens(tokens);
+            if !self.mac.is_braced() {
+                // FIXME needs a span
+                tokens::Semi::default().to_tokens(tokens);
             }
         }
     }
diff --git a/src/lib.rs b/src/lib.rs
index 5fc447e..19e5998 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -53,13 +53,13 @@
 mod item;
 #[cfg(feature = "full")]
 pub use item::{Constness, Defaultness, FnArg, FnDecl, ForeignItem, ItemForeignMod,
-               ImplItem, ImplItemKind, ImplPolarity, Item, MethodSig, PathListItem,
+               ImplItem, ImplPolarity, Item, MethodSig, PathListItem,
                TraitItem, ViewPath, ItemExternCrate, ItemUse,
                ItemStatic, ItemConst, ItemFn, ItemMacro, ItemMod, ItemTy, ItemEnum,
                ItemStruct, ItemUnion, ItemTrait, ItemDefaultImpl, ItemImpl,
                PathSimple, PathGlob, PathList, ForeignItemFn, ForeignItemStatic,
                TraitItemConst, TraitItemMacro, TraitItemMethod, TraitItemType,
-               ImplItemConst, ImplItemMethod, ImplItemType, ArgSelfRef,
+               ImplItemConst, ImplItemMacro, ImplItemMethod, ImplItemType, ArgSelfRef,
                ArgSelf, ArgCaptured};
 
 #[cfg(feature = "full")]