From b721ee74d09ee465a45423bf83f60b6d5adb826e Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 28 Jun 2022 01:18:03 +0200 Subject: [PATCH 1/3] fix(eslint-plugin): [no-unused-vars] correct error to report identifier instead of reference --- .../eslint-plugin/src/rules/no-unused-vars.ts | 8 ++-- .../no-unused-vars-eslint.test.ts | 2 +- .../no-unused-vars/no-unused-vars.test.ts | 41 ++++++++++++++++--- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-unused-vars.ts b/packages/eslint-plugin/src/rules/no-unused-vars.ts index 00956e9daf93..53666907ae38 100644 --- a/packages/eslint-plugin/src/rules/no-unused-vars.ts +++ b/packages/eslint-plugin/src/rules/no-unused-vars.ts @@ -422,13 +422,13 @@ export default util.createRule({ for (const unusedVar of unusedVars) { // Report the first declaration. if (unusedVar.defs.length > 0) { + const writeRef = unusedVar.references.filter(ref => ref.isWrite()); context.report({ - node: unusedVar.references.length - ? unusedVar.references[unusedVar.references.length - 1] - .identifier + node: writeRef.length + ? writeRef[writeRef.length - 1].identifier : unusedVar.identifiers[0], messageId: 'unusedVar', - data: unusedVar.references.some(ref => ref.isWrite()) + data: writeRef.length ? getAssignedMessageData(unusedVar) : getDefinedMessageData(unusedVar), }); diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts index 14cfff7e0b9c..22d0d3081677 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts @@ -2601,7 +2601,7 @@ myArray = myArray.filter(x => x == 1); { ...assignedError('myArray'), line: 3, - column: 11, + column: 1, }, ], }, diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts index cca98d2a952b..362466ee1a0f 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars.test.ts @@ -1458,8 +1458,8 @@ namespace Foo { action: 'defined', additional: '', }, - line: 4, - column: 15, + line: 2, + column: 11, }, ], }, @@ -1490,8 +1490,8 @@ namespace Foo { action: 'defined', additional: '', }, - line: 5, - column: 17, + line: 3, + column: 13, }, ], }, @@ -1506,7 +1506,8 @@ interface Foo { errors: [ { messageId: 'unusedVar', - line: 4, + line: 2, + column: 11, data: { varName: 'Foo', action: 'defined', @@ -1523,6 +1524,7 @@ type Foo = Array; { messageId: 'unusedVar', line: 2, + column: 6, data: { varName: 'Foo', action: 'defined', @@ -1550,6 +1552,7 @@ export const ComponentFoo = () => { { messageId: 'unusedVar', line: 3, + column: 10, data: { varName: 'Fragment', action: 'defined', @@ -1577,6 +1580,7 @@ export const ComponentFoo = () => { { messageId: 'unusedVar', line: 2, + column: 8, data: { varName: 'React', action: 'defined', @@ -1604,6 +1608,7 @@ export const ComponentFoo = () => { { messageId: 'unusedVar', line: 2, + column: 8, data: { varName: 'React', action: 'defined', @@ -1624,6 +1629,7 @@ declare module 'foo' { { messageId: 'unusedVar', line: 3, + column: 8, data: { varName: 'Test', action: 'defined', @@ -1649,6 +1655,7 @@ export namespace Foo { { messageId: 'unusedVar', line: 4, + column: 13, data: { varName: 'Bar', action: 'defined', @@ -1658,6 +1665,7 @@ export namespace Foo { { messageId: 'unusedVar', line: 5, + column: 15, data: { varName: 'Baz', action: 'defined', @@ -1667,6 +1675,7 @@ export namespace Foo { { messageId: 'unusedVar', line: 6, + column: 17, data: { varName: 'Bam', action: 'defined', @@ -1676,6 +1685,7 @@ export namespace Foo { { messageId: 'unusedVar', line: 7, + column: 15, data: { varName: 'x', action: 'assigned a value', @@ -1696,7 +1706,8 @@ interface Foo { errors: [ { messageId: 'unusedVar', - line: 6, + line: 2, + column: 11, data: { varName: 'Foo', action: 'defined', @@ -1705,5 +1716,23 @@ interface Foo { }, ], }, + { + code: ` +let x = null; +x = foo(x); + `, + errors: [ + { + messageId: 'unusedVar', + line: 3, + column: 1, + data: { + varName: 'x', + action: 'assigned a value', + additional: '', + }, + }, + ], + }, ], }); From b1ede81b5c2c69bb9948a07ff366b0980cc05648 Mon Sep 17 00:00:00 2001 From: Armano Date: Tue, 28 Jun 2022 02:54:11 +0200 Subject: [PATCH 2/3] fix(eslint-plugin): [no-unused-vars] replicate fix from eslint 14335 --- .../eslint-plugin/src/rules/no-unused-vars.ts | 13 ++++-- .../no-unused-vars-eslint.test.ts | 43 ++++++++++++++++--- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-unused-vars.ts b/packages/eslint-plugin/src/rules/no-unused-vars.ts index 53666907ae38..fb16cf5786e4 100644 --- a/packages/eslint-plugin/src/rules/no-unused-vars.ts +++ b/packages/eslint-plugin/src/rules/no-unused-vars.ts @@ -422,13 +422,18 @@ export default util.createRule({ for (const unusedVar of unusedVars) { // Report the first declaration. if (unusedVar.defs.length > 0) { - const writeRef = unusedVar.references.filter(ref => ref.isWrite()); + const writeReferences = unusedVar.references.filter( + ref => + ref.isWrite() && + ref.from.variableScope === unusedVar.scope.variableScope, + ); + context.report({ - node: writeRef.length - ? writeRef[writeRef.length - 1].identifier + node: writeReferences.length + ? writeReferences[writeReferences.length - 1].identifier : unusedVar.identifiers[0], messageId: 'unusedVar', - data: writeRef.length + data: unusedVar.references.some(ref => ref.isWrite()) ? getAssignedMessageData(unusedVar) : getDefinedMessageData(unusedVar), }); diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts index 22d0d3081677..693f4d419b05 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts @@ -1753,8 +1753,8 @@ foo.forEach(item => { }, { ...assignedError('b'), - line: 4, - column: 7, + line: 2, + column: 9, }, ], }, @@ -2679,6 +2679,13 @@ const a = () => () => { }, ], }, + + // 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'; @@ -2692,20 +2699,42 @@ function foo() { `, parserOptions: { ecmaVersion: 2020 }, errors: [ + { + ...assignedError('a'), + line: 3, + column: 1, + }, { ...definedError('foo'), line: 4, column: 10, }, - { - ...assignedError('a'), - line: 7, - column: 5, - }, ], }, { code: ` +let foo; +init(); +foo = foo + 2; +function init() { + foo = 1; +} + `, + parserOptions: { ecmaVersion: 2020 }, + errors: [{ ...assignedError('foo'), line: 4, column: 1 }], + }, + { + code: ` +function foo(n) { + if (n < 2) return 1; + return n * foo(n - 1); +} + `, + parserOptions: { ecmaVersion: 2020 }, + errors: [{ ...definedError('foo'), line: 2, column: 10 }], + }, + { + code: ` let c = 'c'; c = 10; function foo1() { From 15d1ddeb989314ffa3e816a7f3c0e3ab871c82f5 Mon Sep 17 00:00:00 2001 From: Armano Date: Sun, 10 Jul 2022 20:59:38 +0200 Subject: [PATCH 3/3] test(eslint-plugin): [no-unused-vars] update tests --- .../no-unused-vars/no-unused-vars-eslint.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts index 693f4d419b05..44ffd0893779 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars/no-unused-vars-eslint.test.ts @@ -2628,8 +2628,8 @@ var a = function () { errors: [ { ...assignedError('a'), - line: 3, - column: 3, + line: 2, + column: 5, }, ], }, @@ -2644,7 +2644,7 @@ var a = function () { errors: [ { ...assignedError('a'), - line: 4, + line: 2, column: 5, }, ], @@ -2659,8 +2659,8 @@ const a = () => { errors: [ { ...assignedError('a'), - line: 3, - column: 3, + line: 2, + column: 7, }, ], }, @@ -2674,8 +2674,8 @@ const a = () => () => { errors: [ { ...assignedError('a'), - line: 3, - column: 3, + line: 2, + column: 7, }, ], }, pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy