Move codegen types to syn-codegen crate
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index 3daf75a..d92249c 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -10,10 +10,10 @@
 //!    - only submodules located in the same directory.
 //! 3. The path to `syn` is hardcoded.
 
-use crate::types;
 use proc_macro2::TokenStream;
 use quote::quote;
 use rustfmt_nightly as rustfmt;
+use syn_codegen as types;
 
 use std::fs::File;
 use std::io::Write;
@@ -23,11 +23,11 @@
 const VISIT_MUT_SRC: &str = "../src/gen/visit_mut.rs";
 
 mod codegen {
-    use crate::types;
     use inflections::Inflect;
     use proc_macro2::{Span, TokenStream};
     use quote::{quote, TokenStreamExt};
     use syn::*;
+    use syn_codegen as types;
 
     #[derive(Default)]
     pub struct State {
diff --git a/codegen/src/json.rs b/codegen/src/json.rs
index 63764b6..8e45308 100644
--- a/codegen/src/json.rs
+++ b/codegen/src/json.rs
@@ -1,4 +1,4 @@
-use crate::types::Definitions;
+use syn_codegen::Definitions;
 
 use std::fs;
 use std::path::Path;
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index d5d3262..98dd59c 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -16,7 +16,6 @@
 mod gen;
 mod json;
 mod parse;
-mod types;
 mod version;
 
 fn main() {
diff --git a/codegen/src/parse.rs b/codegen/src/parse.rs
index c8c2a03..c6335b7 100644
--- a/codegen/src/parse.rs
+++ b/codegen/src/parse.rs
@@ -1,8 +1,10 @@
-use crate::{types, version};
+use crate::version;
 
 use indexmap::IndexMap;
 use quote::quote;
+use syn::parse::Parser;
 use syn::{parse_quote, Data, DataStruct, DeriveInput, Ident, Item};
+use syn_codegen as types;
 
 use std::collections::BTreeMap;
 use std::fs::File;
@@ -192,7 +194,7 @@
             continue;
         }
 
-        let features: types::Features = syn::parse2(attr.tts.clone()).unwrap();
+        let features = parsing::parse_features.parse2(attr.tts.clone()).unwrap();
 
         if ret.any.is_empty() {
             ret = features;
@@ -250,13 +252,13 @@
 
 mod parsing {
     use super::{AstItem, TokenLookup};
-    use crate::types;
 
     use proc_macro2::TokenStream;
     use quote::quote;
     use syn;
     use syn::parse::{Parse, ParseStream, Result};
     use syn::*;
+    use syn_codegen as types;
 
     use std::collections::{BTreeMap, BTreeSet};
 
@@ -453,39 +455,37 @@
         Ok(s.value())
     }
 
-    impl Parse for types::Features {
-        fn parse(input: ParseStream) -> Result<Self> {
-            let mut features = BTreeSet::new();
+    pub fn parse_features(input: ParseStream) -> Result<types::Features> {
+        let mut features = BTreeSet::new();
 
-            let level_1;
-            parenthesized!(level_1 in input);
+        let level_1;
+        parenthesized!(level_1 in input);
 
-            let i: syn::Ident = level_1.fork().parse()?;
+        let i: syn::Ident = level_1.fork().parse()?;
 
-            if i == "any" {
-                level_1.parse::<syn::Ident>()?;
+        if i == "any" {
+            level_1.parse::<syn::Ident>()?;
 
-                let level_2;
-                parenthesized!(level_2 in level_1);
+            let level_2;
+            parenthesized!(level_2 in level_1);
 
-                while !level_2.is_empty() {
-                    features.insert(parse_feature(&level_2)?);
+            while !level_2.is_empty() {
+                features.insert(parse_feature(&level_2)?);
 
-                    if !level_2.is_empty() {
-                        level_2.parse::<Token![,]>()?;
-                    }
+                if !level_2.is_empty() {
+                    level_2.parse::<Token![,]>()?;
                 }
-            } else if i == "feature" {
-                features.insert(parse_feature(&level_1)?);
-                assert!(level_1.is_empty());
-            } else {
-                panic!("{:?}", i);
             }
-
-            assert!(input.is_empty());
-
-            Ok(types::Features { any: features })
+        } else if i == "feature" {
+            features.insert(parse_feature(&level_1)?);
+            assert!(level_1.is_empty());
+        } else {
+            panic!("{:?}", i);
         }
+
+        assert!(input.is_empty());
+
+        Ok(types::Features { any: features })
     }
 }
 
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
deleted file mode 100644
index 0fcca55..0000000
--- a/codegen/src/types.rs
+++ /dev/null
@@ -1,91 +0,0 @@
-use indexmap::IndexMap;
-use semver::Version;
-use serde::{Deserialize, Deserializer, Serialize};
-
-use std::collections::{BTreeMap, BTreeSet};
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-pub struct Definitions {
-    /// The Syn version used to generate the introspection file.
-    pub version: Version,
-    pub types: Vec<Node>,
-    pub tokens: BTreeMap<String, String>,
-}
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-pub struct Node {
-    pub ident: String,
-    pub features: Features,
-    #[serde(
-        flatten,
-        skip_serializing_if = "is_private",
-        deserialize_with = "private_if_absent"
-    )]
-    pub data: Data,
-}
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-pub enum Data {
-    Private,
-    #[serde(rename = "fields")]
-    Struct(Fields),
-    #[serde(rename = "variants")]
-    Enum(Variants),
-}
-
-pub type Fields = IndexMap<String, Type>;
-pub type Variants = IndexMap<String, Vec<Type>>;
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-#[serde(rename_all = "lowercase")]
-pub enum Type {
-    /// Type defined by `syn`
-    Syn(String),
-
-    /// Type defined in `std`.
-    Std(String),
-
-    /// Type external to `syn`
-    #[serde(rename = "proc_macro2")]
-    Ext(String),
-
-    /// Token type
-    Token(String),
-
-    /// Token group
-    Group(String),
-
-    /// Punctuated list
-    Punctuated(Punctuated),
-
-    Option(Box<Type>),
-    Box(Box<Type>),
-    Vec(Box<Type>),
-    Tuple(Vec<Type>),
-}
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-pub struct Punctuated {
-    pub element: Box<Type>,
-    pub punct: String,
-}
-
-#[derive(Debug, Default, PartialEq, Serialize, Deserialize)]
-pub struct Features {
-    pub any: BTreeSet<String>,
-}
-
-fn is_private(data: &Data) -> bool {
-    match data {
-        Data::Private => true,
-        Data::Struct(_) | Data::Enum(_) => false,
-    }
-}
-
-fn private_if_absent<'de, D>(deserializer: D) -> Result<Data, D::Error>
-where
-    D: Deserializer<'de>,
-{
-    let option = Option::deserialize(deserializer)?;
-    Ok(option.unwrap_or(Data::Private))
-}