From 7ba022fa423b84ed6b359cac3c408c069dbbdfc6 Mon Sep 17 00:00:00 2001 From: Armano Date: Mon, 21 Jan 2019 06:45:28 +0100 Subject: [PATCH 1/2] fix(eslint-plugin): improve detection of used vars in heritage --- .../eslint-plugin/lib/rules/no-unused-vars.js | 30 ++++++++- .../tests/lib/rules/no-unused-vars.js | 65 +++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/lib/rules/no-unused-vars.js b/packages/eslint-plugin/lib/rules/no-unused-vars.js index d7f32f15a5c1..04ff0ed3a972 100644 --- a/packages/eslint-plugin/lib/rules/no-unused-vars.js +++ b/packages/eslint-plugin/lib/rules/no-unused-vars.js @@ -45,6 +45,25 @@ module.exports = Object.assign({}, baseRule, { } } + /** + * Mark heritage clause as used + * @param node The node currently being traversed + * @returns {void} + */ + function markHeritageAsUsed(node) { + switch (node.type) { + case 'Identifier': + context.markVariableAsUsed(node.name); + break; + case 'MemberExpression': + markHeritageAsUsed(node.object); + break; + case 'CallExpression': + markHeritageAsUsed(node.callee); + break; + } + } + //---------------------------------------------------------------------- // Public //---------------------------------------------------------------------- @@ -54,8 +73,15 @@ module.exports = Object.assign({}, baseRule, { 'TSTypeReference Identifier'(node) { context.markVariableAsUsed(node.name); }, - 'TSClassImplements Identifier'(node) { - context.markVariableAsUsed(node.name); + TSInterfaceHeritage(node) { + if (node.expression) { + markHeritageAsUsed(node.expression) + } + }, + TSClassImplements(node) { + if (node.expression) { + markHeritageAsUsed(node.expression) + } }, 'TSParameterProperty Identifier'(node) { // just assume parameter properties are used diff --git a/packages/eslint-plugin/tests/lib/rules/no-unused-vars.js b/packages/eslint-plugin/tests/lib/rules/no-unused-vars.js index 25410bbf2701..c197adff8ee1 100644 --- a/packages/eslint-plugin/tests/lib/rules/no-unused-vars.js +++ b/packages/eslint-plugin/tests/lib/rules/no-unused-vars.js @@ -541,6 +541,15 @@ declare var Foo: { new (value?: any): Object, foo(): string } + `, + ` +import foo from 'foo'; +export interface Bar extends foo.i18n {} + `, + ` +import foo from 'foo'; +import bar from 'foo'; +export interface Bar extends foo.i18n {} ` ], @@ -763,6 +772,62 @@ enum FormFieldIds { column: 6 } ] + }, + { + code: ` +import test from 'test'; +import baz from 'baz'; +export interface Bar extends baz.test {} + `, + errors: [ + { + message: "'test' is defined but never used.", + line: 2, + column: 8 + } + ] + }, + { + code: ` +import test from 'test'; +import baz from 'baz'; +export interface Bar extends baz().test {} + `, + errors: [ + { + message: "'test' is defined but never used.", + line: 2, + column: 8 + } + ] + }, + { + code: ` +import test from 'test'; +import baz from 'baz'; +export class Bar implements baz.test {} + `, + errors: [ + { + message: "'test' is defined but never used.", + line: 2, + column: 8 + } + ] + }, + { + code: ` +import test from 'test'; +import baz from 'baz'; +export class Bar implements baz().test {} + `, + errors: [ + { + message: "'test' is defined but never used.", + line: 2, + column: 8 + } + ] } ] }); From 158721a1a7d181937550705afc0173d6d3267ed0 Mon Sep 17 00:00:00 2001 From: Armano Date: Mon, 21 Jan 2019 06:50:56 +0100 Subject: [PATCH 2/2] chore(eslint-plugin): linting errors --- packages/eslint-plugin/lib/rules/no-unused-vars.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/lib/rules/no-unused-vars.js b/packages/eslint-plugin/lib/rules/no-unused-vars.js index 04ff0ed3a972..bb09d6abd271 100644 --- a/packages/eslint-plugin/lib/rules/no-unused-vars.js +++ b/packages/eslint-plugin/lib/rules/no-unused-vars.js @@ -75,12 +75,12 @@ module.exports = Object.assign({}, baseRule, { }, TSInterfaceHeritage(node) { if (node.expression) { - markHeritageAsUsed(node.expression) + markHeritageAsUsed(node.expression); } }, TSClassImplements(node) { if (node.expression) { - markHeritageAsUsed(node.expression) + markHeritageAsUsed(node.expression); } }, 'TSParameterProperty Identifier'(node) {