Start outputting build.rs file from ast gen.
This commit is contained in:
parent
e802fc70d8
commit
152f5a6150
@ -1,5 +1,5 @@
|
|||||||
|
pub mod deserialize;
|
||||||
mod build_fn_gen;
|
mod build_fn_gen;
|
||||||
mod deserialize;
|
|
||||||
mod spec;
|
mod spec;
|
||||||
mod type_gen;
|
mod type_gen;
|
||||||
|
|
||||||
@ -9,7 +9,6 @@ use proc_macro2::TokenStream;
|
|||||||
use quote::quote;
|
use quote::quote;
|
||||||
use spec::BuildSpec;
|
use spec::BuildSpec;
|
||||||
use syn::File;
|
use syn::File;
|
||||||
use syn::spanned::Spanned;
|
|
||||||
|
|
||||||
fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
|
fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
|
||||||
println!("*** BuildSpec ***");
|
println!("*** BuildSpec ***");
|
||||||
@ -26,6 +25,42 @@ fn debug_built_spec(build_spec: &BuildSpec, token_stream: &TokenStream) {
|
|||||||
println!("{}", prettyplease::unparse(&parsed));
|
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 {
|
pub fn test_dump() -> String {
|
||||||
let build_specs = deserialize::deserialize_yaml_spec(include_str!("../../src/parser/ast.yaml"));
|
let build_specs = deserialize::deserialize_yaml_spec(include_str!("../../src/parser/ast.yaml"));
|
||||||
let mut streams: Vec<TokenStream> = vec![];
|
let mut streams: Vec<TokenStream> = vec![];
|
||||||
|
|||||||
35
build.rs
35
build.rs
@ -1,17 +1,40 @@
|
|||||||
|
use ast_generator::{deserialize, generate_files};
|
||||||
use cst_test_generator::generate_test_files;
|
use cst_test_generator::generate_test_files;
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
use std::io;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
fn main() -> std::io::Result<()> {
|
fn generate_parser_tests(out_dir: &Path) -> io::Result<()> {
|
||||||
println!("cargo:rerun-if-changed=src/parser/deimos.pest");
|
let parser_tests_dir = out_dir.join("src").join("parser").join("tests");
|
||||||
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");
|
|
||||||
fs::create_dir_all(&parser_tests_dir)?;
|
fs::create_dir_all(&parser_tests_dir)?;
|
||||||
let test_suites_file = generate_test_files(Path::new("src/parser/tests"))?;
|
let test_suites_file = generate_test_files(Path::new("src/parser/tests"))?;
|
||||||
let file_path = parser_tests_dir.join(&test_suites_file.file_name);
|
let file_path = parser_tests_dir.join(&test_suites_file.file_name);
|
||||||
fs::write(file_path, &test_suites_file.contents)?;
|
fs::write(file_path, &test_suites_file.contents)?;
|
||||||
Ok(())
|
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
1
src/ast/build.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
include!(concat!(env!("OUT_DIR"), "/src/ast/build.rs"));
|
||||||
@ -1,4 +1,4 @@
|
|||||||
// pub mod build;
|
pub mod build;
|
||||||
pub mod children;
|
pub mod children;
|
||||||
pub mod node;
|
pub mod node;
|
||||||
pub mod pretty_print;
|
pub mod pretty_print;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user