From c666e91316591d4908d4696fdf2a8d4bb16ce1a2 Mon Sep 17 00:00:00 2001 From: Matthew Preble Date: Thu, 8 Oct 2020 17:22:57 -0500 Subject: [PATCH 1/3] fix(eslint-plugin): [no-unused-vars] fix false positives for duplicated names #2595 --- .../eslint-plugin/src/rules/no-unused-vars.ts | 32 +++++++++++-------- .../tests/rules/no-unused-vars.test.ts | 14 ++++++++ 2 files changed, 32 insertions(+), 14 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-unused-vars.ts b/packages/eslint-plugin/src/rules/no-unused-vars.ts index 7239982c9356..8753452dd097 100644 --- a/packages/eslint-plugin/src/rules/no-unused-vars.ts +++ b/packages/eslint-plugin/src/rules/no-unused-vars.ts @@ -1,7 +1,7 @@ import { - TSESTree, - TSESLint, AST_NODE_TYPES, + TSESLint, + TSESTree, } from '@typescript-eslint/experimental-utils'; import { PatternVisitor } from '@typescript-eslint/scope-manager'; import baseRule from 'eslint/lib/rules/no-unused-vars'; @@ -327,18 +327,22 @@ export default util.createRule({ break; } - const scope = context.getScope(); - const { variableScope } = scope; - if (variableScope !== scope) { - for (const id of identifiers) { - const superVar = variableScope.set.get(id.name); - if (superVar) { - superVar.eslintUsed = true; - } - } - } else { - for (const id of identifiers) { - context.markVariableAsUsed(id.name); + let scope = context.getScope(); + const shouldUseUpperScope = [ + AST_NODE_TYPES.TSModuleDeclaration, + AST_NODE_TYPES.TSDeclareFunction, + ].includes(node.type); + + if (scope.variableScope !== scope) { + scope = scope.variableScope; + } else if (shouldUseUpperScope && scope.upper) { + scope = scope.upper; + } + + for (const id of identifiers) { + const superVar = scope.set.get(id.name); + if (superVar) { + superVar.eslintUsed = true; } } } diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts index e22f9eb2ba7c..2a4de1d15a0d 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts @@ -886,6 +886,20 @@ export declare namespace Foo { } } `, + { + code: ` +declare namespace A { + export interface A {}; +} + `, + filename: 'foo.d.ts', + }, + { + code: ` +declare function A(A: string) {} + `, + filename: 'foo.d.ts', + }, ], invalid: [ From 53a2e061893e1ed4503c8e85afd311a2c95a26a8 Mon Sep 17 00:00:00 2001 From: Matthew Preble Date: Fri, 9 Oct 2020 14:00:13 -0500 Subject: [PATCH 2/3] fix(eslint-plugin): [no-unused-vars] lint fixes --- .../eslint-plugin/tests/rules/no-unused-vars.test.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts index 2a4de1d15a0d..dafb44875a20 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts @@ -889,15 +889,16 @@ export declare namespace Foo { { code: ` declare namespace A { - export interface A {}; + export interface A {} } - `, + `, filename: 'foo.d.ts', }, { code: ` -declare function A(A: string) {} - `, +declare function A(A: string) { +}; + `, filename: 'foo.d.ts', }, ], From eb33403c2178202f909b0c3d62db4a31d62390bd Mon Sep 17 00:00:00 2001 From: Matthew Preble Date: Fri, 9 Oct 2020 16:03:07 -0500 Subject: [PATCH 3/3] fix(eslint-plugin): [no-unused-vars] use valid syntax in test case --- packages/eslint-plugin/tests/rules/no-unused-vars.test.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts b/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts index dafb44875a20..b3d9c92491d2 100644 --- a/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts +++ b/packages/eslint-plugin/tests/rules/no-unused-vars.test.ts @@ -896,8 +896,7 @@ declare namespace A { }, { code: ` -declare function A(A: string) { -}; +declare function A(A: string): string; `, filename: 'foo.d.ts', },