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")]