Remove codegen State types
diff --git a/codegen/src/fold.rs b/codegen/src/fold.rs
index 87d4beb..9d55384 100644
--- a/codegen/src/fold.rs
+++ b/codegen/src/fold.rs
@@ -6,12 +6,6 @@
 
 const FOLD_SRC: &str = "../src/gen/fold.rs";
 
-#[derive(Default)]
-struct State {
-    fold_trait: TokenStream,
-    fold_impl: TokenStream,
-}
-
 fn simple_visit(item: &str, name: &TokenStream) -> TokenStream {
     let ident = gen::under_name(item);
     let method = Ident::new(&format!("fold_{}", ident), Span::call_site());
@@ -111,7 +105,7 @@
     }
 }
 
-fn node(state: &mut State, s: &Node, defs: &Definitions) {
+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());
@@ -226,14 +220,14 @@
         };
     }
 
-    state.fold_trait.extend(quote! {
+    traits.extend(quote! {
         #features
         fn #fold_fn(&mut self, i: #ty) -> #ty {
             #fold_fn(self, i)
         }
     });
 
-    state.fold_impl.extend(quote! {
+    impls.extend(quote! {
         #features
         pub fn #fold_fn<V: Fold + ?Sized>(
             _visitor: &mut V, _i: #ty
@@ -244,10 +238,8 @@
 }
 
 pub fn generate(defs: &Definitions) {
-    let state = gen::traverse(defs, node);
+    let (traits, impls) = gen::traverse(defs, node);
     let full_macro = full::get_macro();
-    let fold_trait = state.fold_trait;
-    let fold_impl = state.fold_impl;
     file::write(
         FOLD_SRC,
         quote! {
@@ -271,10 +263,10 @@
             ///
             /// *This trait is available if Syn is built with the `"fold"` feature.*
             pub trait Fold {
-                #fold_trait
+                #traits
             }
 
-            #fold_impl
+            #impls
         },
     );
 }
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index fd77d0d..62de202 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -1,6 +1,6 @@
 use inflections::Inflect;
-use proc_macro2::{Ident, Span};
-use syn_codegen as types;
+use proc_macro2::{Ident, Span, TokenStream};
+use syn_codegen::{Data, Features, Definitions, Node};
 
 pub const TERMINAL_TYPES: &[&str] = &["Span", "Ident"];
 
@@ -8,22 +8,22 @@
     Ident::new(&name.to_snake_case(), Span::call_site())
 }
 
-pub fn traverse<S, F>(defs: &types::Definitions, node: F) -> S
-where
-    S: Default,
-    F: Fn(&mut S, &types::Node, &types::Definitions),
-{
-    let mut state = S::default();
+pub fn traverse(
+    defs: &Definitions,
+    node: fn(&mut TokenStream, &mut TokenStream, &Node, &Definitions),
+) -> (TokenStream, TokenStream) {
+    let mut traits = TokenStream::new();
+    let mut impls = TokenStream::new();
     for s in &defs.types {
-        node(&mut state, s, defs);
+        node(&mut traits, &mut impls, s, defs);
     }
     for tt in TERMINAL_TYPES {
-        let s = types::Node {
+        let s = Node {
             ident: tt.to_string(),
-            features: types::Features::default(),
-            data: types::Data::Private,
+            features: Features::default(),
+            data: Data::Private,
         };
-        node(&mut state, &s, defs);
+        node(&mut traits, &mut impls, &s, defs);
     }
-    state
+    (traits, impls)
 }
diff --git a/codegen/src/visit.rs b/codegen/src/visit.rs
index 2a18244..6d47d47 100644
--- a/codegen/src/visit.rs
+++ b/codegen/src/visit.rs
@@ -7,12 +7,6 @@
 
 const VISIT_SRC: &str = "../src/gen/visit.rs";
 
-#[derive(Default)]
-struct State {
-    visit_trait: TokenStream,
-    visit_impl: TokenStream,
-}
-
 fn simple_visit(item: &str, name: &Operand) -> TokenStream {
     let ident = gen::under_name(item);
     let method = Ident::new(&format!("visit_{}", ident), Span::call_site());
@@ -127,7 +121,7 @@
     }
 }
 
-fn node(state: &mut State, s: &Node, defs: &Definitions) {
+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());
@@ -196,14 +190,14 @@
         Data::Private => {}
     }
 
-    state.visit_trait.extend(quote! {
+    traits.extend(quote! {
         #features
         fn #visit_fn(&mut self, i: &'ast #ty) {
             #visit_fn(self, i)
         }
     });
 
-    state.visit_impl.extend(quote! {
+    impls.extend(quote! {
         #features
         pub fn #visit_fn<'ast, V: Visit<'ast> + ?Sized>(
             _visitor: &mut V, _i: &'ast #ty
@@ -214,10 +208,8 @@
 }
 
 pub fn generate(defs: &Definitions) {
-    let state = gen::traverse(defs, node);
+    let (traits, impls) = gen::traverse(defs, node);
     let full_macro = full::get_macro();
-    let visit_trait = state.visit_trait;
-    let visit_impl = state.visit_impl;
     file::write(
         VISIT_SRC,
         quote! {
@@ -245,10 +237,10 @@
             ///
             /// *This trait is available if Syn is built with the `"visit"` feature.*
             pub trait Visit<'ast> {
-                #visit_trait
+                #traits
             }
 
-            #visit_impl
+            #impls
         },
     );
 }
diff --git a/codegen/src/visit_mut.rs b/codegen/src/visit_mut.rs
index 25c98ef..7355349 100644
--- a/codegen/src/visit_mut.rs
+++ b/codegen/src/visit_mut.rs
@@ -7,12 +7,6 @@
 
 const VISIT_MUT_SRC: &str = "../src/gen/visit_mut.rs";
 
-#[derive(Default)]
-struct State {
-    visit_mut_trait: TokenStream,
-    visit_mut_impl: TokenStream,
-}
-
 fn simple_visit(item: &str, name: &Operand) -> TokenStream {
     let ident = gen::under_name(item);
     let method = Ident::new(&format!("visit_{}_mut", ident), Span::call_site());
@@ -127,7 +121,7 @@
     }
 }
 
-fn node(state: &mut State, s: &Node, defs: &Definitions) {
+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());
@@ -196,14 +190,14 @@
         Data::Private => {}
     }
 
-    state.visit_mut_trait.extend(quote! {
+    traits.extend(quote! {
         #features
         fn #visit_mut_fn(&mut self, i: &mut #ty) {
             #visit_mut_fn(self, i)
         }
     });
 
-    state.visit_mut_impl.extend(quote! {
+    impls.extend(quote! {
         #features
         pub fn #visit_mut_fn<V: VisitMut + ?Sized>(
             _visitor: &mut V, _i: &mut #ty
@@ -214,10 +208,8 @@
 }
 
 pub fn generate(defs: &Definitions) {
-    let state = gen::traverse(defs, node);
+    let (traits, impls) = gen::traverse(defs, node);
     let full_macro = full::get_macro();
-    let visit_mut_trait = state.visit_mut_trait;
-    let visit_mut_impl = state.visit_mut_impl;
     file::write(
         VISIT_MUT_SRC,
         quote! {
@@ -244,10 +236,10 @@
             ///
             /// *This trait is available if Syn is built with the `"visit-mut"` feature.*
             pub trait VisitMut {
-                #visit_mut_trait
+                #traits
             }
 
-            #visit_mut_impl
+            #impls
         },
     );
 }