feat(minifier): fold Array constructor with safe spreads#22215
Conversation
Array constructor with safe spreads
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
Pull request overview
Extends the minifier’s peephole optimization that rewrites Array(...) / new Array(...) into an array literal to also handle safe cases involving spread arguments, while preserving the single-argument Array(len) special semantics.
Changes:
- Allow folding
Arrayconstructor calls containing spreads when there are at least two non-spread arguments (guaranteeing final arity ≥ 2). - Preserve behavior (no fold) for potentially unsafe spread cases like
Array(...foo, bar)/Array(foo, ...bar). - Add targeted test cases covering safe vs unsafe spread placements.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| crates/oxc_minifier/src/peephole/substitute_alternate_syntax.rs | Implements safe folding logic for Array constructor calls with spread arguments and updates element construction to preserve spreads. |
| crates/oxc_minifier/tests/peephole/substitute_alternate_syntax.rs | Adds regression/feature tests for folding behavior with various spread argument layouts. |
4b276aa to
4bd20e3
Compare
Merge activity
|
4bd20e3 to
ffe6475
Compare
### 🚀 Features - 66c9b01 transformer/typescript: Debug_assert that `enum_eval` ran in semantic (#22252) (Dunqing) - ffe6475 minifier: Fold `Array` constructor with safe spreads (#22215) (camc314) ### 🐛 Bug Fixes - d3d0b18 traverse: Handle `ChainElement::TSNonNullExpression` in `GatherNodeParts` (#22247) (leaysgur) - 4e880de transformer/object-rest-spread: Declare temp vars for computed keys (#22284) (camc314) - a7c3e22 semantic: Clear member write target for computed keys (#22302) (camc314) - 6a8852d codegen: Emit newline after legal-comment orphan flush (#22304) (Dunqing) - 5da9fda transformer/explicit-resource-management: Preserve class names (#22306) (Dunqing) - b5d970f transformer/explicit-resource-management: Preserve class names (#22290) (camc314) - bc54fd4 minifier: Keep function / class names if direct eval is present in the scope (#22241) (sapphi-red) - 7a810c0 minifier: Refresh direct eval flags after DCE (#21787) (Dunqing) - dd88726 transformer/legacy-decorator: Preserve accessor type annotation for emitDecoratorMetadata (#21966) (Dunqing) - 29a3cd7 codegen: Swap mapping/indent order for top-level decls (#22206) (Dunqing) - 73b4f40 minifier: Preserve catch binding with direct eval (#22221) (camc314) - 0e13d17 minifier: Preserve optional chain base side effects (#22219) (camc314) - 0c7c01c transformer/typescript: Inline optional-chain enum member access (#21834) (Dunqing) - a6aff7e codegen: Emit block/array/object end mapping at close char (#22200) (Dunqing) - a099b03 codegen: Emit call end mapping at `)` position, not past it (#22199) (Dunqing) - 5753774 minifier: Cap if-return ternary collapse for firefox (#21841) (Gurupungav Narayanan) - 2493bdd codegen: Correct sourcemap end mappings for closing delimiters (#22001) (Mark Dalgleish) - 3b385e2 minifier: Bail optimizing `Array` with unknown arg count (#22188) (camc314) - 9fa2122 parser: Parse array computed class keys (#22159) (camc314) ### 📚 Documentation - a4a6892 napi/parser: Correct code comment (#22278) (overlookmotel) - 9305373 oxc: Update README (#22178) (camc314) Co-authored-by: Cameron <[email protected]>
Given
new Array(a,b,...foo), the number of arguments is guarenteed to be>=2so we can perform the optimization.fixes #22194
follow on from #22188