diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index a4c82fb2ced27..4c2df4ae82c98 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -2008,7 +2008,15 @@ impl<'a> SemanticBuilder<'a> { | AstKind::PropertyKey(_) => { self.current_reference_flags = ReferenceFlags::empty(); } - AstKind::AssignmentTarget(_) => self.current_reference_flags -= ReferenceFlags::Write, + AstKind::AssignmentTarget(_) =>{ + // Handle nested assignment targets like `({a: b} = obj)` + if !matches!( + self.nodes.parent_kind(self.current_node_id), + Some(AstKind::ObjectAssignmentTarget(_) | AstKind::ArrayAssignmentTarget(_)) + ) { + self.current_reference_flags -= ReferenceFlags::Write; + } + }, AstKind::LabeledStatement(_) => self.unused_labels.mark_unused(self.current_node_id), _ => {} } diff --git a/crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.snap b/crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.snap new file mode 100644 index 0000000000000..54fa1357df197 --- /dev/null +++ b/crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.snap @@ -0,0 +1,40 @@ +--- +source: crates/oxc_semantic/tests/main.rs +input_file: crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.ts +--- +[ + { + "children": [], + "flags": "ScopeFlags(StrictMode | Top)", + "id": 0, + "node": "Program", + "symbols": [ + { + "flags": "SymbolFlags(BlockScopedVariable)", + "id": 0, + "name": "y", + "node": "VariableDeclarator(y)", + "references": [ + { + "flags": "ReferenceFlags(Write)", + "id": 0, + "name": "y", + "node_id": 10 + }, + { + "flags": "ReferenceFlags(Write)", + "id": 1, + "name": "y", + "node_id": 23 + }, + { + "flags": "ReferenceFlags(Write)", + "id": 2, + "name": "y", + "node_id": 40 + } + ] + } + ] + } +] diff --git a/crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.ts b/crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.ts new file mode 100644 index 0000000000000..9cff2be95486f --- /dev/null +++ b/crates/oxc_semantic/tests/fixtures/oxc/assignment/nested-assignment.ts @@ -0,0 +1,4 @@ +let y; +({ y } = {}); +({ 0: {}, y } = {0: {}}); +([[], y] = [[]]) \ No newline at end of file