From 77aa1fced9d2aaac0fee275e8a60cb1b58df794a Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sat, 17 Apr 2021 06:12:06 +0530 Subject: [PATCH 1/6] Fix: highlight last write reference for no-unused-vars (fixes #14324) --- lib/rules/no-unused-vars.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/rules/no-unused-vars.js b/lib/rules/no-unused-vars.js index 32589099cf4..e15801012ec 100644 --- a/lib/rules/no-unused-vars.js +++ b/lib/rules/no-unused-vars.js @@ -624,10 +624,26 @@ module.exports = { // Report the first declaration. if (unusedVar.defs.length > 0) { + let writeReferences; + + if (unusedVar.references.length > 0) { + writeReferences = unusedVar.references.filter(ref => ref.isWrite()); + } + + let referenceToReport; + + if (unusedVar.references.length) { + + // report last write reference, https://github.com/eslint/eslint/issues/14324 + if (Array.isArray(writeReferences) && writeReferences.length) { + referenceToReport = writeReferences[writeReferences.length - 1]; + } else { + referenceToReport = unusedVar.references[unusedVar.references.length - 1]; + } + } + context.report({ - node: unusedVar.references.length ? unusedVar.references[ - unusedVar.references.length - 1 - ].identifier : unusedVar.identifiers[0], + node: unusedVar.references.length ? referenceToReport.identifier : unusedVar.identifiers[0], messageId: "unusedVar", data: unusedVar.references.some(ref => ref.isWrite()) ? getAssignedMessageData(unusedVar) From 9f413c00f65daf621c6b31987e773c6b453f37b7 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sat, 17 Apr 2021 07:00:29 +0530 Subject: [PATCH 2/6] test: updates --- tests/lib/rules/no-unused-vars.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/lib/rules/no-unused-vars.js b/tests/lib/rules/no-unused-vars.js index db041d46b89..7ee95a25499 100644 --- a/tests/lib/rules/no-unused-vars.js +++ b/tests/lib/rules/no-unused-vars.js @@ -1062,7 +1062,7 @@ ruleTester.run("no-unused-vars", rule, { code: `let myArray = [1,2,3,4].filter((x) => x == 0); myArray = myArray.filter((x) => x == 1);`, parserOptions: { ecmaVersion: 2015 }, - errors: [{ ...assignedError("myArray"), line: 2, column: 15 }] + errors: [{ ...assignedError("myArray"), line: 2, column: 5 }] }, { code: "const a = 1; a += 1;", @@ -1071,21 +1071,21 @@ ruleTester.run("no-unused-vars", rule, { }, { code: "var a = function() { a(); };", - errors: [{ ...assignedError("a"), line: 1, column: 22 }] + errors: [{ ...assignedError("a"), line: 1, column: 5 }] }, { code: "var a = function(){ return function() { a(); } };", - errors: [{ ...assignedError("a"), line: 1, column: 41 }] + errors: [{ ...assignedError("a"), line: 1, column: 5 }] }, { code: "const a = () => { a(); };", parserOptions: { ecmaVersion: 2015 }, - errors: [{ ...assignedError("a"), line: 1, column: 19 }] + errors: [{ ...assignedError("a"), line: 1, column: 7 }] }, { code: "const a = () => () => { a(); };", parserOptions: { ecmaVersion: 2015 }, - errors: [{ ...assignedError("a"), line: 1, column: 25 }] + errors: [{ ...assignedError("a"), line: 1, column: 7 }] }, { From 8766edeb96da3b1778e9e8ec0255d284dab76945 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Sat, 17 Apr 2021 07:36:20 +0530 Subject: [PATCH 3/6] Chore: add test case --- tests/lib/rules/no-unused-vars.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/lib/rules/no-unused-vars.js b/tests/lib/rules/no-unused-vars.js index 7ee95a25499..b6b41accd27 100644 --- a/tests/lib/rules/no-unused-vars.js +++ b/tests/lib/rules/no-unused-vars.js @@ -1087,6 +1087,13 @@ ruleTester.run("no-unused-vars", rule, { parserOptions: { ecmaVersion: 2015 }, errors: [{ ...assignedError("a"), line: 1, column: 7 }] }, + + // https://github.com/eslint/eslint/issues/14324 + { + code: "let x = [];\nx = x.concat(x);", + parserOptions: { ecmaVersion: 2015 }, + errors: [{ ...assignedError("x"), line: 2, column: 1 }] + }, { code: `let a = 'a'; From 616e78e8ea570a9a97d83b618492d6ac3ed155a7 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 22 Apr 2021 07:11:00 +0530 Subject: [PATCH 4/6] Fix: apply suggestions --- lib/rules/no-unused-vars.js | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/rules/no-unused-vars.js b/lib/rules/no-unused-vars.js index e15801012ec..7619be331fa 100644 --- a/lib/rules/no-unused-vars.js +++ b/lib/rules/no-unused-vars.js @@ -624,26 +624,18 @@ module.exports = { // Report the first declaration. if (unusedVar.defs.length > 0) { - let writeReferences; - if (unusedVar.references.length > 0) { - writeReferences = unusedVar.references.filter(ref => ref.isWrite()); - } + // report last write reference, https://github.com/eslint/eslint/issues/14324 + const writeReferences = unusedVar.references.filter(ref => ref.isWrite() && ref.from.variableScope === unusedVar.scope.variableScope); let referenceToReport; - if (unusedVar.references.length) { - - // report last write reference, https://github.com/eslint/eslint/issues/14324 - if (Array.isArray(writeReferences) && writeReferences.length) { - referenceToReport = writeReferences[writeReferences.length - 1]; - } else { - referenceToReport = unusedVar.references[unusedVar.references.length - 1]; - } + if (writeReferences.length > 0) { + referenceToReport = writeReferences[writeReferences.length - 1]; } context.report({ - node: unusedVar.references.length ? referenceToReport.identifier : unusedVar.identifiers[0], + node: referenceToReport ? referenceToReport.identifier : unusedVar.identifiers[0], messageId: "unusedVar", data: unusedVar.references.some(ref => ref.isWrite()) ? getAssignedMessageData(unusedVar) From 2fea2dae6ecf08d0c01812600a00df6de3ef6a41 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 22 Apr 2021 07:23:17 +0530 Subject: [PATCH 5/6] Chore: update tests --- tests/lib/rules/no-unused-vars.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/rules/no-unused-vars.js b/tests/lib/rules/no-unused-vars.js index b6b41accd27..d0812030bab 100644 --- a/tests/lib/rules/no-unused-vars.js +++ b/tests/lib/rules/no-unused-vars.js @@ -1105,7 +1105,7 @@ ruleTester.run("no-unused-vars", rule, { } }`, parserOptions: { ecmaVersion: 2020 }, - errors: [{ ...definedError("foo"), line: 3, column: 22 }, { ...assignedError("a"), line: 6, column: 21 }] + errors: [{ ...assignedError("a"), line: 2, column: 13 }, { ...definedError("foo"), line: 3, column: 22 }] }, { code: `let c = 'c' From 54a96c1e6fa47bfd21ee4e697f286915f4cf19f1 Mon Sep 17 00:00:00 2001 From: Nitin Kumar Date: Thu, 22 Apr 2021 07:32:16 +0530 Subject: [PATCH 6/6] Chore: more tests --- tests/lib/rules/no-unused-vars.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/lib/rules/no-unused-vars.js b/tests/lib/rules/no-unused-vars.js index d0812030bab..423afa167b8 100644 --- a/tests/lib/rules/no-unused-vars.js +++ b/tests/lib/rules/no-unused-vars.js @@ -1107,6 +1107,24 @@ ruleTester.run("no-unused-vars", rule, { parserOptions: { ecmaVersion: 2020 }, errors: [{ ...assignedError("a"), line: 2, column: 13 }, { ...definedError("foo"), line: 3, column: 22 }] }, + { + code: `let foo; + init(); + foo = foo + 2; + function init() { + foo = 1; + }`, + parserOptions: { ecmaVersion: 2020 }, + errors: [{ ...assignedError("foo"), line: 3, column: 13 }] + }, + { + code: `function foo(n) { + if (n < 2) return 1; + return n * foo(n - 1); + }`, + parserOptions: { ecmaVersion: 2020 }, + errors: [{ ...definedError("foo"), line: 1, column: 10 }] + }, { code: `let c = 'c' c = 10