feat(ast): implement ReplaceWith on all AST types#24013
Conversation
Merging this PR will degrade performance by 48.27%
|
| Mode | Benchmark | BASE |
HEAD |
Efficiency | |
|---|---|---|---|---|---|
| ❌ | Simulation | react_compiler[react.development.js] |
134.1 µs | 1,024.2 µs | -86.91% |
| ❌ | Simulation | react_compiler[binder.ts] |
349 µs | 2,611.1 µs | -86.63% |
| ❌ | Simulation | react_compiler[kitchen-sink.tsx] |
3.6 ms | 19.3 ms | -81.31% |
| ⚡ | Simulation | linter[App.tsx] |
114.5 ms | 100.4 ms | +14.08% |
| ⚡ | Simulation | linter[binder.ts] |
30.8 ms | 27.2 ms | +13.53% |
| ⚡ | Simulation | linter[kitchen-sink.tsx] |
181.5 ms | 166.1 ms | +9.32% |
| ⚡ | Simulation | linter[react.development.js] |
14.5 ms | 13.5 ms | +7.21% |
| ⚡ | Simulation | codegen[RadixUIAdoptionSection.jsx] |
125.6 µs | 121.7 µs | +3.26% |
Tip
Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.
Comparing om/07-01-feat_ast_implement_replacewith_on_all_ast_types (8b03eea) with om/07-01-feat_allocator_add_replacewith_trait (043d24d)2
Footnotes
-
9 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩
-
No successful run was found on
om/07-01-feat_allocator_add_replacewith_trait(9fc4b0d) during the generation of this report, so d9e8ec7 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report. ↩
There was a problem hiding this comment.
Pull request overview
This PR extends the ReplaceWith API (added in #24012) across oxc_ast by implementing oxc_allocator::ReplaceWith for all non-Copy AST node types, enabling in-place AST rewrites without allocating “dummy” nodes that get immediately overwritten.
Changes:
- Wire up a new generated derives module (
derive_replace_with) inoxc_ast. - Generate
impl ReplaceWith for ...for all relevant JS/JSX/TS/Literal AST node types. - Update AST node definitions to include
ReplaceWithin their#[generate_derive(...)]lists (and import the trait where used by generation conventions).
Reviewed changes
Copilot reviewed 5 out of 6 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| crates/oxc_ast/src/lib.rs | Registers the new generated derive_replace_with module so the impls are compiled. |
| crates/oxc_ast/src/generated/derive_replace_with.rs | Auto-generated ReplaceWith impls for AST node types. |
| crates/oxc_ast/src/ast/js.rs | Adds ReplaceWith to generated-derive lists for JS AST nodes. |
| crates/oxc_ast/src/ast/jsx.rs | Adds ReplaceWith to generated-derive lists for JSX AST nodes. |
| crates/oxc_ast/src/ast/ts.rs | Adds ReplaceWith to generated-derive lists for TS AST nodes. |
| crates/oxc_ast/src/ast/literal.rs | Adds ReplaceWith to generated-derive lists for literal AST nodes. |
24991e8 to
c6bc59b
Compare
6c56bbc to
302522e
Compare
302522e to
fcdedec
Compare
fcdedec to
043d24d
Compare
c6bc59b to
4c8d572
Compare
043d24d to
9fc4b0d
Compare
4c8d572 to
8b03eea
Compare
Merge activity
|
Implement `ReplaceWith` on all AST types which are not `Copy`. See #24012.
9fc4b0d to
7db7a29
Compare
8b03eea to
61fbf10
Compare
### 🚀 Features - 260425f semantic/examples: Include unresolved references (#24214) (camc314) - 2d9b0b3 minifier: Fold boolean-literal ternary branches in value contexts (#24110) (Dunqing) - 61fbf10 ast: Implement `ReplaceWith` on all AST types (#24013) (overlookmotel) - 7db7a29 allocator: Add `ReplaceWith` trait (#24012) (overlookmotel) - 4eb074e mangler: Add `reserved` option for names that must not be mangled (#24041) (Dunqing) - 2e62012 data_structures: Add `StringExt` trait (#24006) (overlookmotel) - 60e7160 minifier: Drop side-effect-free IIFEs whose result is unused (#23967) (Dunqing) - 26dd9e2 ast: Add method to widen inherited enum ref to parent ref (#23961) (overlookmotel) ### 🐛 Bug Fixes - e8b50ee transformer: Clean up semantics for stripped TypeScript syntax (#24180) (camc314) - d966d0b react_compiler: Remove clippy allows (#24168) (Boshen) - 854ef8d react_compiler: Compile generic functions instead of over-bailing on type-param hoisting (#24158) (Boshen) - 093586c react_compiler: Align memoization cache-slot allocation with Babel (#24157) (Boshen) - 09c8f59 react_compiler: Normalize snapshot fixture paths (#24142) (camc314) - f13df97 react_compiler: Drop stray empty statement from catch bindings (#24133) (Boshen) - cb2a505 react_compiler: Codegen destructuring reassignment targets (#24131) (Boshen) - b82c394 react_compiler: Propagate codegen invariants instead of emitting empty bodies (#24128) (Boshen) - 5771982 react_compiler: Render unchanged programs as source in fixture snapshots (#24129) (Boshen) - 4b16e1a transformer/async-to-generator: Preserve direct eval scope flags (#24136) (camc314) - 4e9194f react_compiler: Lower `delete obj.prop` to Property/ComputedDelete (#24123) (Boshen) - 0b25582 ast: Type binding node `typeAnnotation` as `TSTypeAnnotation | null` (#23113) (Boshen) - 018c0e5 transformer: Hoist lowered async declarations (#22770) (camc314) - 652fbaf mangler: Keep names of destructured exported bindings (#24036) (Dunqing) - e274415 minifier: Don't drop global calls that throw despite pure arguments (#23917) (Dunqing) - 59abb30 minifier: Only merge string literals in `try_fold_add` when the inner operator is `+` (#23622) (Jerry Zhao) ### ⚡ Performance - c5ca77b transformer: Avoid cloning refresh options (#24191) (camc314) - bf1a151 react_compiler: Compile out debug printers (#24184) (Boshen) - abb44a0 transformer: Build fixed object-rest arguments (#24190) (camc314) - a4db731 isolated_declarations: Use `ReplaceWith` instead of `TakeIn` (#24016) (overlookmotel) - ff10855 transformer: Use `ReplaceWith` instead of `TakeIn` (#24015) (overlookmotel) - bd49aff ecmascript: Avoid heap-allocating Math.min/max/imul operands (#23941) (Lawrence Lin) - e4b708b react_compiler: Skip compiled files before prefilters (#24171) (Boshen) - c59f2fe rust: Return impl ExactSizeIterator from slice-backed accessors (#24144) (Boshen) - 5d6d04a codegen: SWAR-skip boring byte runs in sourcemap line/column scan (#24023) (Boshen) - a55e0be traverse: Reduce string operations in `get_var_name_from_node` (#24007) (overlookmotel) - e6d48e1 transformer/nullish_coalescing: Move cold path into separate function (#23989) (overlookmotel) - c4e35b5 transformer/object_rest_spread: Pre-allocate capacity in `Vec` (#23988) (overlookmotel) - 527b8e5 transformer/decorators: Narrow type earlier (#23987) (overlookmotel) ### 📚 Documentation - 30d17f5 allocator: Clarify docs for `TakeIn::take_in_box` (#24093) (overlookmotel) - 675e6a8 ast: Correct doc comment for `PrivateFieldExpression` (#24008) (overlookmotel) - e4c30e6 minifier: Explain what `dce` mode means (#23994) (Dunqing) - 37cbf88 ast_macros: Document fields of `StructDetails` (#23959) (overlookmotel) - 4de3e54 ast: Correct doc comment (#23948) (overlookmotel) Co-authored-by: Boshen <[email protected]>

Implement
ReplaceWithon all AST types which are notCopy. See #24012.