refactor(ast_tools): move JS file header creation (#6897)

Move creation of generated JS/TS file headers out of individual generators.
This commit is contained in:
overlookmotel 2024-10-25 18:09:50 +00:00
parent 3e7507f9d0
commit 5c299bc10c
4 changed files with 35 additions and 24 deletions

View file

@ -61,7 +61,7 @@ impl From<GeneratorOutput> for SideEffect {
fn from(output: GeneratorOutput) -> Self {
match output {
GeneratorOutput::Rust { path, tokens } => Self::from((path, tokens)),
GeneratorOutput::Text { path, content } => Self { path, content: content.into() },
GeneratorOutput::Javascript { path, code } => Self { path, content: code.into() },
}
}
}
@ -244,7 +244,7 @@ pub trait CodegenBase {
}
/// Creates a generated file warning + required information for a generated file.
pub fn generate_header(file_path: &str) -> TokenStream {
pub fn generate_rust_header(file_path: &str) -> TokenStream {
let file_path = file_path.replace('\\', "/");
// TODO: Add generation date, AST source hash, etc here.
@ -255,3 +255,14 @@ pub fn generate_header(file_path: &str) -> TokenStream {
//!@@line_break
}
}
/// Creates a generated file warning + required information for a generated file.
pub fn generate_javascript_header(file_path: &str) -> String {
let file_path = file_path.replace('\\', "/");
// TODO: Add generation date, AST source hash, etc here.
format!(
"// Auto-generated code, DO NOT EDIT DIRECTLY!\n\
// To edit this generated file you have to edit `{file_path}`\n\n"
)
}

View file

@ -6,7 +6,7 @@ use proc_macro2::TokenStream;
use rustc_hash::{FxHashMap, FxHashSet};
use crate::{
codegen::{generate_header, CodegenBase, LateCtx},
codegen::{generate_rust_header, CodegenBase, LateCtx},
schema::TypeDef,
Result,
};
@ -44,7 +44,7 @@ pub trait Derive: CodegenBase {
// Standard methods
fn template(module_paths: Vec<&str>, impls: TokenStream) -> TokenStream {
let header = generate_header(Self::file_path());
let header = generate_rust_header(Self::file_path());
let prelude = Self::prelude();
// from `x::y::z` to `crate::y::z::*`

View file

@ -4,7 +4,7 @@ use proc_macro2::TokenStream;
use quote::quote;
use crate::{
codegen::{generate_header, CodegenBase, LateCtx},
codegen::{generate_javascript_header, generate_rust_header, CodegenBase, LateCtx},
Result,
};
@ -23,7 +23,7 @@ pub use visit::{VisitGenerator, VisitMutGenerator};
#[derive(Debug, Clone)]
pub enum GeneratorOutput {
Rust { path: PathBuf, tokens: TokenStream },
Text { path: PathBuf, content: String },
Javascript { path: PathBuf, code: String },
}
pub trait Generator: CodegenBase {
@ -36,12 +36,18 @@ pub trait Generator: CodegenBase {
fn output(&mut self, ctx: &LateCtx) -> Result<GeneratorOutput> {
let mut output = self.generate(ctx);
if let GeneratorOutput::Rust { tokens, .. } = &mut output {
let header = generate_header(Self::file_path());
*tokens = quote! {
#header
#tokens
};
match &mut output {
GeneratorOutput::Rust { tokens, .. } => {
let header = generate_rust_header(Self::file_path());
*tokens = quote! {
#header
#tokens
};
}
GeneratorOutput::Javascript { code: content, .. } => {
let header = generate_javascript_header(Self::file_path());
*content = format!("{header}{content}");
}
}
Ok(output)

View file

@ -24,14 +24,7 @@ define_generator!(TypescriptGenerator);
impl Generator for TypescriptGenerator {
fn generate(&mut self, ctx: &LateCtx) -> GeneratorOutput {
let file = file!().replace('\\', "/");
let mut content = format!(
"\
// Auto-generated code, DO NOT EDIT DIRECTLY!\n\
// To edit this generated file you have to edit `{file}`\n\n\
{CUSTOM_TYPESCRIPT}\n\
"
);
let mut code = format!("{CUSTOM_TYPESCRIPT}\n");
for def in ctx.schema() {
if !def.generates_derive("ESTree") {
@ -43,12 +36,13 @@ impl Generator for TypescriptGenerator {
};
let Some(ts_type_def) = ts_type_def else { continue };
content.push_str(&ts_type_def);
content.push_str("\n\n");
code.push_str(&ts_type_def);
code.push_str("\n\n");
}
GeneratorOutput::Text {
GeneratorOutput::Javascript {
path: output(crate::TYPESCRIPT_PACKAGE, "types.d.ts"),
content: format_typescript(&content),
code: format_typescript(&code),
}
}
}