Include token types in json file
diff --git a/codegen/src/gen.rs b/codegen/src/gen.rs
index c954961..1186ff9 100644
--- a/codegen/src/gen.rs
+++ b/codegen/src/gen.rs
@@ -116,7 +116,7 @@
fn box_visit(
elem: &types::Type,
features: &types::Features,
- types: &[types::TypeDef],
+ types: &[types::Node],
kind: Kind,
name: &Operand,
) -> Option<TokenStream> {
@@ -133,7 +133,7 @@
fn vec_visit(
elem: &types::Type,
features: &types::Features,
- types: &[types::TypeDef],
+ types: &[types::Node],
kind: Kind,
name: &Operand,
) -> Option<TokenStream> {
@@ -171,7 +171,7 @@
fn punctuated_visit(
elem: &types::Type,
features: &types::Features,
- types: &[types::TypeDef],
+ types: &[types::Node],
kind: Kind,
name: &Operand,
) -> Option<TokenStream> {
@@ -211,7 +211,7 @@
fn option_visit(
elem: &types::Type,
features: &types::Features,
- types: &[types::TypeDef],
+ types: &[types::Node],
kind: Kind,
name: &Operand,
) -> Option<TokenStream> {
@@ -241,7 +241,7 @@
fn tuple_visit(
elems: &[types::Type],
features: &types::Features,
- types: &[types::TypeDef],
+ types: &[types::Node],
kind: Kind,
name: &Operand,
) -> Option<TokenStream> {
@@ -333,7 +333,7 @@
fn visit(
ty: &types::Type,
features: &types::Features,
- types: &[types::TypeDef],
+ types: &[types::Node],
kind: Kind,
name: &Operand,
) -> Option<TokenStream> {
@@ -391,7 +391,7 @@
}
}
- pub fn generate(state: &mut State, s: &types::TypeDef, types: &[types::TypeDef]) {
+ pub fn generate(state: &mut State, s: &types::Node, types: &[types::Node]) {
let features = visit_features(s.features());
let under_name = under_name(s.ident());
let ty = Ident::new(s.ident(), Span::call_site());
@@ -404,7 +404,7 @@
let mut fold_impl = TokenStream::new();
match s {
- types::TypeDef::Enum(ref e) => {
+ types::Node::Enum(ref e) => {
let mut visit_variants = TokenStream::new();
let mut visit_mut_variants = TokenStream::new();
let mut fold_variants = TokenStream::new();
@@ -508,7 +508,7 @@
}
});
}
- types::TypeDef::Struct(ref v) => {
+ types::Node::Struct(ref v) => {
let mut fold_fields = TokenStream::new();
for field in v.fields() {
@@ -555,7 +555,7 @@
}
let mut include_fold_impl = true;
- if let types::TypeDef::Struct(ref data) = s {
+ if let types::Node::Struct(ref data) = s {
if !data.all_fields_pub() {
include_fold_impl = false;
}
@@ -631,10 +631,10 @@
.unwrap();
}
-pub fn generate(types: &[types::TypeDef]) {
+pub fn generate(defs: &types::Definitions) {
let mut state = codegen::State::default();
- for s in types {
- codegen::generate(&mut state, s, types);
+ for s in &defs.types {
+ codegen::generate(&mut state, s, &defs.types);
}
let full_macro = quote! {
diff --git a/codegen/src/json.rs b/codegen/src/json.rs
index e1b641d..3bcf7b2 100644
--- a/codegen/src/json.rs
+++ b/codegen/src/json.rs
@@ -1,10 +1,11 @@
use crate::types;
+use std::collections::BTreeMap;
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;
-pub fn generate(types: &[types::TypeDef]) {
+pub fn generate(defs: &types::Definitions) {
let codegen_root = Path::new(env!("CARGO_MANIFEST_DIR"));
let mut f = File::open(codegen_root.join("../Cargo.toml")).unwrap();
@@ -17,7 +18,8 @@
serde_json::to_writer_pretty(f, &Introspect {
version: &manifest.package.version,
- types,
+ types: &defs.types,
+ tokens: &defs.tokens,
}).unwrap();
}
@@ -35,5 +37,6 @@
struct Introspect<'a> {
/// The `syn` version used to generate the introspection file
version: &'a str,
- types: &'a [types::TypeDef],
+ types: &'a [types::Node],
+ tokens: &'a BTreeMap<String, String>,
}
diff --git a/codegen/src/parse.rs b/codegen/src/parse.rs
index 25b8ac1..cd43d60 100644
--- a/codegen/src/parse.rs
+++ b/codegen/src/parse.rs
@@ -19,7 +19,7 @@
type TokenLookup = BTreeMap<String, String>;
/// Parse the contents of `src` and return a list of AST types.
-pub fn parse() -> Vec<types::TypeDef> {
+pub fn parse() -> types::Definitions {
let mut item_lookup = BTreeMap::new();
load_file(SYN_CRATE_ROOT, &[], &mut item_lookup).unwrap();
@@ -49,10 +49,14 @@
);
}
- item_lookup
+ let types = item_lookup
.values()
.map(|item| introspect_item(item, &item_lookup, &token_lookup))
- .collect()
+ .collect();
+
+ let tokens = token_lookup.into_iter().map(|(name, ty)| (ty, name)).collect();
+
+ types::Definitions { types, tokens }
}
/// Data extracted from syn source
@@ -62,18 +66,18 @@
features: Vec<syn::Attribute>,
}
-fn introspect_item(item: &AstItem, items: &ItemLookup, tokens: &TokenLookup) -> types::TypeDef {
+fn introspect_item(item: &AstItem, items: &ItemLookup, tokens: &TokenLookup) -> types::Node {
let features = introspect_features(&item.features);
match &item.ast.data {
- Data::Enum(ref data) => types::TypeDef::Enum(introspect_enum(
+ Data::Enum(ref data) => types::Node::Enum(introspect_enum(
&item.ast.ident,
features,
data,
items,
tokens,
)),
- Data::Struct(ref data) => types::TypeDef::Struct(introspect_struct(
+ Data::Struct(ref data) => types::Node::Struct(introspect_struct(
&item.ast.ident,
features,
data,
diff --git a/codegen/src/types.rs b/codegen/src/types.rs
index 679b72e..1eea214 100644
--- a/codegen/src/types.rs
+++ b/codegen/src/types.rs
@@ -1,8 +1,14 @@
+use std::collections::BTreeMap;
use std::ops;
+pub struct Definitions {
+ pub types: Vec<Node>,
+ pub tokens: BTreeMap<String, String>,
+}
+
#[derive(Debug, Serialize)]
#[serde(tag = "node", rename_all = "lowercase")]
-pub enum TypeDef {
+pub enum Node {
Struct(Struct),
Enum(Enum),
}
@@ -80,18 +86,18 @@
any: Vec<String>,
}
-impl TypeDef {
+impl Node {
pub fn ident(&self) -> &str {
match self {
- TypeDef::Struct(i) => &i.ident,
- TypeDef::Enum(i) => &i.ident,
+ Node::Struct(i) => &i.ident,
+ Node::Enum(i) => &i.ident,
}
}
pub fn features(&self) -> &Features {
match self {
- TypeDef::Struct(i) => &i.features,
- TypeDef::Enum(i) => &i.features,
+ Node::Struct(i) => &i.features,
+ Node::Enum(i) => &i.features,
}
}
}