Parse version together with definitions
diff --git a/codegen/src/json.rs b/codegen/src/json.rs
index 66803ee..668c507 100644
--- a/codegen/src/json.rs
+++ b/codegen/src/json.rs
@@ -1,49 +1,14 @@
-use crate::types;
+use crate::types::Definitions;
 
-use serde::{Serialize, Deserialize};
-
-use std::collections::BTreeMap;
-use std::fs::{self, File};
-use std::io::prelude::*;
+use std::fs;
 use std::path::Path;
 
-pub fn generate(defs: &types::Definitions) {
+pub fn generate(defs: &Definitions) {
+    let j = serde_json::to_string_pretty(&defs).unwrap();
+    let check: Definitions = serde_json::from_str(&j).unwrap();
+    assert_eq!(*defs, check);
+
     let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
-
-    let mut f = File::open(codegen_root.join("../Cargo.toml")).unwrap();
-    let mut s = String::new();
-    f.read_to_string(&mut s).unwrap();
-
-    let manifest: Manifest = toml::from_str(&s).unwrap();
-
-    let introspect = Introspect {
-        version: manifest.package.version,
-        types: defs.types.clone(),
-        tokens: defs.tokens.clone(),
-    };
-
-    let j = serde_json::to_string_pretty(&introspect).unwrap();
-    let check: Introspect = serde_json::from_str(&j).unwrap();
-    assert_eq!(introspect, check);
-
     let json_path = codegen_root.join("../syn.json");
     fs::write(json_path, j).unwrap();
 }
-
-#[derive(Debug, Deserialize)]
-struct Manifest {
-    package: Package,
-}
-
-#[derive(Debug, Deserialize)]
-struct Package {
-    version: String,
-}
-
-#[derive(Debug, PartialEq, Serialize, Deserialize)]
-struct Introspect {
-    /// The `syn` version used to generate the introspection file
-    version: String,
-    types: Vec<types::Node>,
-    tokens: BTreeMap<String, String>,
-}
diff --git a/codegen/src/main.rs b/codegen/src/main.rs
index 987235e..d5d3262 100644
--- a/codegen/src/main.rs
+++ b/codegen/src/main.rs
@@ -17,9 +17,10 @@
 mod json;
 mod parse;
 mod types;
+mod version;
 
 fn main() {
-    let types = parse::parse();
-    gen::generate(&types);
-    json::generate(&types);
+    let defs = parse::parse();
+    gen::generate(&defs);
+    json::generate(&defs);
 }
diff --git a/codegen/src/parse.rs b/codegen/src/parse.rs
index 08aefd1..c8c2a03 100644
--- a/codegen/src/parse.rs
+++ b/codegen/src/parse.rs
@@ -1,4 +1,4 @@
-use crate::types;
+use crate::{types, version};
 
 use indexmap::IndexMap;
 use quote::quote;
@@ -25,6 +25,8 @@
 
     let token_lookup = load_token_file(TOKEN_SRC).unwrap();
 
+    let version = version::get();
+
     let types = item_lookup
         .values()
         .map(|item| introspect_item(item, &item_lookup, &token_lookup))
@@ -35,7 +37,11 @@
         .map(|(name, ty)| (ty, name))
         .collect();
 
-    types::Definitions { types, tokens }
+    types::Definitions {
+        version,
+        types,
+        tokens,
+    }
 }
 
 /// Data extracted from syn source
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
index 0f8bd931..963441e 100644
--- a/codegen/src/types.rs
+++ b/codegen/src/types.rs
@@ -1,10 +1,12 @@
 use indexmap::IndexMap;
-use serde::{Serialize, Deserialize, Deserializer};
+use serde::{Deserialize, Deserializer, Serialize};
 
 use std::collections::{BTreeMap, BTreeSet};
 
-#[derive(Debug, Clone, PartialEq)]
+#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
 pub struct Definitions {
+    /// The Syn version used to generate the introspection file.
+    pub version: String,
     pub types: Vec<Node>,
     pub tokens: BTreeMap<String, String>,
 }
diff --git a/codegen/src/version.rs b/codegen/src/version.rs
new file mode 100644
index 0000000..c3536c1
--- /dev/null
+++ b/codegen/src/version.rs
@@ -0,0 +1,22 @@
+use serde::Deserialize;
+
+use std::fs;
+use std::path::Path;
+
+pub fn get() -> String {
+    let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
+    let syn_cargo_toml = codegen_root.join("../Cargo.toml");
+    let manifest = fs::read_to_string(syn_cargo_toml).unwrap();
+    let parsed: Manifest = toml::from_str(&manifest).unwrap();
+    parsed.package.version
+}
+
+#[derive(Debug, Deserialize)]
+struct Manifest {
+    package: Package,
+}
+
+#[derive(Debug, Deserialize)]
+struct Package {
+    version: String,
+}