From e21b428e2656c0912d166a0f7d8358c2b46fad46 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Tue, 23 Sep 2025 11:03:25 -0500 Subject: [PATCH] Various refactoring. --- ast-generator/src/build_fn/mod.rs | 50 ++++++++--- ast-generator/src/lib.rs | 83 +++++-------------- .../src/spec/polymorphic_enum_loop_spec.rs | 4 + 3 files changed, 65 insertions(+), 72 deletions(-) diff --git a/ast-generator/src/build_fn/mod.rs b/ast-generator/src/build_fn/mod.rs index 38f5dc9..13912e7 100644 --- a/ast-generator/src/build_fn/mod.rs +++ b/ast-generator/src/build_fn/mod.rs @@ -1,10 +1,40 @@ -pub mod leaf_enum_build_fn; -pub mod leaf_struct_build_fn; -pub mod node_production_build_fn; -pub mod polymorphic_build_build_fn; -pub mod polymorphic_enum_build_fn; -pub mod polymorphic_enum_loop_build_fn; -pub mod polymorphic_type_build_fn; -pub mod production_build_fn; -pub mod struct_build_fn; -pub mod tree_enum_build_fn; +use crate::build_fn::leaf_enum_build_fn::make_leaf_enum_build_fn; +use crate::build_fn::leaf_struct_build_fn::make_leaf_struct_build_fn; +use crate::build_fn::node_production_build_fn::make_node_production_build_fn; +use crate::build_fn::polymorphic_enum_loop_build_fn::make_polymorphic_enum_loop_build_fn; +use crate::build_fn::polymorphic_type_build_fn::make_polymorphic_type_build_fn; +use crate::build_fn::production_build_fn::make_production_build_fn; +use crate::build_fn::struct_build_fn::make_struct_build_fn; +use crate::build_fn::tree_enum_build_fn::make_enum_build_fn; +use crate::spec::BuildSpec; +use proc_macro2::TokenStream; + +mod leaf_enum_build_fn; +mod leaf_struct_build_fn; +mod node_production_build_fn; +mod polymorphic_build_build_fn; +mod polymorphic_enum_build_fn; +mod polymorphic_enum_loop_build_fn; +mod polymorphic_type_build_fn; +mod production_build_fn; +mod struct_build_fn; +mod tree_enum_build_fn; + +pub fn make_build_fn(build_spec: &BuildSpec) -> TokenStream { + match build_spec { + BuildSpec::Struct(struct_spec) => make_struct_build_fn(struct_spec), + BuildSpec::LeafStruct(leaf_struct_spec) => make_leaf_struct_build_fn(leaf_struct_spec), + BuildSpec::Enum(enum_spec) => make_enum_build_fn(enum_spec), + BuildSpec::LeafEnum(leaf_enum_spec) => make_leaf_enum_build_fn(leaf_enum_spec), + BuildSpec::Production(production_spec) => make_production_build_fn(production_spec), + BuildSpec::NodeProduction(node_production_spec) => { + make_node_production_build_fn(node_production_spec) + } + BuildSpec::PolymorphicType(polymorphic_type_spec) => { + make_polymorphic_type_build_fn(polymorphic_type_spec) + } + BuildSpec::PolymorphicEnumLoop(polymorphic_enum_loop_spec) => { + make_polymorphic_enum_loop_build_fn(polymorphic_enum_loop_spec) + } + } +} diff --git a/ast-generator/src/lib.rs b/ast-generator/src/lib.rs index d4a5d90..f8db5b7 100644 --- a/ast-generator/src/lib.rs +++ b/ast-generator/src/lib.rs @@ -1,18 +1,11 @@ mod build_fn; -pub mod deserialize; +mod deserialize; mod pretty_print; mod spec; mod type_gen; -mod util; -use crate::build_fn::enum_build_fn::make_enum_build_fn; -use crate::build_fn::leaf_enum_build_fn::make_leaf_enum_build_fn; -use crate::build_fn::leaf_struct_build_fn::make_leaf_struct_build_fn; -use crate::build_fn::polymorphic_build_build_fn::make_polymorphic_build_build_fn; -use crate::build_fn::polymorphic_build_fn::make_polymorphic_build_fn; -use crate::build_fn::polymorphic_enum_build_fn::make_polymorphic_enum_build_fn; -use crate::build_fn::production_build_fn::make_production_build_fn; -use crate::build_fn::struct_build_fn::make_struct_build_fn; +use crate::build_fn::make_build_fn; +use crate::deserialize::deserialize_yaml_spec; use crate::pretty_print::make_pretty_print_impl; use crate::type_gen::make_type; use proc_macro2::TokenStream; @@ -39,24 +32,21 @@ fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) { ); } BuildSpec::Production(production_build_spec) => { - println!("Production Spec - rule: {}", production_build_spec.rule()); + println!("Production Spec - name: {}", production_build_spec.name()); } - BuildSpec::Polymorphic(polymorphic_build_spec) => { + BuildSpec::NodeProduction(node_production_build_spec) => { + println!("Node Production Spec - name: {}", node_production_build_spec.name()); + } + BuildSpec::PolymorphicType(polymorphic_build_spec) => { println!( "Polymorphic Type Spec - name: {}", polymorphic_build_spec.name() ); } - BuildSpec::PolymorphicBuild(polymorphic_build_build_spec) => { + BuildSpec::PolymorphicEnumLoop(polymorphic_enum_loop_build_spec) => { println!( - "Polymorphic Build Spec - name: {}", - polymorphic_build_build_spec.name() - ); - } - BuildSpec::PolymorphicEnum(polymorphic_enum_build_spec) => { - println!( - "Polymorphic Enum Spec - name: {}", - polymorphic_enum_build_spec.name() + "Polymorphic Enum Loop Spec - name: {}", + polymorphic_enum_loop_build_spec.name() ); } } @@ -78,49 +68,13 @@ 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) => { - let stream = make_enum_build_fn(enum_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::LeafEnum(leaf_enum_build_spec) => { - let stream = make_leaf_enum_build_fn(leaf_enum_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::Struct(struct_build_spec) => { - let stream = make_struct_build_fn(struct_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::LeafStruct(leaf_struct_build_spec) => { - let stream = make_leaf_struct_build_fn(leaf_struct_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::Production(production_build_spec) => { - let stream = make_production_build_fn(production_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::Polymorphic(polymorphic_build_spec) => { - let stream = make_polymorphic_build_fn(polymorphic_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::PolymorphicBuild(polymorphic_build_build_spec) => { - let stream = make_polymorphic_build_build_fn(polymorphic_build_build_spec); - debug_built_spec(build_spec, &stream); - stream - } - BuildSpec::PolymorphicEnum(polymorphic_enum_build_spec) => { - let stream = make_polymorphic_enum_build_fn(polymorphic_enum_build_spec); - debug_built_spec(build_spec, &stream); - stream - } + .map(|build_spec| { + let build_fn = make_build_fn(build_spec); + debug_built_spec(build_spec, &build_fn); + build_fn }) .collect::>(); + let combined = quote! { //noinspection RsUnusedImport use crate::parser::Rule; @@ -131,6 +85,7 @@ fn generate_build_file(build_specs: &[BuildSpec]) -> AstGeneratedFile { #(#build_fns)* }; + AstGeneratedFile { name: String::from("build.rs"), contents: token_stream_to_string(combined), @@ -172,6 +127,10 @@ fn generate_pretty_print_file(build_specs: &[BuildSpec]) -> AstGeneratedFile { } } +pub fn get_build_specs(yaml: &str) -> Vec { + deserialize_yaml_spec(yaml) +} + pub fn generate_files(build_specs: &[BuildSpec]) -> Vec { vec![ generate_build_file(build_specs), diff --git a/ast-generator/src/spec/polymorphic_enum_loop_spec.rs b/ast-generator/src/spec/polymorphic_enum_loop_spec.rs index 25312dd..bd9c10e 100644 --- a/ast-generator/src/spec/polymorphic_enum_loop_spec.rs +++ b/ast-generator/src/spec/polymorphic_enum_loop_spec.rs @@ -73,6 +73,10 @@ impl PolymorphicEnumLoopRuleBuild { children, } } + + pub fn name(&self) -> &str { + &self.name + } pub fn variant(&self) -> &str { &self.variant