From 28a9ac0dabf16ca284297ac4095ee8c2ed3234ac Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Sun, 15 Mar 2020 18:49:16 +0800 Subject: [PATCH 1/3] fix(eslint-plugin): ignore assignments of unbound methods --- packages/eslint-plugin/src/rules/unbound-method.ts | 3 +++ .../eslint-plugin/tests/rules/unbound-method.test.ts | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/packages/eslint-plugin/src/rules/unbound-method.ts b/packages/eslint-plugin/src/rules/unbound-method.ts index 1e9cb9131ad..03ff0bf7ba2 100644 --- a/packages/eslint-plugin/src/rules/unbound-method.ts +++ b/packages/eslint-plugin/src/rules/unbound-method.ts @@ -241,6 +241,9 @@ function isSafeUse(node: TSESTree.Node): boolean { case AST_NODE_TYPES.BinaryExpression: return ['instanceof', '==', '!=', '===', '!=='].includes(parent.operator); + case AST_NODE_TYPES.AssignmentExpression: + return parent.operator === '='; + case AST_NODE_TYPES.TSNonNullExpression: case AST_NODE_TYPES.TSAsExpression: case AST_NODE_TYPES.TSTypeAssertion: diff --git a/packages/eslint-plugin/tests/rules/unbound-method.test.ts b/packages/eslint-plugin/tests/rules/unbound-method.test.ts index 619b681c4ea..c75ee80ab18 100644 --- a/packages/eslint-plugin/tests/rules/unbound-method.test.ts +++ b/packages/eslint-plugin/tests/rules/unbound-method.test.ts @@ -147,6 +147,9 @@ ruleTester.run('unbound-method', rule, { "typeof ContainsMethods.boundStatic === 'function';", "typeof ContainsMethods.unboundStatic === 'function';", + + 'instance.unbound = () => {};', + 'instance.unbound = instance.unbound.bind(instance);', ].map(addContainsMethodsClass), ` interface RecordA { @@ -211,6 +214,15 @@ if(myCondition || x.mightBeDefined) { console.log('hello world') } `, + // https://github.com/typescript-eslint/typescript-eslint/issues/1256 + ` + class A { + unbound(): void { + this.unbound = undefined; + this.unbound = this.unbound.bind(this); + } + } + `, ], invalid: [ { From 2cefbb71ceeb881ea53635347895f1d8afba0088 Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Mon, 16 Mar 2020 00:08:50 +0800 Subject: [PATCH 2/3] fix(eslint-plugin): should not ignore RHS of assignments --- .../eslint-plugin/src/rules/unbound-method.ts | 2 +- .../tests/rules/unbound-method.test.ts | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/unbound-method.ts b/packages/eslint-plugin/src/rules/unbound-method.ts index 03ff0bf7ba2..629aec50cca 100644 --- a/packages/eslint-plugin/src/rules/unbound-method.ts +++ b/packages/eslint-plugin/src/rules/unbound-method.ts @@ -242,7 +242,7 @@ function isSafeUse(node: TSESTree.Node): boolean { return ['instanceof', '==', '!=', '===', '!=='].includes(parent.operator); case AST_NODE_TYPES.AssignmentExpression: - return parent.operator === '='; + return parent.operator === '=' && node === parent.left; case AST_NODE_TYPES.TSNonNullExpression: case AST_NODE_TYPES.TSAsExpression: diff --git a/packages/eslint-plugin/tests/rules/unbound-method.test.ts b/packages/eslint-plugin/tests/rules/unbound-method.test.ts index c75ee80ab18..cea2457ab3e 100644 --- a/packages/eslint-plugin/tests/rules/unbound-method.test.ts +++ b/packages/eslint-plugin/tests/rules/unbound-method.test.ts @@ -346,5 +346,24 @@ const x = CommunicationError.prototype.foo; }, ], }, + { + code: ` +class Foo { + unbound() {} +} +const instance = new Foo(); + +let x; + +x = instance.unbound; // THIS SHOULD ERROR +instance.unbound = x; // THIS SHOULD NOT + `, + errors: [ + { + line: 9, + messageId: 'unbound', + }, + ], + }, ], }); From 918b6b0dee25499ed5c5af3dc0a93fa71dd38a60 Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Sun, 12 Apr 2020 22:30:25 +0800 Subject: [PATCH 3/3] fix(eslint-plugin): [unbound-method]fix lint issue --- .../eslint-plugin/tests/rules/unbound-method.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/unbound-method.test.ts b/packages/eslint-plugin/tests/rules/unbound-method.test.ts index e278441e316..733b81e16b1 100644 --- a/packages/eslint-plugin/tests/rules/unbound-method.test.ts +++ b/packages/eslint-plugin/tests/rules/unbound-method.test.ts @@ -218,12 +218,12 @@ if (myCondition || x.mightBeDefined) { `, // https://github.com/typescript-eslint/typescript-eslint/issues/1256 ` - class A { - unbound(): void { - this.unbound = undefined; - this.unbound = this.unbound.bind(this); - } - } +class A { + unbound(): void { + this.unbound = undefined; + this.unbound = this.unbound.bind(this); + } +} `, ], invalid: [