diff --git a/packages/eslint-plugin/lib/rules/no-unused-vars.js b/packages/eslint-plugin/lib/rules/no-unused-vars.js index d7f32f15a5c1..bb09d6abd271 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 + } + ] } ] });