Start outputting build.rs file from ast gen.

This commit is contained in:
Jesse Brault 2025-09-14 08:54:06 -05:00
parent e802fc70d8
commit 152f5a6150
4 changed files with 68 additions and 9 deletions

View File

@ -1,5 +1,5 @@
pub mod deserialize;
mod build_fn_gen;
mod deserialize;
mod spec;
mod type_gen;
@ -9,7 +9,6 @@ use proc_macro2::TokenStream;
use quote::quote;
use spec::BuildSpec;
use syn::File;
use syn::spanned::Spanned;
fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
println!("*** BuildSpec ***");
@ -26,6 +25,42 @@ fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
println!("{}", prettyplease::unparse(&parsed));
}
pub struct AstGeneratedFile {
pub name: String,
pub contents: String
}
fn token_stream_to_string(token_stream: TokenStream) -> String {
let file: File = syn::parse2(token_stream).unwrap();
prettyplease::unparse(&file)
}
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::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::<Vec<_>>();
let combined = quote! {
#(#build_fns)*
};
AstGeneratedFile {
name: String::from("build.rs"),
contents: token_stream_to_string(combined)
}
}
pub fn generate_files(build_specs: &[BuildSpec]) -> Vec<AstGeneratedFile> {
vec![generate_build_file(build_specs)]
}
pub fn test_dump() -> String {
let build_specs = deserialize::deserialize_yaml_spec(include_str!("../../src/parser/ast.yaml"));
let mut streams: Vec<TokenStream> = vec![];

View File

@ -1,17 +1,40 @@
use ast_generator::{deserialize, generate_files};
use cst_test_generator::generate_test_files;
use std::env;
use std::fs;
use std::io;
use std::path::Path;
fn main() -> std::io::Result<()> {
println!("cargo:rerun-if-changed=src/parser/deimos.pest");
println!("cargo:rerun-if-changed=src/parser/tests");
let out_dir = env::var("OUT_DIR").unwrap();
let out_dir_path = Path::new(&out_dir);
let parser_tests_dir = out_dir_path.join("src").join("parser").join("tests");
fn generate_parser_tests(out_dir: &Path) -> io::Result<()> {
let parser_tests_dir = out_dir.join("src").join("parser").join("tests");
fs::create_dir_all(&parser_tests_dir)?;
let test_suites_file = generate_test_files(Path::new("src/parser/tests"))?;
let file_path = parser_tests_dir.join(&test_suites_file.file_name);
fs::write(file_path, &test_suites_file.contents)?;
Ok(())
}
fn generate_ast_files(out_dir: &Path) -> io::Result<()> {
let gen_ast_dir = out_dir.join("src").join("ast");
fs::create_dir_all(&gen_ast_dir)?;
let ast_yaml = include_str!("src/parser/ast.yaml");
let build_specs = deserialize::deserialize_yaml_spec(ast_yaml);
let generated_files = generate_files(&build_specs);
for generated_file in &generated_files {
let path = gen_ast_dir.join(&generated_file.name);
fs::write(path, &generated_file.contents)?;
}
Ok(())
}
fn main() -> io::Result<()> {
println!("cargo:rerun-if-changed=src/parser/tests");
println!("cargo:rerun-if-changed=src/parser/ast.yaml");
println!("cargo:rerun-if-changed=src/parser/deimos.pest");
let out_dir = env::var_os("OUT_DIR").unwrap();
let out_dir_path = Path::new(&out_dir);
generate_parser_tests(out_dir_path)?;
generate_ast_files(out_dir_path)?;
Ok(())
}

1
src/ast/build.rs Normal file
View File

@ -0,0 +1 @@
include!(concat!(env!("OUT_DIR"), "/src/ast/build.rs"));

View File

@ -1,4 +1,4 @@
// pub mod build;
pub mod build;
pub mod children;
pub mod node;
pub mod pretty_print;