Skip to content

feat(ast): implement ReplaceWith on all AST types#24013

Merged
graphite-app[bot] merged 1 commit into
mainfrom
om/07-01-feat_ast_implement_replacewith_on_all_ast_types
Jul 5, 2026
Merged

feat(ast): implement ReplaceWith on all AST types#24013
graphite-app[bot] merged 1 commit into
mainfrom
om/07-01-feat_ast_implement_replacewith_on_all_ast_types

Conversation

@overlookmotel

@overlookmotel overlookmotel commented Jul 1, 2026

Copy link
Copy Markdown
Member

Implement ReplaceWith on all AST types which are not Copy. See #24012.

overlookmotel commented Jul 1, 2026

Copy link
Copy Markdown
Member Author

How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent changes, fast-track this PR to the front of 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.

@codspeed-hq

codspeed-hq Bot commented Jul 1, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 48.27%

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 5 improved benchmarks
❌ 3 regressed benchmarks
✅ 54 untouched benchmarks
⏩ 9 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

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

Open in CodSpeed

Footnotes

  1. 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.

  2. 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.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) in oxc_ast.
  • Generate impl ReplaceWith for ... for all relevant JS/JSX/TS/Literal AST node types.
  • Update AST node definitions to include ReplaceWith in 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.

@overlookmotel
overlookmotel force-pushed the om/07-01-feat_ast_implement_replacewith_on_all_ast_types branch from 24991e8 to c6bc59b Compare July 1, 2026 18:01
@overlookmotel
overlookmotel force-pushed the om/07-01-feat_allocator_add_replacewith_trait branch from 6c56bbc to 302522e Compare July 1, 2026 18:01
@graphite-app
graphite-app Bot force-pushed the om/07-01-feat_allocator_add_replacewith_trait branch from 302522e to fcdedec Compare July 2, 2026 01:39
@graphite-app
graphite-app Bot requested a review from Dunqing as a code owner July 2, 2026 01:39
@graphite-app
graphite-app Bot force-pushed the om/07-01-feat_allocator_add_replacewith_trait branch from fcdedec to 043d24d Compare July 2, 2026 01:39
@graphite-app
graphite-app Bot force-pushed the om/07-01-feat_ast_implement_replacewith_on_all_ast_types branch from c6bc59b to 4c8d572 Compare July 2, 2026 01:39
@overlookmotel
overlookmotel force-pushed the om/07-01-feat_allocator_add_replacewith_trait branch from 043d24d to 9fc4b0d Compare July 2, 2026 21:50
@overlookmotel
overlookmotel force-pushed the om/07-01-feat_ast_implement_replacewith_on_all_ast_types branch from 4c8d572 to 8b03eea Compare July 2, 2026 21:50
@graphite-app graphite-app Bot added the 0-merge Merge with Graphite Merge Queue label Jul 5, 2026
@graphite-app

graphite-app Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Merge activity

Implement `ReplaceWith` on all AST types which are not `Copy`. See #24012.
@graphite-app
graphite-app Bot force-pushed the om/07-01-feat_allocator_add_replacewith_trait branch from 9fc4b0d to 7db7a29 Compare July 5, 2026 14:44
@graphite-app
graphite-app Bot requested a review from camc314 as a code owner July 5, 2026 14:44
@graphite-app
graphite-app Bot force-pushed the om/07-01-feat_ast_implement_replacewith_on_all_ast_types branch from 8b03eea to 61fbf10 Compare July 5, 2026 14:44
Base automatically changed from om/07-01-feat_allocator_add_replacewith_trait to main July 5, 2026 14:48
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jul 5, 2026
@graphite-app
graphite-app Bot merged commit 61fbf10 into main Jul 5, 2026
31 checks passed
@graphite-app
graphite-app Bot deleted the om/07-01-feat_ast_implement_replacewith_on_all_ast_types branch July 5, 2026 14:49
Boshen added a commit that referenced this pull request Jul 6, 2026
### 🚀 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]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-ast Area - AST

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants