From f3fa7e6e10b288624cc39db561afdc3cc2f5ba27 Mon Sep 17 00:00:00 2001 From: Maxim Belsky Date: Thu, 14 Mar 2019 21:57:44 +0300 Subject: [PATCH] Fix #4579: false positive static-this in HOC --- src/rules/staticThisRule.ts | 14 +++++++++----- test/rules/static-this/test.ts.fix | 12 ++++++++++++ test/rules/static-this/test.ts.lint | 12 ++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/rules/staticThisRule.ts b/src/rules/staticThisRule.ts index b18a5cbcb74..dc20101de98 100644 --- a/src/rules/staticThisRule.ts +++ b/src/rules/staticThisRule.ts @@ -58,13 +58,17 @@ function walk(ctx: Lint.WalkContext) { const cb = (node: ts.Node): void => { const originalParentClass = currentParentClass; - if ( - utils.isClassLikeDeclaration(node.parent) && - utils.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword) - ) { - currentParentClass = node.parent; + if (utils.isClassLikeDeclaration(node.parent)) { + currentParentClass = undefined; + + if (utils.hasModifier(node.modifiers, ts.SyntaxKind.StaticKeyword)) { + currentParentClass = node.parent; + } + ts.forEachChild(node, cb); currentParentClass = originalParentClass; + + return; } if (node.kind === ts.SyntaxKind.ThisKeyword && currentParentClass !== undefined) { diff --git a/test/rules/static-this/test.ts.fix b/test/rules/static-this/test.ts.fix index 98510a2d587..5d40d646df2 100644 --- a/test/rules/static-this/test.ts.fix +++ b/test/rules/static-this/test.ts.fix @@ -63,3 +63,15 @@ class NamedClassChild extends NamedClass { return NamedClassChild; } } + +interface Bar {} + +class Foo { + public static higherOrderComponent(): any { + return class implements Bar { + public constructor() { + console.log(this); + } + }; + } +} diff --git a/test/rules/static-this/test.ts.lint b/test/rules/static-this/test.ts.lint index fd5a7a71d0b..4666f61d9a5 100644 --- a/test/rules/static-this/test.ts.lint +++ b/test/rules/static-this/test.ts.lint @@ -73,3 +73,15 @@ class NamedClassChild extends NamedClass { ~~~~ [Use the parent class name instead of `this` when in a `static` context.] } } + +interface Bar {} + +class Foo { + public static higherOrderComponent(): any { + return class implements Bar { + public constructor() { + console.log(this); + } + }; + } +}