fix(transformer): remove unnecessary trailing expression in object rest spread assignment#19259
Conversation
Merge activity
|
There was a problem hiding this comment.
Pull request overview
This pull request optimizes the object rest spread transformer by removing unnecessary trailing reference expressions in sequence expressions when the destructuring assignment result is not consumed.
Changes:
- Modified
object_rest_spread.rsto detect when an assignment expression is directly inside anExpressionStatement(ignoring parenthesized wrappers) - When the result is not consumed, the trailing reference is omitted from the generated sequence expression
- Updated test fixture outputs to reflect the optimized transformation
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
crates/oxc_transformer/src/es2018/object_rest_spread.rs |
Added logic to check ancestor chain and conditionally omit trailing reference when expression result is not consumed |
tasks/transform_conformance/tests/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/assignment-expression/output.js |
Updated expected output to remove trailing reference in line 3 |
tasks/transform_conformance/overrides/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/assignment-expression/output.js |
Updated expected output to remove trailing reference in line 3 |
tasks/transform_conformance/overrides/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/impure-computed/output.js |
Updated expected output to remove trailing reference in line 22 |
tasks/transform_conformance/overrides/babel-plugin-transform-object-rest-spread/test/fixtures/object-rest/template-literal-allLiterals-true-no-hoisting/output.js |
Updated expected output to remove trailing reference in line 5 |
tasks/transform_conformance/snapshots/babel.snap.md |
Updated snapshots showing improvements in symbol table accuracy (fewer binding/scope mismatches) |
Merging this PR will degrade performance by 4.02%
Performance Changes
Comparing Footnotes
|
…st spread assignment (#19259) ## Summary - Skip the trailing reference (e.g. `_c`) in the generated sequence expression when the destructuring assignment is directly inside an `ExpressionStatement`, since the expression result is not consumed - Before: `_c = c2, {a2} = _c, b2 = objectWithoutProperties(_c, ["a2"]), _c;` - After: `_c = c2, {a2} = _c, b2 = objectWithoutProperties(_c, ["a2"]);` - The trailing reference is still kept when the result is consumed, e.g. `console.log((..., _c))` Closes #7389 (issue 1) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
2358438 to
0175bc2
Compare
…st spread assignment (#19259) ## Summary - Skip the trailing reference (e.g. `_c`) in the generated sequence expression when the destructuring assignment is directly inside an `ExpressionStatement`, since the expression result is not consumed - Before: `_c = c2, {a2} = _c, b2 = objectWithoutProperties(_c, ["a2"]), _c;` - After: `_c = c2, {a2} = _c, b2 = objectWithoutProperties(_c, ["a2"]);` - The trailing reference is still kept when the result is consumed, e.g. `console.log((..., _c))` Closes #7389 (issue 1) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
0175bc2 to
deed3d8
Compare
### 🚀 Features - 429d876 semantic: Assign ast node ids during semantic build (#19263) (Boshen) - ebb80b3 ast: Add `node_id` field to all AST struct nodes (#18138) (Boshen) ### 🐛 Bug Fixes - bfb15a3 semantic: Make multi_index_vec clone panic-safe (#19299) (Boshen) - 41c50a5 transformer: Ignore invalid JSX pragma identifiers (#19296) (Boshen) - deed3d8 transformer: Remove unnecessary trailing expression in object rest spread assignment (#19259) (Boshen) - 5bdaacc transformer: Propagate source spans for sourcemap correctness (#19258) (Boshen) - 3e0e5ba isolated-declarations: Align readonly class array initializer diagnostics with tsc (#19218) (camc314) ### ⚡ Performance - c169c77 syntax: Optimize `is_identifier_name_patched` (#19386) (sapphi-red) - aa1e1a8 allocator: Inline BitSet accessors (#19331) (Boshen) - 5b90d46 semantic: Improve SoA with multi index vec (#19138) (Boshen) - 99ce2a6 isolated_declarations: Mark all diagnostic functions as `#[cold]` (#19279) (camc314) - dd0220f transformer: Remove TS-only nodes earlier in `enter_statements` (#19166) (Dunqing) - e5baf60 isolated-declarations: Replace hash collections with index-based Vec (#19221) (Dunqing) ### 📚 Documentation - 569aa61 rust: Add missing rustdocs and remove missing_docs lint attrs (#19306) (Boshen)
Summary
_c) in the generated sequence expression when the destructuring assignment is directly inside anExpressionStatement, since the expression result is not consumed_c = c2, {a2} = _c, b2 = objectWithoutProperties(_c, ["a2"]), _c;_c = c2, {a2} = _c, b2 = objectWithoutProperties(_c, ["a2"]);console.log((..., _c))Closes #7389 (issue 1)
🤖 Generated with Claude Code