feat(ast)!: add AstBuilder::template_element_escape_raw and template_element_escape_raw_with_lone_surrogates methods#23047
Conversation
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. This stack of pull requests is managed by Graphite. Learn more about stacking. |
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
Pull request overview
This PR updates the oxc_ast::AstBuilder API for TemplateElement construction by removing the escape_raw: bool parameter from the generated builder methods and introducing dedicated escape-aware builder methods. This aligns the generator with a more mechanical codegen approach while keeping an explicit API for programmatic callers that need escaping.
Changes:
- Removed the
escape_rawparameter fromAstBuilder::template_elementandAstBuilder::template_element_with_lone_surrogates(and the generator special-casing that produced it). - Added
AstBuilder::template_element_escape_rawandAstBuilder::template_element_escape_raw_with_lone_surrogates, and moved the escaping helper intoast_builder_impl.rs. - Updated parser/minifier/transformer usages and the codegen integration test to match the new builder signatures.
Reviewed changes
Copilot reviewed 7 out of 8 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tasks/ast_tools/src/generators/ast_builder.rs | Removes TemplateElement-specific escape_raw parameter generation and helper emission. |
| crates/oxc_transformer/src/plugins/styled_components.rs | Updates tests to call the updated template_element_with_lone_surrogates signature. |
| crates/oxc_parser/src/js/expression.rs | Drops the removed escape_raw argument from parser template element creation. |
| crates/oxc_minifier/src/peephole/replace_known_methods.rs | Updates template element construction calls after signature change. |
| crates/oxc_minifier/src/peephole/remove_unused_expression.rs | Updates template element construction calls after signature change. |
| crates/oxc_codegen/tests/integration/js.rs | Switches to template_element_escape_raw for the escaping behavior test. |
| crates/oxc_ast/src/generated/ast_builder.rs | Removes escape_raw params from generated builder methods and deletes the generated helper. |
| crates/oxc_ast/src/ast_builder_impl.rs | Adds the new escape-aware builder methods and reintroduces the escaping helper in non-generated code. |
Merge activity
|
…te_element_escape_raw_with_lone_surrogates` methods (#23047) Remove the `escape_raw` param from: - `AstBuilder::template_element` - `AstBuilder::template_element_with_lone_surrogates` This param was added in #18121, to allow automatically escaping `raw`field. Instead, add new methods: - `AstBuilder::template_element_escape_raw` - `AstBuilder::template_element_escape_raw_with_lone_surrogates` These 2 methods perform the same function - doing what `escape_raw: true` did previously. The rationale for this change is: 1. Simplifies the codegen. My feeling is that codegen should be as mechanical as possible, with behavior controlled by attributes on AST types themselves (e.g. `#[clone_in(default)]`) rather than having weird "special cases" hard-coded in the codegen. 2. Streamline the common use case (parser) where `escape_raw` was always `false`.
cf76c28 to
4c35362
Compare
…te_element_escape_raw_with_lone_surrogates` methods (#23047) Remove the `escape_raw` param from: - `AstBuilder::template_element` - `AstBuilder::template_element_with_lone_surrogates` This param was added in #18121, to allow automatically escaping `raw`field. Instead, add new methods: - `AstBuilder::template_element_escape_raw` - `AstBuilder::template_element_escape_raw_with_lone_surrogates` These 2 methods perform the same function - doing what `escape_raw: true` did previously. The rationale for this change is: 1. Simplifies the codegen. My feeling is that codegen should be as mechanical as possible, with behavior controlled by attributes on AST types themselves (e.g. `#[clone_in(default)]`) rather than having weird "special cases" hard-coded in the codegen. 2. Streamline the common use case (parser) where `escape_raw` was always `false`.
### 💥 BREAKING CHANGES - ee4dc73 ast: [**BREAKING**] Add `#[non_exhaustive]` to AST nodes (#23046) (overlookmotel) - 4c35362 ast: [**BREAKING**] Add `AstBuilder::template_element_escape_raw` and `template_element_escape_raw_with_lone_surrogates` methods (#23047) (overlookmotel) ### 🚀 Features - b846ab2 react_compiler: Integrate the Rust port of the React Compiler (#22942) (Boshen) - 5b8dd68 parser: Report TS1255 for invalid class definite assertions (#22917) (camc314) - 85efabf semantic: Make building the class table optional, off by default (#22862) (Boshen) ### 🐛 Bug Fixes - 556acdc codegen: Parenthesize TS-cast assignment targets (#23112) (Boshen) - 37169ff codegen: Don't emit space between postfix `--` and `>` when minifying (#23036) (Boshen) - a4b1bf7 codegen: Drop redundant whitespace in minified TypeScript output (#23038) (Boshen) - cf53285 parser: Report reserved type-declaration names in the parser (#23035) (Boshen) - 4e44969 ast: Fix UB in `escape_template_element_raw` (#23052) (overlookmotel) - c543154 parser: Report comma operator in JSX expression in the parser (#23030) (Boshen) - 325c94f codegen: Tighten conditional-type and constructor-type whitespace when minifying (#23033) (Boshen) - 95dd3a2 parser: Report `import type` alias to a non-external reference in the parser (#23032) (Boshen) - 90180b8 codegen: Drop space after `:` in function return type when minifying (#23028) (Boshen) - 6da876e parser: Report `abstract` private class field in the parser (#23029) (Boshen) - 28467ce codegen: Don't emit space before a postfix update operand when minifying (#23027) (Boshen) - cb29926 codegen: Drop redundant space after `export default` when minifying (#23024) (Boshen) - 62965ae codegen: Drop redundant space after `else` when minifying (#23025) (Boshen) - 989230a parser: Report compound assignment to non-simple target in the parser (#23022) (Boshen) - 06f367c parser: Report `super.#field` private access in the parser (#23014) (Boshen) - 184edef codegen: Print space before `const`/`declare` enum modifier (#23013) (Boshen) - 4d722e0 parser: Report duplicate switch `default` clause in the parser (#23012) (Boshen) - 597ed85 codegen: Parenthesize `let`/`async` for-of head target (#23008) (Boshen) - 8b631bf codegen: Remove stray space before mapped type value colon (#23010) (Boshen) - c08407e codegen: Don't over-parenthesize `in` inside an arrow in a for-init (#23009) (Boshen) - 600cd6f codegen: Parenthesize lower-precedence `TSInstantiationExpression` operand (#23007) (Boshen) - 187e1a5 codegen: Don't leak space after comment-only JSX expression container (#23006) (Boshen) - 294c473 codegen: Don't over-parenthesize `TSTypeAssertion` operand (#23004) (Boshen) - 786d96f codegen: Give `TSTypeAssertion` unary precedence (#23002) (Boshen) - 1295882 parser: Report `new.target` and `import.meta` syntax errors in the parser (#23003) (Boshen) - d727b6b codegen: Parenthesize `await` expression as base of `**` (#23001) (Boshen) - 67dfa08 codegen: Keep parentheses around `new` callees containing a call (#22997) (Boshen) - 17e7cf3 parser: Disallow unerasable `as`/`satisfies` assertions (#22986) (Boshen) - beb46d3 parser: Commit to module goal on decorated exports (#22941) (Boshen) - 49e63f7 isolated-declarations: Require annotations for satisfies initializers (#22898) (camc314) - 8c93601 isolated-declarations: Allow unknown enum initializer in non-const enum (#22900) (camc314) ### ⚡ Performance - 7d89909 parser: Peek instead of lookahead for yield disambiguation (#23071) (Boshen) - bf872f0 parser: Skip arrow lookahead for a parenthesized literal (#23070) (Boshen) - d19fc54 parser: Guard type-argument speculation behind an angle-token check (#23069) (Boshen) - 8eb5507 parser: Skip redundant member-rest re-scan on call entry (#23068) (Boshen) - 883dfc1 parser: Skip parse_call_expression_rest when no call follows (#23063) (Boshen) - b171153 parser: Peek before the await-using lookahead (#23059) (Boshen) - 56f21bd parser: Use peek_token for the TS `asserts` type predicate (#23058) (Boshen) - 68805ac parser: Use peek_token instead of checkpoint/rewind for single-token decisions (#23056) (Boshen) - 1f9d8eb ast: `AstBuilder::template_element_escape_raw` avoid allocation if no escape required (#23053) (overlookmotel) - 502b04d semantic: Move cold function redeclaration handling into `#[cold]` function (#22973) (overlookmotel) ### 📚 Documentation - 275d318 napi/minifier: Point `target` to oxc docs (#23102) (camc314) Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com>

Remove the
escape_rawparam from:AstBuilder::template_elementAstBuilder::template_element_with_lone_surrogatesThis param was added in #18121, to allow automatically escaping
rawfield.Instead, add new methods:
AstBuilder::template_element_escape_rawAstBuilder::template_element_escape_raw_with_lone_surrogatesThese 2 methods perform the same function - doing what
escape_raw: truedid previously.The rationale for this change is:
#[clone_in(default)]) rather than having weird "special cases" hard-coded in the codegen.escape_rawwas alwaysfalse.