Fill in missing cfgs
diff --git a/src/gen/fold.rs b/src/gen/fold.rs
index c9f349e..66f1b30 100644
--- a/src/gen/fold.rs
+++ b/src/gen/fold.rs
@@ -10,8 +10,10 @@
 #![cfg_attr(feature = "cargo-clippy", allow(needless_pass_by_value))]
 
 use *;
+#[cfg(any(feature = "full", feature = "derive"))]
 use token::{Brace, Bracket, Paren, Group};
 use proc_macro2::Span;
+#[cfg(any(feature = "full", feature = "derive"))]
 use gen::helper::fold::*;
 
 
@@ -20,7 +22,7 @@
     ($e:expr) => { $e }
 }
 
-#[cfg(not(feature = "full"))]
+#[cfg(all(feature = "derive", not(feature = "full")))]
 macro_rules! full {
     ($e:expr) => { unreachable!() }
 }
@@ -69,15 +71,15 @@
 fn fold_bound_lifetimes(&mut self, i: BoundLifetimes) -> BoundLifetimes { fold_bound_lifetimes(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn fold_const_param(&mut self, i: ConstParam) -> ConstParam { fold_const_param(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn fold_data(&mut self, i: Data) -> Data { fold_data(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn fold_data_enum(&mut self, i: DataEnum) -> DataEnum { fold_data_enum(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn fold_data_struct(&mut self, i: DataStruct) -> DataStruct { fold_data_struct(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn fold_data_union(&mut self, i: DataUnion) -> DataUnion { fold_data_union(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn fold_derive_input(&mut self, i: DeriveInput) -> DeriveInput { fold_derive_input(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn fold_expr(&mut self, i: Expr) -> Expr { fold_expr(self, i) }
@@ -432,6 +434,7 @@
 }
 
 fold_span_only!(fold_ident: Ident);
+#[cfg(any(feature = "full", feature = "derive"))]
 fold_span_only!(fold_lifetime: Lifetime);
 #[cfg(any(feature = "full", feature = "derive"))]
 fold_span_only!(fold_lit_byte: LitByte);
@@ -728,7 +731,7 @@
         default: (_i . default).map(|it| { _visitor.fold_expr(it) }),
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn fold_data<V: Folder + ?Sized>(_visitor: &mut V, _i: Data) -> Data {
     match _i {
         Data::Struct(_binding_0, ) => {
@@ -748,7 +751,7 @@
         }
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn fold_data_enum<V: Folder + ?Sized>(_visitor: &mut V, _i: DataEnum) -> DataEnum {
     DataEnum {
         enum_token: Token ! [ enum ](tokens_helper(_visitor, &(_i . enum_token).0)),
@@ -756,7 +759,7 @@
         variants: FoldHelper::lift(_i . variants, |it| { _visitor.fold_variant(it) }),
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn fold_data_struct<V: Folder + ?Sized>(_visitor: &mut V, _i: DataStruct) -> DataStruct {
     DataStruct {
         struct_token: Token ! [ struct ](tokens_helper(_visitor, &(_i . struct_token).0)),
@@ -764,14 +767,14 @@
         semi_token: (_i . semi_token).map(|it| { Token ! [ ; ](tokens_helper(_visitor, &(it).0)) }),
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn fold_data_union<V: Folder + ?Sized>(_visitor: &mut V, _i: DataUnion) -> DataUnion {
     DataUnion {
         union_token: Token ! [ union ](tokens_helper(_visitor, &(_i . union_token).0)),
         fields: _visitor.fold_fields_named(_i . fields),
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn fold_derive_input<V: Folder + ?Sized>(_visitor: &mut V, _i: DeriveInput) -> DeriveInput {
     DeriveInput {
         attrs: FoldHelper::lift(_i . attrs, |it| { _visitor.fold_attribute(it) }),
diff --git a/src/gen/visit.rs b/src/gen/visit.rs
index aaf9377..dde7ea5 100644
--- a/src/gen/visit.rs
+++ b/src/gen/visit.rs
@@ -10,8 +10,10 @@
 #![cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
 
 use *;
+#[cfg(any(feature = "full", feature = "derive"))]
 use punctuated::Punctuated;
 use proc_macro2::Span;
+#[cfg(any(feature = "full", feature = "derive"))]
 use gen::helper::visit::*;
 
 
@@ -20,7 +22,7 @@
     ($e:expr) => { $e }
 }
 
-#[cfg(not(feature = "full"))]
+#[cfg(all(feature = "derive", not(feature = "full")))]
 macro_rules! full {
     ($e:expr) => { unreachable!() }
 }
@@ -66,15 +68,15 @@
 fn visit_bound_lifetimes(&mut self, i: &'ast BoundLifetimes) { visit_bound_lifetimes(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn visit_const_param(&mut self, i: &'ast ConstParam) { visit_const_param(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data(&mut self, i: &'ast Data) { visit_data(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_enum(&mut self, i: &'ast DataEnum) { visit_data_enum(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_struct(&mut self, i: &'ast DataStruct) { visit_data_struct(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_union(&mut self, i: &'ast DataUnion) { visit_data_union(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_derive_input(&mut self, i: &'ast DeriveInput) { visit_derive_input(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn visit_expr(&mut self, i: &'ast Expr) { visit_expr(self, i) }
@@ -615,7 +617,7 @@
     if let Some(ref it) = _i . eq_token { tokens_helper(_visitor, &(it).0) };
     if let Some(ref it) = _i . default { _visitor.visit_expr(it) };
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast Data) {
     match *_i {
         Data::Struct(ref _binding_0, ) => {
@@ -629,24 +631,24 @@
         }
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_enum<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast DataEnum) {
     tokens_helper(_visitor, &(& _i . enum_token).0);
     tokens_helper(_visitor, &(& _i . brace_token).0);
     for el in Punctuated::elements(& _i . variants) { let it = el.item(); _visitor.visit_variant(it) };
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_struct<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast DataStruct) {
     tokens_helper(_visitor, &(& _i . struct_token).0);
     _visitor.visit_fields(& _i . fields);
     if let Some(ref it) = _i . semi_token { tokens_helper(_visitor, &(it).0) };
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_union<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast DataUnion) {
     tokens_helper(_visitor, &(& _i . union_token).0);
     _visitor.visit_fields_named(& _i . fields);
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_derive_input<'ast, V: Visitor<'ast> + ?Sized>(_visitor: &mut V, _i: &'ast DeriveInput) {
     for it in & _i . attrs { _visitor.visit_attribute(it) };
     _visitor.visit_visibility(& _i . vis);
diff --git a/src/gen/visit_mut.rs b/src/gen/visit_mut.rs
index a15936d..302dee6 100644
--- a/src/gen/visit_mut.rs
+++ b/src/gen/visit_mut.rs
@@ -10,8 +10,10 @@
 #![cfg_attr(feature = "cargo-clippy", allow(match_same_arms))]
 
 use *;
+#[cfg(any(feature = "full", feature = "derive"))]
 use punctuated::Punctuated;
 use proc_macro2::Span;
+#[cfg(any(feature = "full", feature = "derive"))]
 use gen::helper::visit_mut::*;
 
 
@@ -20,7 +22,7 @@
     ($e:expr) => { $e }
 }
 
-#[cfg(not(feature = "full"))]
+#[cfg(all(feature = "derive", not(feature = "full")))]
 macro_rules! full {
     ($e:expr) => { unreachable!() }
 }
@@ -66,15 +68,15 @@
 fn visit_bound_lifetimes_mut(&mut self, i: &mut BoundLifetimes) { visit_bound_lifetimes_mut(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn visit_const_param_mut(&mut self, i: &mut ConstParam) { visit_const_param_mut(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_mut(&mut self, i: &mut Data) { visit_data_mut(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_enum_mut(&mut self, i: &mut DataEnum) { visit_data_enum_mut(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_struct_mut(&mut self, i: &mut DataStruct) { visit_data_struct_mut(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_data_union_mut(&mut self, i: &mut DataUnion) { visit_data_union_mut(self, i) }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 fn visit_derive_input_mut(&mut self, i: &mut DeriveInput) { visit_derive_input_mut(self, i) }
 # [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
 fn visit_expr_mut(&mut self, i: &mut Expr) { visit_expr_mut(self, i) }
@@ -615,7 +617,7 @@
     if let Some(ref mut it) = _i . eq_token { tokens_helper(_visitor, &mut (it).0) };
     if let Some(ref mut it) = _i . default { _visitor.visit_expr_mut(it) };
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut Data) {
     match *_i {
         Data::Struct(ref mut _binding_0, ) => {
@@ -629,24 +631,24 @@
         }
     }
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_enum_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut DataEnum) {
     tokens_helper(_visitor, &mut (& mut _i . enum_token).0);
     tokens_helper(_visitor, &mut (& mut _i . brace_token).0);
     for mut el in Punctuated::elements_mut(& mut _i . variants) { let it = el.item_mut(); _visitor.visit_variant_mut(it) };
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_struct_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut DataStruct) {
     tokens_helper(_visitor, &mut (& mut _i . struct_token).0);
     _visitor.visit_fields_mut(& mut _i . fields);
     if let Some(ref mut it) = _i . semi_token { tokens_helper(_visitor, &mut (it).0) };
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_data_union_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut DataUnion) {
     tokens_helper(_visitor, &mut (& mut _i . union_token).0);
     _visitor.visit_fields_named_mut(& mut _i . fields);
 }
-# [ cfg ( any ( feature = "full" , feature = "derive" ) ) ]
+# [ cfg ( feature = "derive" ) ]
 pub fn visit_derive_input_mut<V: VisitorMut + ?Sized>(_visitor: &mut V, _i: &mut DeriveInput) {
     for it in & mut _i . attrs { _visitor.visit_attribute_mut(it) };
     _visitor.visit_visibility_mut(& mut _i . vis);
diff --git a/src/lib.rs b/src/lib.rs
index 30d46df..f73939e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -136,6 +136,7 @@
     #[cfg(feature = "fold")]
     pub mod fold;
 
+    #[cfg(any(feature = "full", feature = "derive"))]
     #[path = "../gen_helper.rs"]
     mod helper;
 }
diff --git a/src/macros.rs b/src/macros.rs
index d8fb4b8..9925d17 100644
--- a/src/macros.rs
+++ b/src/macros.rs
@@ -164,7 +164,7 @@
     ($($rest:tt)*) => (ast_struct! { $($rest)* });
 }
 
-#[cfg(feature = "parsing")]
+#[cfg(all(feature = "parsing", any(feature = "full", feature = "derive")))]
 macro_rules! impl_synom {
     ($t:ident $description:tt $($parser:tt)+) => {
         impl Synom for $t {