Factor out full macro
diff --git a/codegen/src/fold.rs b/codegen/src/fold.rs
index 3122473..3bc0036 100644
--- a/codegen/src/fold.rs
+++ b/codegen/src/fold.rs
@@ -1,4 +1,4 @@
-use crate::file;
+use crate::{file, full};
 use quote::quote;
 use syn_codegen as types;
 
@@ -328,22 +328,7 @@
         codegen::generate(&mut state, &s, defs);
     }
 
-    let full_macro = quote! {
-        #[cfg(feature = "full")]
-        macro_rules! full {
-            ($e:expr) => {
-                $e
-            };
-        }
-
-        #[cfg(all(feature = "derive", not(feature = "full")))]
-        macro_rules! full {
-            ($e:expr) => {
-                unreachable!()
-            };
-        }
-    };
-
+    let full_macro = full::get_macro();
     let fold_trait = state.fold_trait;
     let fold_impl = state.fold_impl;
     file::write(
diff --git a/codegen/src/full.rs b/codegen/src/full.rs
new file mode 100644
index 0000000..a410031
--- /dev/null
+++ b/codegen/src/full.rs
@@ -0,0 +1,20 @@
+use proc_macro2::TokenStream;
+use quote::quote;
+
+pub fn get_macro() -> TokenStream {
+    quote! {
+        #[cfg(feature = "full")]
+        macro_rules! full {
+            ($e:expr) => {
+                $e
+            };
+        }
+
+        #[cfg(all(feature = "derive", not(feature = "full")))]
+        macro_rules! full {
+            ($e:expr) => {
+                unreachable!()
+            };
+        }
+    }
+}
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index 8fd5cf9..d80782b 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -14,6 +14,7 @@
 
 mod file;
 mod fold;
+mod full;
 mod json;
 mod parse;
 mod version;
diff --git a/codegen/src/visit.rs b/codegen/src/visit.rs
index c13e95d..b16130e 100644
--- a/codegen/src/visit.rs
+++ b/codegen/src/visit.rs
@@ -1,4 +1,4 @@
-use crate::file;
+use crate::{file, full};
 use quote::quote;
 use syn_codegen as types;
 
@@ -329,29 +329,7 @@
         codegen::generate(&mut state, &s, defs);
     }
 
-    let full_macro = quote! {
-        #[cfg(feature = "full")]
-        macro_rules! full {
-            ($e:expr) => {
-                $e
-            };
-        }
-
-        #[cfg(all(feature = "derive", not(feature = "full")))]
-        macro_rules! full {
-            ($e:expr) => {
-                unreachable!()
-            };
-        }
-    };
-
-    let skip_macro = quote! {
-        #[cfg(any(feature = "full", feature = "derive"))]
-        macro_rules! skip {
-            ($($tt:tt)*) => {};
-        }
-    };
-
+    let full_macro = full::get_macro();
     let visit_trait = state.visit_trait;
     let visit_impl = state.visit_impl;
     file::write(
@@ -367,7 +345,11 @@
             use gen::helper::visit::*;
 
             #full_macro
-            #skip_macro
+
+            #[cfg(any(feature = "full", feature = "derive"))]
+            macro_rules! skip {
+                ($($tt:tt)*) => {};
+            }
 
             /// Syntax tree traversal to walk a shared borrow of a syntax tree.
             ///
diff --git a/codegen/src/visit_mut.rs b/codegen/src/visit_mut.rs
index f293765..9ac6ebf 100644
--- a/codegen/src/visit_mut.rs
+++ b/codegen/src/visit_mut.rs
@@ -1,4 +1,4 @@
-use crate::file;
+use crate::{file, full};
 use quote::quote;
 use syn_codegen as types;
 
@@ -329,29 +329,7 @@
         codegen::generate(&mut state, &s, defs);
     }
 
-    let full_macro = quote! {
-        #[cfg(feature = "full")]
-        macro_rules! full {
-            ($e:expr) => {
-                $e
-            };
-        }
-
-        #[cfg(all(feature = "derive", not(feature = "full")))]
-        macro_rules! full {
-            ($e:expr) => {
-                unreachable!()
-            };
-        }
-    };
-
-    let skip_macro = quote! {
-        #[cfg(any(feature = "full", feature = "derive"))]
-        macro_rules! skip {
-            ($($tt:tt)*) => {};
-        }
-    };
-
+    let full_macro = full::get_macro();
     let visit_mut_trait = state.visit_mut_trait;
     let visit_mut_impl = state.visit_mut_impl;
     file::write(
@@ -365,7 +343,11 @@
             use gen::helper::visit_mut::*;
 
             #full_macro
-            #skip_macro
+
+            #[cfg(any(feature = "full", feature = "derive"))]
+            macro_rules! skip {
+                ($($tt:tt)*) => {};
+            }
 
             /// Syntax tree traversal to mutate an exclusive borrow of a syntax tree in
             /// place.