Use consistent imports in codegen crate
diff --git a/codegen/src/fold.rs b/codegen/src/fold.rs
index e0f49d1..d1e1e54 100644
--- a/codegen/src/fold.rs
+++ b/codegen/src/fold.rs
@@ -1,8 +1,8 @@
 use crate::{file, full, gen};
-use proc_macro2::{Span, TokenStream};
+use proc_macro2::{Ident, Span, TokenStream};
 use quote::{quote, TokenStreamExt};
-use syn::*;
-use syn_codegen as types;
+use syn::Index;
+use syn_codegen::{Data, Definitions, Features, Node, Type};
 
 const FOLD_SRC: &str = "../src/gen/fold.rs";
 
@@ -21,40 +21,40 @@
 }
 
 fn visit(
-    ty: &types::Type,
-    features: &types::Features,
-    defs: &types::Definitions,
+    ty: &Type,
+    features: &Features,
+    defs: &Definitions,
     name: &TokenStream,
 ) -> Option<TokenStream> {
     match ty {
-        types::Type::Box(t) => {
+        Type::Box(t) => {
             let res = visit(t, features, defs, &quote!(*#name))?;
             Some(quote! {
                 Box::new(#res)
             })
         }
-        types::Type::Vec(t) => {
+        Type::Vec(t) => {
             let operand = quote!(it);
             let val = visit(t, features, defs, &operand)?;
             Some(quote! {
                 FoldHelper::lift(#name, |it| { #val })
             })
         }
-        types::Type::Punctuated(p) => {
+        Type::Punctuated(p) => {
             let operand = quote!(it);
             let val = visit(&p.element, features, defs, &operand)?;
             Some(quote! {
                 FoldHelper::lift(#name, |it| { #val })
             })
         }
-        types::Type::Option(t) => {
+        Type::Option(t) => {
             let it = quote!(it);
             let val = visit(t, features, defs, &it)?;
             Some(quote! {
                 (#name).map(|it| { #val })
             })
         }
-        types::Type::Tuple(t) => {
+        Type::Tuple(t) => {
             let mut code = TokenStream::new();
             for (i, elem) in t.iter().enumerate() {
                 let i = Index::from(i);
@@ -67,7 +67,7 @@
                 (#code)
             })
         }
-        types::Type::Token(t) => {
+        Type::Token(t) => {
             let repr = &defs.tokens[t];
             let is_keyword = repr.chars().next().unwrap().is_alphabetic();
             let spans = if is_keyword {
@@ -80,14 +80,14 @@
                 #ty(tokens_helper(_visitor, &#name.#spans))
             })
         }
-        types::Type::Group(t) => {
+        Type::Group(t) => {
             let ty = Ident::new(t, Span::call_site());
             Some(quote! {
                 #ty(tokens_helper(_visitor, &#name.span))
             })
         }
-        types::Type::Syn(t) => {
-            fn requires_full(features: &types::Features) -> bool {
+        Type::Syn(t) => {
+            fn requires_full(features: &Features) -> bool {
                 features.any.contains("full") && features.any.len() == 1
             }
             let mut res = simple_visit(t, name);
@@ -97,12 +97,12 @@
             }
             Some(res)
         }
-        types::Type::Ext(t) if gen::TERMINAL_TYPES.contains(&&t[..]) => Some(simple_visit(t, name)),
-        types::Type::Ext(_) | types::Type::Std(_) => None,
+        Type::Ext(t) if gen::TERMINAL_TYPES.contains(&&t[..]) => Some(simple_visit(t, name)),
+        Type::Ext(_) | Type::Std(_) => None,
     }
 }
 
-fn visit_features(features: &types::Features) -> TokenStream {
+fn visit_features(features: &Features) -> TokenStream {
     let features = &features.any;
     match features.len() {
         0 => quote!(),
@@ -111,7 +111,7 @@
     }
 }
 
-fn node(state: &mut State, s: &types::Node, defs: &types::Definitions) {
+fn node(state: &mut State, 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());
@@ -120,7 +120,7 @@
     let mut fold_impl = TokenStream::new();
 
     match &s.data {
-        types::Data::Enum(variants) => {
+        Data::Enum(variants) => {
             let mut fold_variants = TokenStream::new();
 
             for (variant, fields) in variants {
@@ -169,7 +169,7 @@
                 }
             });
         }
-        types::Data::Struct(fields) => {
+        Data::Struct(fields) => {
             let mut fold_fields = TokenStream::new();
 
             for (field, ty) in fields {
@@ -201,7 +201,7 @@
                 });
             }
         }
-        types::Data::Private => {
+        Data::Private => {
             if ty == "Ident" {
                 fold_impl.append_all(quote! {
                     let mut _i = _i;
@@ -216,8 +216,8 @@
     }
 
     let include_fold_impl = match &s.data {
-        types::Data::Private => gen::TERMINAL_TYPES.contains(&s.ident.as_str()),
-        types::Data::Struct(_) | types::Data::Enum(_) => true,
+        Data::Private => gen::TERMINAL_TYPES.contains(&s.ident.as_str()),
+        Data::Struct(_) | Data::Enum(_) => true,
     };
 
     state.fold_trait.append_all(quote! {
@@ -239,7 +239,7 @@
     }
 }
 
-pub fn generate(defs: &types::Definitions) {
+pub fn generate(defs: &Definitions) {
     let state = gen::traverse(defs, node);
     let full_macro = full::get_macro();
     let fold_trait = state.fold_trait;
diff --git a/codegen/src/visit.rs b/codegen/src/visit.rs
index 15888d1..7300220 100644
--- a/codegen/src/visit.rs
+++ b/codegen/src/visit.rs
@@ -1,9 +1,9 @@
-use crate::operand::*;
+use crate::operand::{Borrowed, Operand, Owned};
 use crate::{file, full, gen};
-use proc_macro2::{Span, TokenStream};
+use proc_macro2::{Ident, Span, TokenStream};
 use quote::{quote, TokenStreamExt};
-use syn::*;
-use syn_codegen as types;
+use syn::Index;
+use syn_codegen::{Data, Definitions, Features, Node, Type};
 
 const VISIT_SRC: &str = "../src/gen/visit.rs";
 
@@ -30,17 +30,17 @@
 }
 
 fn visit(
-    ty: &types::Type,
-    features: &types::Features,
-    defs: &types::Definitions,
+    ty: &Type,
+    features: &Features,
+    defs: &Definitions,
     name: &Operand,
 ) -> Option<TokenStream> {
     match ty {
-        types::Type::Box(t) => {
+        Type::Box(t) => {
             let name = name.owned_tokens();
             visit(t, features, defs, &Owned(quote!(*#name)))
         }
-        types::Type::Vec(t) => {
+        Type::Vec(t) => {
             let operand = Borrowed(quote!(it));
             let val = visit(t, features, defs, &operand)?;
             let name = name.ref_tokens();
@@ -50,7 +50,7 @@
                 }
             })
         }
-        types::Type::Punctuated(p) => {
+        Type::Punctuated(p) => {
             let operand = Borrowed(quote!(it));
             let val = visit(&p.element, features, defs, &operand)?;
             let name = name.ref_tokens();
@@ -61,7 +61,7 @@
                 }
             })
         }
-        types::Type::Option(t) => {
+        Type::Option(t) => {
             let it = Borrowed(quote!(it));
             let val = visit(t, features, defs, &it)?;
             let name = name.owned_tokens();
@@ -71,7 +71,7 @@
                 }
             })
         }
-        types::Type::Tuple(t) => {
+        Type::Tuple(t) => {
             let mut code = TokenStream::new();
             for (i, elem) in t.iter().enumerate() {
                 let name = name.tokens();
@@ -83,7 +83,7 @@
             }
             Some(code)
         }
-        types::Type::Token(t) => {
+        Type::Token(t) => {
             let name = name.tokens();
             let repr = &defs.tokens[t];
             let is_keyword = repr.chars().next().unwrap().is_alphabetic();
@@ -96,14 +96,14 @@
                 tokens_helper(_visitor, &#name.#spans)
             })
         }
-        types::Type::Group(_) => {
+        Type::Group(_) => {
             let name = name.tokens();
             Some(quote! {
                 tokens_helper(_visitor, &#name.span)
             })
         }
-        types::Type::Syn(t) => {
-            fn requires_full(features: &types::Features) -> bool {
+        Type::Syn(t) => {
+            fn requires_full(features: &Features) -> bool {
                 features.any.contains("full") && features.any.len() == 1
             }
             let mut res = simple_visit(t, name);
@@ -113,12 +113,12 @@
             }
             Some(res)
         }
-        types::Type::Ext(t) if gen::TERMINAL_TYPES.contains(&&t[..]) => Some(simple_visit(t, name)),
-        types::Type::Ext(_) | types::Type::Std(_) => None,
+        Type::Ext(t) if gen::TERMINAL_TYPES.contains(&&t[..]) => Some(simple_visit(t, name)),
+        Type::Ext(_) | Type::Std(_) => None,
     }
 }
 
-fn visit_features(features: &types::Features) -> TokenStream {
+fn visit_features(features: &Features) -> TokenStream {
     let features = &features.any;
     match features.len() {
         0 => quote!(),
@@ -127,7 +127,7 @@
     }
 }
 
-fn node(state: &mut State, s: &types::Node, defs: &types::Definitions) {
+fn node(state: &mut State, 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());
@@ -136,7 +136,7 @@
     let mut visit_impl = TokenStream::new();
 
     match &s.data {
-        types::Data::Enum(variants) => {
+        Data::Enum(variants) => {
             let mut visit_variants = TokenStream::new();
 
             for (variant, fields) in variants {
@@ -182,7 +182,7 @@
                 }
             });
         }
-        types::Data::Struct(fields) => {
+        Data::Struct(fields) => {
             for (field, ty) in fields {
                 let id = Ident::new(&field, Span::call_site());
                 let ref_toks = Owned(quote!(_i.#id));
@@ -193,7 +193,7 @@
                 });
             }
         }
-        types::Data::Private => {}
+        Data::Private => {}
     }
 
     state.visit_trait.append_all(quote! {
@@ -213,7 +213,7 @@
     });
 }
 
-pub fn generate(defs: &types::Definitions) {
+pub fn generate(defs: &Definitions) {
     let state = gen::traverse(defs, node);
     let full_macro = full::get_macro();
     let visit_trait = state.visit_trait;
diff --git a/codegen/src/visit_mut.rs b/codegen/src/visit_mut.rs
index b2e853e..4f0165c 100644
--- a/codegen/src/visit_mut.rs
+++ b/codegen/src/visit_mut.rs
@@ -1,9 +1,9 @@
-use crate::operand::*;
+use crate::operand::{Borrowed, Operand, Owned};
 use crate::{file, full, gen};
-use proc_macro2::{Span, TokenStream};
+use proc_macro2::{Ident, Span, TokenStream};
 use quote::{quote, TokenStreamExt};
-use syn::*;
-use syn_codegen as types;
+use syn::Index;
+use syn_codegen::{Data, Definitions, Features, Node, Type};
 
 const VISIT_MUT_SRC: &str = "../src/gen/visit_mut.rs";
 
@@ -30,17 +30,17 @@
 }
 
 fn visit(
-    ty: &types::Type,
-    features: &types::Features,
-    defs: &types::Definitions,
+    ty: &Type,
+    features: &Features,
+    defs: &Definitions,
     name: &Operand,
 ) -> Option<TokenStream> {
     match ty {
-        types::Type::Box(t) => {
+        Type::Box(t) => {
             let name = name.owned_tokens();
             visit(t, features, defs, &Owned(quote!(*#name)))
         }
-        types::Type::Vec(t) => {
+        Type::Vec(t) => {
             let operand = Borrowed(quote!(it));
             let val = visit(t, features, defs, &operand)?;
             let name = name.ref_mut_tokens();
@@ -50,7 +50,7 @@
                 }
             })
         }
-        types::Type::Punctuated(p) => {
+        Type::Punctuated(p) => {
             let operand = Borrowed(quote!(it));
             let val = visit(&p.element, features, defs, &operand)?;
             let name = name.ref_mut_tokens();
@@ -61,7 +61,7 @@
                 }
             })
         }
-        types::Type::Option(t) => {
+        Type::Option(t) => {
             let it = Borrowed(quote!(it));
             let val = visit(t, features, defs, &it)?;
             let name = name.owned_tokens();
@@ -71,7 +71,7 @@
                 }
             })
         }
-        types::Type::Tuple(t) => {
+        Type::Tuple(t) => {
             let mut code = TokenStream::new();
             for (i, elem) in t.iter().enumerate() {
                 let name = name.tokens();
@@ -83,7 +83,7 @@
             }
             Some(code)
         }
-        types::Type::Token(t) => {
+        Type::Token(t) => {
             let name = name.tokens();
             let repr = &defs.tokens[t];
             let is_keyword = repr.chars().next().unwrap().is_alphabetic();
@@ -96,14 +96,14 @@
                 tokens_helper(_visitor, &mut #name.#spans)
             })
         }
-        types::Type::Group(_) => {
+        Type::Group(_) => {
             let name = name.tokens();
             Some(quote! {
                 tokens_helper(_visitor, &mut #name.span)
             })
         }
-        types::Type::Syn(t) => {
-            fn requires_full(features: &types::Features) -> bool {
+        Type::Syn(t) => {
+            fn requires_full(features: &Features) -> bool {
                 features.any.contains("full") && features.any.len() == 1
             }
             let mut res = simple_visit(t, name);
@@ -113,12 +113,12 @@
             }
             Some(res)
         }
-        types::Type::Ext(t) if gen::TERMINAL_TYPES.contains(&&t[..]) => Some(simple_visit(t, name)),
-        types::Type::Ext(_) | types::Type::Std(_) => None,
+        Type::Ext(t) if gen::TERMINAL_TYPES.contains(&&t[..]) => Some(simple_visit(t, name)),
+        Type::Ext(_) | Type::Std(_) => None,
     }
 }
 
-fn visit_features(features: &types::Features) -> TokenStream {
+fn visit_features(features: &Features) -> TokenStream {
     let features = &features.any;
     match features.len() {
         0 => quote!(),
@@ -127,7 +127,7 @@
     }
 }
 
-fn node(state: &mut State, s: &types::Node, defs: &types::Definitions) {
+fn node(state: &mut State, 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());
@@ -136,7 +136,7 @@
     let mut visit_mut_impl = TokenStream::new();
 
     match &s.data {
-        types::Data::Enum(variants) => {
+        Data::Enum(variants) => {
             let mut visit_mut_variants = TokenStream::new();
 
             for (variant, fields) in variants {
@@ -182,7 +182,7 @@
                 }
             });
         }
-        types::Data::Struct(fields) => {
+        Data::Struct(fields) => {
             for (field, ty) in fields {
                 let id = Ident::new(&field, Span::call_site());
                 let ref_toks = Owned(quote!(_i.#id));
@@ -193,7 +193,7 @@
                 });
             }
         }
-        types::Data::Private => {}
+        Data::Private => {}
     }
 
     state.visit_mut_trait.append_all(quote! {
@@ -213,7 +213,7 @@
     });
 }
 
-pub fn generate(defs: &types::Definitions) {
+pub fn generate(defs: &Definitions) {
     let state = gen::traverse(defs, node);
     let full_macro = full::get_macro();
     let visit_mut_trait = state.visit_mut_trait;