Skip to content

fix(transformer/object-rest-spread): use hoisted scope for for-of temp refs#22347

Merged
graphite-app[bot] merged 1 commit into
mainfrom
codex/fix-object-rest-for-of-hoist-scope
May 12, 2026
Merged

fix(transformer/object-rest-spread): use hoisted scope for for-of temp refs#22347
graphite-app[bot] merged 1 commit into
mainfrom
codex/fix-object-rest-for-of-hoist-scope

Conversation

@camc314

@camc314 camc314 commented May 12, 2026

Copy link
Copy Markdown
Contributor

The transform rewrites cases like:

for ({ ...rest } of [{}]) {}

to use a generated var binding in the loop head:

for (var _ref of [{}]) {
  // ...
}

Previously, the generated _ref binding was being created in the loop statment scope (current_scope_id), this is incorrect because it is being emitted as var. The rebuilt semantic correctly shows it being hoisted into the current var-hoist scope.

Copilot AI review requested due to automatic review settings May 12, 2026 08:05
@github-actions github-actions Bot added the A-transformer Area - Transformer / Transpiler label May 12, 2026
@camc314 camc314 changed the title fix(transformer/object-rest-spread): hoist for-of temp refs fix(transformer/object-rest-spread): use hoisted scope for for-of temp refs May 12, 2026

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 fixes scope hoisting for the temporary ref binding introduced when transforming for-in / for-of statement left-hand patterns that contain nested object rest/spread, ensuring the generated temp variable is bound in the correct hoist (function) scope for semantic consistency.

Changes:

  • Hoist the generated ref binding to ctx.current_hoist_scope_id() when rewriting for-in/for-of left-hand targets containing object rest.
  • Update semantic coverage snapshots reflecting improved pass counts and removal of several prior scope/binding mismatch errors.

Reviewed changes

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

File Description
crates/oxc_transformer/src/es2018/object_rest_spread.rs Generates the temp ref binding in the current hoist scope during for-statement left rewrites.
tasks/coverage/snapshots/semantic_typescript.snap Snapshot update reflecting improved semantic results (fewer transformer/rebuild mismatches).
tasks/coverage/snapshots/semantic_test262.snap Snapshot update reflecting improved semantic results (fewer transformer/rebuild mismatches).

@codspeed-hq

codspeed-hq Bot commented May 12, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 44 untouched benchmarks
⏩ 7 skipped benchmarks1


Comparing codex/fix-object-rest-for-of-hoist-scope (e6b029f) with main (055cc61)2

Open in CodSpeed

Footnotes

  1. 7 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 main (80558c3) during the generation of this report, so 055cc61 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@camc314 camc314 added 0-merge Merge with Graphite Merge Queue labels May 12, 2026
@camc314 camc314 self-assigned this May 12, 2026

camc314 commented May 12, 2026

Copy link
Copy Markdown
Contributor Author

Merge activity

…emp refs (#22347)

The transform rewrites cases like:

```js
for ({ ...rest } of [{}]) {}
```

to use a generated `var` binding in the loop head:

```js
for (var _ref of [{}]) {
  // ...
}
```

Previously, the generated `_ref` binding was being created in the loop statment scope (`current_scope_id`), this is incorrect because it is being emitted as `var`. The rebuilt semantic correctly shows it being hoisted into the current var-hoist scope.
@graphite-app graphite-app Bot force-pushed the codex/fix-object-rest-for-of-hoist-scope branch from e6b029f to c3ceb4a Compare May 12, 2026 08:20
@graphite-app graphite-app Bot merged commit c3ceb4a into main May 12, 2026
28 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label May 12, 2026
@graphite-app graphite-app Bot deleted the codex/fix-object-rest-for-of-hoist-scope branch May 12, 2026 08:25
overlookmotel added a commit that referenced this pull request May 15, 2026
### 🚀 Features

- bc91a17 codegen: Expose `Codegen::with_source_type` method (#22432)
(camc314)

### 🐛 Bug Fixes

- 5ac7e79 minifier: Drop unused-var-init pure IIFEs and preserve
annotation for downstream (#22349) (Dunqing)
- 4ab57eb allocator: Fixed-size allocators use `VirtualAlloc` on Windows
(#22124) (overlookmotel)
- 66d77eb allocator: Fix segfault on Linux MUSL with fixed-size
allocators (#22388) (overlookmotel)
- b8fbc1f transformer/object-rest-spread: Correct scope id when moving
bindings (#22419) (camc314)
- 18edc2c codegen: Keep `Object.defineProperty` property name as plain
string in minify (#22400) (Dunqing)
- dda33de transformer/explicit-resource-management: Align lexical
binding scopes (#22320) (camc314)
- 8e79de8 transformer: Preserve for-await statement bodies (#22361)
(camc314)
- 0cba210 transformer/class: Replace `new.target` in static blocks
(#22360) (camc314)
- 67ab1c9 transformer/es2018/for-await: Hoist for-await generated
bindings (#22355) (camc314)
- c3ceb4a transformer/object-rest-spread: Use hoisted scope for `for-of`
temp refs (#22347) (camc314)

### ⚡ Performance

- 73a9043 allocator/bitset: Avoid temp heap `String` allocation (#22403)
(camc314)
- 8b2f4f9 transformer/object-rest-spread: Collect `Vec<SymbolId` over
`Vec<BindingIdentifier>` (#22418) (camc314)
- 83679ea parser: Split TriviaBuilder::handle_token hot/cold paths
(#22415) (Boshen)
- 2c7d781 codegen: Inline identifier-name accessors (#22411) (Boshen)
- 618bc76 diagnostics: Inline `OxcDiagnosticInner` to avoid heap
allocation (#22406) (Boshen)
- 0b4e158 parser: Reserve cap `2` for sequence expressions vec (#22374)
(camc314)
- 5f3bdd0 codegen: Add `#[inline]` to `code`, `code_len` (#22373)
(camc314)

Co-authored-by: overlookmotel <[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