From 42cc6720d194a8a34dc32709beef8b71120e70f9 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Sun, 14 Sep 2025 18:24:56 -0500 Subject: [PATCH] Move around util fn and set up enum build fn mod. --- ast-generator/src/deserialize.rs | 2 +- ast-generator/src/enum_build_fn.rs | 6 +++ ast-generator/src/lib.rs | 48 ++++++++++++------- ast-generator/src/spec.rs | 4 +- .../{build_fn_gen.rs => struct_build_fn.rs} | 6 +-- ast-generator/src/type_gen.rs | 2 +- ast-generator/src/util.rs | 5 ++ 7 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 ast-generator/src/enum_build_fn.rs rename ast-generator/src/{build_fn_gen.rs => struct_build_fn.rs} (99%) create mode 100644 ast-generator/src/util.rs diff --git a/ast-generator/src/deserialize.rs b/ast-generator/src/deserialize.rs index fc35cba..111eadd 100644 --- a/ast-generator/src/deserialize.rs +++ b/ast-generator/src/deserialize.rs @@ -1,10 +1,10 @@ -use crate::build_fn_gen::make_build_fn_name; use crate::spec::{ BooleanBuild, BuildSpec, ChildSpec, EnumBuildSpec, EnumRule, LeafEnumBuildSpec, LeafEnumRule, LeafEnumRuleBuild, SingleBooleanChildToBuild, SingleChild, SingleChildToBuild, SingleLiteralChildToBuild, SingleTypeChildToBuild, SkipChild, StructBuildSpec, VecChild, VecChildToBuild, VecTypeChildToBuild, }; +use crate::util::make_build_fn_name; use convert_case::{Case, Casing}; use yaml_rust2::{Yaml, YamlLoader}; diff --git a/ast-generator/src/enum_build_fn.rs b/ast-generator/src/enum_build_fn.rs new file mode 100644 index 0000000..0974f1b --- /dev/null +++ b/ast-generator/src/enum_build_fn.rs @@ -0,0 +1,6 @@ +use proc_macro2::TokenStream; +use crate::spec::EnumBuildSpec; + +pub fn make_enum_build_fn(enum_build_spec: &EnumBuildSpec) -> TokenStream { + todo!() +} \ No newline at end of file diff --git a/ast-generator/src/lib.rs b/ast-generator/src/lib.rs index 863f9ac..87d2cc3 100644 --- a/ast-generator/src/lib.rs +++ b/ast-generator/src/lib.rs @@ -1,14 +1,17 @@ pub mod deserialize; -mod build_fn_gen; +mod enum_build_fn; mod spec; +mod struct_build_fn; mod type_gen; +mod util; -use crate::build_fn_gen::make_struct_build_fn; +use crate::struct_build_fn::make_struct_build_fn; use crate::type_gen::make_type; use proc_macro2::TokenStream; use quote::quote; use spec::BuildSpec; use syn::File; +use crate::enum_build_fn::make_enum_build_fn; fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) { println!("*** BuildSpec ***"); @@ -18,7 +21,7 @@ fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) { } BuildSpec::LeafEnum(leaf_enum_build_spec) => { println!("Spec name: {}", leaf_enum_build_spec.name()); - }, + } BuildSpec::Struct(struct_build_spec) => { println!("Spec name: {}", struct_build_spec.name()); } @@ -30,7 +33,7 @@ fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) { pub struct AstGeneratedFile { pub name: String, - pub contents: String + pub contents: String, } fn token_stream_to_string(token_stream: TokenStream) -> String { @@ -39,16 +42,21 @@ fn token_stream_to_string(token_stream: TokenStream) -> String { } fn generate_build_file(build_specs: &[BuildSpec]) -> AstGeneratedFile { - let build_fns = build_specs.iter() - .map(|build_spec| { - match build_spec { - BuildSpec::Enum(enum_build_spec) => { quote! {} } - BuildSpec::LeafEnum(leaf_enum_build_spec) => { quote! {} } - BuildSpec::Struct(struct_build_spec) => { - let struct_build_fn_stream = make_struct_build_fn(struct_build_spec); - debug_built_spec(build_spec, &struct_build_fn_stream); - struct_build_fn_stream - } + let build_fns = build_specs + .iter() + .map(|build_spec| match build_spec { + BuildSpec::Enum(enum_build_spec) => { + let stream = make_enum_build_fn(enum_build_spec); + debug_built_spec(build_spec, &stream); + stream + } + BuildSpec::LeafEnum(leaf_enum_build_spec) => { + todo!() + } + BuildSpec::Struct(struct_build_spec) => { + let struct_build_fn_stream = make_struct_build_fn(struct_build_spec); + debug_built_spec(build_spec, &struct_build_fn_stream); + struct_build_fn_stream } }) .collect::>(); @@ -57,12 +65,13 @@ fn generate_build_file(build_specs: &[BuildSpec]) -> AstGeneratedFile { }; AstGeneratedFile { name: String::from("build.rs"), - contents: token_stream_to_string(combined) + contents: token_stream_to_string(combined), } } fn generate_node_file(build_specs: &[BuildSpec]) -> AstGeneratedFile { - let types = build_specs.iter() + let types = build_specs + .iter() .map(|build_spec| make_type(build_spec)) .collect::>(); let combined = quote! { @@ -70,12 +79,15 @@ fn generate_node_file(build_specs: &[BuildSpec]) -> AstGeneratedFile { }; AstGeneratedFile { name: String::from("node.rs"), - contents: token_stream_to_string(combined) + contents: token_stream_to_string(combined), } } pub fn generate_files(build_specs: &[BuildSpec]) -> Vec { - vec![generate_build_file(build_specs), generate_node_file(build_specs)] + vec![ + generate_build_file(build_specs), + generate_node_file(build_specs), + ] } pub fn test_dump() -> String { diff --git a/ast-generator/src/spec.rs b/ast-generator/src/spec.rs index 616d2e6..036f76c 100644 --- a/ast-generator/src/spec.rs +++ b/ast-generator/src/spec.rs @@ -1,4 +1,4 @@ -use crate::build_fn_gen::make_build_fn_name; +use crate::util::make_build_fn_name; use convert_case::{Case, Casing}; pub enum BuildSpec { @@ -352,7 +352,7 @@ impl SingleTypeChildToBuild { optional, } } - + pub fn new( build: &str, var_name: &str, diff --git a/ast-generator/src/build_fn_gen.rs b/ast-generator/src/struct_build_fn.rs similarity index 99% rename from ast-generator/src/build_fn_gen.rs rename to ast-generator/src/struct_build_fn.rs index a39151f..5872c58 100644 --- a/ast-generator/src/build_fn_gen.rs +++ b/ast-generator/src/struct_build_fn.rs @@ -6,10 +6,6 @@ use convert_case::{Case, Casing}; use proc_macro2::{Ident, TokenStream}; use quote::{format_ident, quote}; -pub fn make_build_fn_name(s: &str) -> String { - format!("build_{}", s.to_case(Case::Snake)) -} - fn make_vec_child_holder(vec_child: &VecChild) -> TokenStream { let (child_ident, child_type_ident) = match vec_child.build() { VecChildToBuild::Type(vec_type_child) => ( @@ -199,7 +195,7 @@ fn make_child_arg(child_spec: &ChildSpec) -> Option { SingleChildToBuild::Long(literal_child) => { let child_ident = get_literal_child_ident(literal_child); Some(quote! { #child_ident.unwrap() }) - }, + } SingleChildToBuild::Double(literal_child) => { let child_ident = get_literal_child_ident(literal_child); Some(quote! { #child_ident.unwrap() }) diff --git a/ast-generator/src/type_gen.rs b/ast-generator/src/type_gen.rs index db02b95..b73cb48 100644 --- a/ast-generator/src/type_gen.rs +++ b/ast-generator/src/type_gen.rs @@ -164,7 +164,7 @@ fn make_struct_type(build_spec: &StructBuildSpec) -> TokenStream { pub fn make_type(build_spec: &BuildSpec) -> TokenStream { match build_spec { BuildSpec::Enum(enum_build_spec) => make_enum_type(enum_build_spec), - BuildSpec::LeafEnum(leaf_enum_build_spec) => quote! {}, + BuildSpec::LeafEnum(leaf_enum_build_spec) => todo!(), BuildSpec::Struct(struct_build_spec) => make_struct_type(struct_build_spec), } } diff --git a/ast-generator/src/util.rs b/ast-generator/src/util.rs new file mode 100644 index 0000000..c91ad4a --- /dev/null +++ b/ast-generator/src/util.rs @@ -0,0 +1,5 @@ +use convert_case::{Case, Casing}; + +pub fn make_build_fn_name(s: &str) -> String { + format!("build_{}", s.to_case(Case::Snake)) +}