Skip to content

perf(transformer): avoid cloning refresh options#24191

Merged
graphite-app[bot] merged 1 commit into
mainfrom
codex/avoid-cloning-refresh-options
Jul 6, 2026
Merged

perf(transformer): avoid cloning refresh options#24191
graphite-app[bot] merged 1 commit into
mainfrom
codex/avoid-cloning-refresh-options

Conversation

@camc314

@camc314 camc314 commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Summary

Avoid cloning React Refresh options while creating the JSX transformer. Jsx::new now takes the optional configuration from JsxOptions and supplies a reference to ReactRefresh.

ReactRefresh derives its configured identifiers and emit_full_signatures directly from that optional reference, retaining the existing $RefreshReg$/$RefreshSig$ defaults when no options are provided. This removes clone work from transformer initialization without changing behavior.

@camc314
camc314 requested a review from Dunqing as a code owner July 5, 2026 17:11
Copilot AI review requested due to automatic review settings July 5, 2026 17:11
@github-actions github-actions Bot added the A-transformer Area - Transformer / Transpiler label Jul 5, 2026
@camc314
camc314 force-pushed the codex/avoid-cloning-refresh-options branch from 05a9254 to abe850d Compare July 5, 2026 17:14

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 optimizes JSX transformer initialization by avoiding cloning React Refresh options and instead passing an optional reference into ReactRefresh, preserving the existing default $RefreshReg$/$RefreshSig$ behavior when no options are provided.

Changes:

  • Update ReactRefresh::new to accept Option<&ReactRefreshOptions> and derive identifiers/defaults without cloning.
  • Move Jsx::new to take ownership of options.refresh and pass it by reference into ReactRefresh.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
crates/oxc_transformer/src/jsx/refresh.rs Adjusts ReactRefresh construction to accept optional options by reference and keep defaults when absent.
crates/oxc_transformer/src/jsx/mod.rs Stops cloning refresh options by taking ownership and forwarding an Option<&...> into ReactRefresh.

Comment thread crates/oxc_transformer/src/jsx/mod.rs
@codspeed-hq

codspeed-hq Bot commented Jul 5, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 52 untouched benchmarks
⏩ 19 skipped benchmarks1


Comparing codex/avoid-cloning-refresh-options (1cd7552) with main (bf1a151)

Open in CodSpeed

Footnotes

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

@camc314
camc314 requested a review from overlookmotel as a code owner July 5, 2026 17:17
@camc314 camc314 self-assigned this Jul 5, 2026
@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Jul 5, 2026

camc314 commented Jul 5, 2026

Copy link
Copy Markdown
Contributor Author

Merge activity

  • Jul 5, 5:18 PM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jul 5, 5:18 PM UTC: This pull request can not be added to the Graphite merge queue. Please try rebasing and resubmitting to merge when ready.
  • Jul 5, 5:18 PM UTC: Graphite disabled "merge when ready" on this PR due to: a merge conflict with the target branch; resolve the conflict and try again..
  • Jul 5, 5:18 PM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jul 5, 5:38 PM UTC: camc314 added this pull request to the Graphite merge queue.
  • Jul 5, 5:45 PM UTC: The Graphite merge queue couldn't merge this PR because it was not satisfying all requirements (Failed CI: 'Allocations').
  • Jul 6, 8:55 AM UTC: The merge label '0-merge' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • Jul 6, 8:55 AM UTC: camc314 added this pull request to the Graphite merge queue.
  • Jul 6, 9:06 AM UTC: Merged by the Graphite merge queue.

@camc314
camc314 force-pushed the codex/avoid-cloning-refresh-options branch from 24ce024 to 45a4dfa Compare July 5, 2026 17:34
graphite-app Bot pushed a commit that referenced this pull request Jul 5, 2026
## Summary

Avoid cloning React Refresh options while creating the JSX transformer. `Jsx::new` now takes the optional configuration from `JsxOptions` and supplies a reference to `ReactRefresh`.

`ReactRefresh` derives its configured identifiers and `emit_full_signatures` directly from that optional reference, retaining the existing `$RefreshReg$`/`$RefreshSig$` defaults when no options are provided. This removes clone work from transformer initialization without changing behavior.
@graphite-app
graphite-app Bot force-pushed the codex/avoid-cloning-refresh-options branch from 45a4dfa to 6204427 Compare July 5, 2026 17:43
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jul 5, 2026
camc314 added a commit that referenced this pull request Jul 6, 2026
## Summary

Avoid cloning React Refresh options while creating the JSX transformer. `Jsx::new` now takes the optional configuration from `JsxOptions` and supplies a reference to `ReactRefresh`.

`ReactRefresh` derives its configured identifiers and `emit_full_signatures` directly from that optional reference, retaining the existing `$RefreshReg$`/`$RefreshSig$` defaults when no options are provided. This removes clone work from transformer initialization without changing behavior.
@camc314
camc314 force-pushed the codex/avoid-cloning-refresh-options branch from 6204427 to 1cd7552 Compare July 6, 2026 07:44
@camc314 camc314 added the 0-merge Merge with Graphite Merge Queue label Jul 6, 2026
## Summary

Avoid cloning React Refresh options while creating the JSX transformer. `Jsx::new` now takes the optional configuration from `JsxOptions` and supplies a reference to `ReactRefresh`.

`ReactRefresh` derives its configured identifiers and `emit_full_signatures` directly from that optional reference, retaining the existing `$RefreshReg$`/`$RefreshSig$` defaults when no options are provided. This removes clone work from transformer initialization without changing behavior.
@graphite-app
graphite-app Bot force-pushed the codex/avoid-cloning-refresh-options branch from 1cd7552 to c5ca77b Compare July 6, 2026 09:01
@graphite-app
graphite-app Bot merged commit c5ca77b into main Jul 6, 2026
29 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Jul 6, 2026
@graphite-app
graphite-app Bot deleted the codex/avoid-cloning-refresh-options branch July 6, 2026 09:06
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-transformer Area - Transformer / Transpiler

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants