diff --git a/crates/oxc_span/src/span.rs b/crates/oxc_span/src/span.rs index 6e74ace6b2c7e..a42e1bf1e3a5c 100644 --- a/crates/oxc_span/src/span.rs +++ b/crates/oxc_span/src/span.rs @@ -74,6 +74,7 @@ pub const SPAN: Span = Span::new(0, 0); #[ast(visit)] #[derive(Default, Clone, Copy, Eq, PartialOrd, Ord)] #[generate_derive(ESTree)] +#[builder(skip)] #[content_eq(skip)] #[estree(no_type, flatten)] pub struct Span { diff --git a/tasks/ast_tools/src/generators/ast_builder.rs b/tasks/ast_tools/src/generators/ast_builder.rs index dff5ceaf06845..ddbd85de54b40 100644 --- a/tasks/ast_tools/src/generators/ast_builder.rs +++ b/tasks/ast_tools/src/generators/ast_builder.rs @@ -14,9 +14,6 @@ use crate::{ use super::{attr_positions, define_generator, AttrLocation, AttrPart, AttrPositions}; -/// Types to omit builder method for. -const BLACK_LIST: [&str; 1] = ["Span"]; - /// Generator for `AstBuilder`. pub struct AstBuilderGenerator; @@ -28,20 +25,25 @@ impl Generator for AstBuilderGenerator { &[("builder", attr_positions!(Struct | Enum | StructField))] } - /// Parse `#[builder(default)]` on struct, enum, or struct field. + /// Parse `#[builder(default)]` on struct, enum, or struct field, + /// and `#[builder(skip)]` on struct or enum. fn parse_attr(&self, _attr_name: &str, location: AttrLocation, part: AttrPart) -> Result<()> { // No need to check attr name is `builder`, because that's the only attribute that // this generator handles. - if !matches!(part, AttrPart::Tag("default")) { - return Err(()); - } - - match location { - AttrLocation::Struct(struct_def) => struct_def.builder.is_default = true, - AttrLocation::Enum(enum_def) => enum_def.builder.is_default = true, - AttrLocation::StructField(struct_def, field_index) => { - struct_def.fields[field_index].builder.is_default = true; - } + match part { + AttrPart::Tag("default") => match location { + AttrLocation::Struct(struct_def) => struct_def.builder.is_default = true, + AttrLocation::Enum(enum_def) => enum_def.builder.is_default = true, + AttrLocation::StructField(struct_def, field_index) => { + struct_def.fields[field_index].builder.is_default = true; + } + _ => return Err(()), + }, + AttrPart::Tag("skip") => match location { + AttrLocation::Struct(struct_def) => struct_def.builder.skip = true, + AttrLocation::Enum(enum_def) => enum_def.builder.skip = true, + _ => return Err(()), + }, _ => return Err(()), } @@ -53,14 +55,12 @@ impl Generator for AstBuilderGenerator { let fns = schema .types .iter() - .filter(|&type_def| { - let has_visitor = match type_def { - TypeDef::Struct(struct_def) => struct_def.visit.has_visitor(), - TypeDef::Enum(enum_def) => enum_def.visit.has_visitor(), - _ => false, - }; - let is_blacklisted = BLACK_LIST.contains(&type_def.name()); - has_visitor && !is_blacklisted + .filter(|&type_def| match type_def { + TypeDef::Struct(struct_def) => { + !struct_def.builder.skip && struct_def.visit.has_visitor() + } + TypeDef::Enum(enum_def) => !enum_def.builder.skip && enum_def.visit.has_visitor(), + _ => false, }) .map(|type_def| generate_builder_methods(type_def, schema)) .collect::(); diff --git a/tasks/ast_tools/src/schema/extensions/ast_builder.rs b/tasks/ast_tools/src/schema/extensions/ast_builder.rs index 1c4d2f13e32a9..a6ae33665a7eb 100644 --- a/tasks/ast_tools/src/schema/extensions/ast_builder.rs +++ b/tasks/ast_tools/src/schema/extensions/ast_builder.rs @@ -1,6 +1,8 @@ /// Details for `AstBuilder` generator on a struct or enum. #[derive(Default, Debug)] pub struct AstBuilderType { + /// `true` if no builder methods should be created for this struct/enum + pub skip: bool, /// `true` if should be replaced with default value in AST builder methods pub is_default: bool, }