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))
-}