From b4ed564a35054234e9d4393ef538774a4ff10537 Mon Sep 17 00:00:00 2001 From: Dunqing <29533304+Dunqing@users.noreply.github.com> Date: Fri, 13 Sep 2024 06:00:48 +0000 Subject: [PATCH] fix(linter/no-unused-vars): writes to members triggering false positive (#5744) close: #5246 similar to #5722 --- .../src/rules/eslint/no_unused_vars/tests/oxc.rs | 10 ++++++++++ .../src/rules/eslint/no_unused_vars/usage.rs | 15 ++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/crates/oxc_linter/src/rules/eslint/no_unused_vars/tests/oxc.rs b/crates/oxc_linter/src/rules/eslint/no_unused_vars/tests/oxc.rs index 2cae8b7bed9e5..332b2edd5718d 100644 --- a/crates/oxc_linter/src/rules/eslint/no_unused_vars/tests/oxc.rs +++ b/crates/oxc_linter/src/rules/eslint/no_unused_vars/tests/oxc.rs @@ -41,6 +41,16 @@ fn test_vars_simple() { " const a = 0 obj[a]++; + obj[a] += 1; + ", + None, + ), + ( + " + const obj = 0 + obj.a++; + obj.a += 1; + obj.b.c++; ", None, ), diff --git a/crates/oxc_linter/src/rules/eslint/no_unused_vars/usage.rs b/crates/oxc_linter/src/rules/eslint/no_unused_vars/usage.rs index c1f81dadd1bd5..649bbf825c4cd 100644 --- a/crates/oxc_linter/src/rules/eslint/no_unused_vars/usage.rs +++ b/crates/oxc_linter/src/rules/eslint/no_unused_vars/usage.rs @@ -341,8 +341,12 @@ impl<'s, 'a> Symbol<'s, 'a> { } // When symbol is being assigned a new value, we flag the reference // as only affecting itself until proven otherwise. - AstKind::UpdateExpression(_) | AstKind::SimpleAssignmentTarget(_) => { - is_used_by_others = false; + AstKind::UpdateExpression(UpdateExpression { argument, .. }) + | AstKind::SimpleAssignmentTarget(argument) => { + // `a.b++` or `a[b] + 1` are not reassignment of `a` + if !argument.is_member_expression() { + is_used_by_others = false; + } } // RHS usage when LHS != reference's symbol is definitely used by // others @@ -412,13 +416,6 @@ impl<'s, 'a> Symbol<'s, 'a> { // a = yield a // <- still considered used b/c it's propagated to the caller // } AstKind::YieldExpression(_) => return false, - AstKind::MemberExpression(MemberExpression::ComputedMemberExpression(computed)) => { - // obj[a]++; - // ^ the reference is used as property - if computed.expression.span().contains_inclusive(ref_span) { - return false; - } - } _ => { /* continue up tree */ } } }