From acce6de940e2b089ff5ba59e4518a54af1682d5e Mon Sep 17 00:00:00 2001 From: Milos Djermanovic Date: Sun, 18 Aug 2019 07:47:20 +0200 Subject: [PATCH] Fix: class-methods-use-this reports 'undefined' names (#12103) --- lib/rules/class-methods-use-this.js | 10 +++++-- tests/lib/rules/class-methods-use-this.js | 35 ++++++++++++++++------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/lib/rules/class-methods-use-this.js b/lib/rules/class-methods-use-this.js index c15f32e66dc..4bf17090abc 100644 --- a/lib/rules/class-methods-use-this.js +++ b/lib/rules/class-methods-use-this.js @@ -5,6 +5,12 @@ "use strict"; +//------------------------------------------------------------------------------ +// Requirements +//------------------------------------------------------------------------------ + +const astUtils = require("./utils/ast-utils"); + //------------------------------------------------------------------------------ // Rule Definition //------------------------------------------------------------------------------ @@ -34,7 +40,7 @@ module.exports = { }], messages: { - missingThis: "Expected 'this' to be used by class method '{{name}}'." + missingThis: "Expected 'this' to be used by class {{name}}." } }, create(context) { @@ -90,7 +96,7 @@ module.exports = { node, messageId: "missingThis", data: { - name: node.parent.key.name + name: astUtils.getFunctionNameWithKind(node) } }); } diff --git a/tests/lib/rules/class-methods-use-this.js b/tests/lib/rules/class-methods-use-this.js index 89af434fd59..5238b9d68b7 100644 --- a/tests/lib/rules/class-methods-use-this.js +++ b/tests/lib/rules/class-methods-use-this.js @@ -37,49 +37,49 @@ ruleTester.run("class-methods-use-this", rule, { code: "class A { foo() {} }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { code: "class A { foo() {/**this**/} }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { code: "class A { foo() {var a = function () {this};} }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { code: "class A { foo() {var a = function () {var b = function(){this}};} }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { code: "class A { foo() {window.this} }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { code: "class A { foo() {that.this = 'this';} }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { code: "class A { foo() { () => undefined; } }", parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { @@ -87,7 +87,7 @@ ruleTester.run("class-methods-use-this", rule, { options: [{ exceptMethods: ["bar"] }], parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 14, messageId: "missingThis", data: { name: "method 'foo'" } } ] }, { @@ -95,7 +95,7 @@ ruleTester.run("class-methods-use-this", rule, { options: [{ exceptMethods: ["foo"] }], parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 34, messageId: "missingThis", data: { name: "hasOwnProperty" } } + { type: "FunctionExpression", line: 1, column: 34, messageId: "missingThis", data: { name: "method 'hasOwnProperty'" } } ] }, { @@ -103,7 +103,22 @@ ruleTester.run("class-methods-use-this", rule, { options: [{ exceptMethods: ["foo"] }], parserOptions: { ecmaVersion: 6 }, errors: [ - { type: "FunctionExpression", line: 1, column: 16, messageId: "missingThis", data: { name: "foo" } } + { type: "FunctionExpression", line: 1, column: 16, messageId: "missingThis", data: { name: "method" } } + ] + }, + { + code: "class A { foo(){} 'bar'(){} 123(){} [`baz`](){} [a](){} [f(a)](){} get quux(){} set[a](b){} *quuux(){} }", + parserOptions: { ecmaVersion: 6 }, + errors: [ + { message: "Expected 'this' to be used by class method 'foo'.", type: "FunctionExpression", column: 14 }, + { message: "Expected 'this' to be used by class method 'bar'.", type: "FunctionExpression", column: 24 }, + { message: "Expected 'this' to be used by class method '123'.", type: "FunctionExpression", column: 32 }, + { message: "Expected 'this' to be used by class method 'baz'.", type: "FunctionExpression", column: 44 }, + { message: "Expected 'this' to be used by class method.", type: "FunctionExpression", column: 52 }, + { message: "Expected 'this' to be used by class method.", type: "FunctionExpression", column: 63 }, + { message: "Expected 'this' to be used by class getter 'quux'.", type: "FunctionExpression", column: 76 }, + { message: "Expected 'this' to be used by class setter.", type: "FunctionExpression", column: 87 }, + { message: "Expected 'this' to be used by class generator method 'quuux'.", type: "FunctionExpression", column: 99 } ] } ]