Handle codegen features in one place
diff --git a/codegen/src/fold.rs b/codegen/src/fold.rs
index 9d55384..7cadf20 100644
--- a/codegen/src/fold.rs
+++ b/codegen/src/fold.rs
@@ -96,17 +96,7 @@
     }
 }
 
-fn visit_features(features: &Features) -> TokenStream {
-    let features = &features.any;
-    match features.len() {
-        0 => quote!(),
-        1 => quote!(#[cfg(feature = #(#features)*)]),
-        _ => quote!(#[cfg(any(#(feature = #features),*))]),
-    }
-}
-
 fn node(traits: &mut TokenStream, impls: &mut TokenStream, s: &Node, defs: &Definitions) {
-    let features = visit_features(&s.features);
     let under_name = gen::under_name(&s.ident);
     let ty = Ident::new(&s.ident, Span::call_site());
     let fold_fn = Ident::new(&format!("fold_{}", under_name), Span::call_site());
@@ -221,14 +211,12 @@
     }
 
     traits.extend(quote! {
-        #features
         fn #fold_fn(&mut self, i: #ty) -> #ty {
             #fold_fn(self, i)
         }
     });
 
     impls.extend(quote! {
-        #features
         pub fn #fold_fn<V: Fold + ?Sized>(
             _visitor: &mut V, _i: #ty
         ) -> #ty {
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index 62de202..db033f9 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -1,5 +1,6 @@
 use inflections::Inflect;
 use proc_macro2::{Ident, Span, TokenStream};
+use quote::quote;
 use syn_codegen::{Data, Features, Definitions, Node};
 
 pub const TERMINAL_TYPES: &[&str] = &["Span", "Ident"];
@@ -15,6 +16,14 @@
     let mut traits = TokenStream::new();
     let mut impls = TokenStream::new();
     for s in &defs.types {
+        let features = &s.features.any;
+        let features = match features.len() {
+            0 => quote!(),
+            1 => quote!(#[cfg(feature = #(#features)*)]),
+            _ => quote!(#[cfg(any(#(feature = #features),*))]),
+        };
+        traits.extend(features.clone());
+        impls.extend(features);
         node(&mut traits, &mut impls, s, defs);
     }
     for tt in TERMINAL_TYPES {
diff --git a/codegen/src/visit.rs b/codegen/src/visit.rs
index 6d47d47..988045d 100644
--- a/codegen/src/visit.rs
+++ b/codegen/src/visit.rs
@@ -112,17 +112,7 @@
     }
 }
 
-fn visit_features(features: &Features) -> TokenStream {
-    let features = &features.any;
-    match features.len() {
-        0 => quote!(),
-        1 => quote!(#[cfg(feature = #(#features)*)]),
-        _ => quote!(#[cfg(any(#(feature = #features),*))]),
-    }
-}
-
 fn node(traits: &mut TokenStream, impls: &mut TokenStream, s: &Node, defs: &Definitions) {
-    let features = visit_features(&s.features);
     let under_name = gen::under_name(&s.ident);
     let ty = Ident::new(&s.ident, Span::call_site());
     let visit_fn = Ident::new(&format!("visit_{}", under_name), Span::call_site());
@@ -191,14 +181,12 @@
     }
 
     traits.extend(quote! {
-        #features
         fn #visit_fn(&mut self, i: &'ast #ty) {
             #visit_fn(self, i)
         }
     });
 
     impls.extend(quote! {
-        #features
         pub fn #visit_fn<'ast, V: Visit<'ast> + ?Sized>(
             _visitor: &mut V, _i: &'ast #ty
         ) {
diff --git a/codegen/src/visit_mut.rs b/codegen/src/visit_mut.rs
index 7355349..2202aad 100644
--- a/codegen/src/visit_mut.rs
+++ b/codegen/src/visit_mut.rs
@@ -112,17 +112,7 @@
     }
 }
 
-fn visit_features(features: &Features) -> TokenStream {
-    let features = &features.any;
-    match features.len() {
-        0 => quote!(),
-        1 => quote!(#[cfg(feature = #(#features)*)]),
-        _ => quote!(#[cfg(any(#(feature = #features),*))]),
-    }
-}
-
 fn node(traits: &mut TokenStream, impls: &mut TokenStream, s: &Node, defs: &Definitions) {
-    let features = visit_features(&s.features);
     let under_name = gen::under_name(&s.ident);
     let ty = Ident::new(&s.ident, Span::call_site());
     let visit_mut_fn = Ident::new(&format!("visit_{}_mut", under_name), Span::call_site());
@@ -191,14 +181,12 @@
     }
 
     traits.extend(quote! {
-        #features
         fn #visit_mut_fn(&mut self, i: &mut #ty) {
             #visit_mut_fn(self, i)
         }
     });
 
     impls.extend(quote! {
-        #features
         pub fn #visit_mut_fn<V: VisitMut + ?Sized>(
             _visitor: &mut V, _i: &mut #ty
         ) {