mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
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:
parent
3e7507f9d0
commit
5c299bc10c
4 changed files with 35 additions and 24 deletions
|
|
@ -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"
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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::*`
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue