fix(semantic): clear member write target for computed keys#22302
Conversation
There was a problem hiding this comment.
Pull request overview
This PR fixes semantic reference-flag propagation for computed member expressions so that MemberWriteTarget is applied only to the object being written to (e.g. f in f[key] = 1), and not incorrectly to the computed key expression (e.g. key in this[key] = 1). This addresses a no-param-reassign false-positive where this[key] was treated as writing through parameter key.
Changes:
- Clear
ReferenceFlags::MemberWriteTargetbefore visiting the computed key expression inComputedMemberExpression. - Add semantic snapshot fixtures covering “computed property key” vs “computed object” so the distinction is regression-tested.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| crates/oxc_semantic/src/builder.rs | Clears MemberWriteTarget before traversing computed member keys to prevent incorrect flagging of identifiers used as keys. |
| crates/oxc_semantic/tests/fixtures/oxc/js/assignments/member-write-target.js | Adds fixture cases for this[key] (key should not be MemberWriteTarget) vs f[key] (object should be MemberWriteTarget). |
| crates/oxc_semantic/tests/fixtures/oxc/js/assignments/member-write-target.snap | Updates semantic snapshot output to assert the new reference-flag behavior for computed member cases. |
Merging this PR will not alter performance
Comparing Footnotes
|
Merge activity
|
- clear `MemberWriteTarget` before visiting computed member keys - add semantic snapshot coverage for computed keys versus computed objects Fixes #22300
f5f7a33 to
a7c3e22
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 <cameron.clark@hey.com>
MemberWriteTargetbefore visiting computed member keysFixes #22300