From f8624548476125e8811cffa008b8fe6001dbf55a Mon Sep 17 00:00:00 2001 From: Kevin Phelps Date: Tue, 24 Apr 2018 18:19:39 -0500 Subject: [PATCH] fix(rule): allow super lifecycle calls fixes #573 --- src/noLifeCycleCallRule.ts | 8 ++++++-- test/noLifeCycleCallRule.spec.ts | 25 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/noLifeCycleCallRule.ts b/src/noLifeCycleCallRule.ts index a9ef60bc0..c22642ccf 100644 --- a/src/noLifeCycleCallRule.ts +++ b/src/noLifeCycleCallRule.ts @@ -49,9 +49,13 @@ export class ExpressionCallMetadataWalker extends NgWalker { } private validateCallExpression(node: ts.CallExpression): void { - const name = (node.expression as any).name; + const name = ts.isPropertyAccessExpression(node.expression) ? node.expression.name : undefined; + const expression = ts.isPropertyAccessExpression(node.expression) ? node.expression.expression : undefined; - if (!name || !lifecycleHooksMethods.has(name.text)) { + const isSuperCall = expression && expression.kind === ts.SyntaxKind.SuperKeyword; + const isLifecycleCall = name && ts.isIdentifier(name) && lifecycleHooksMethods.has(name.text as any); + + if (isSuperCall || !isLifecycleCall) { return; } diff --git a/test/noLifeCycleCallRule.spec.ts b/test/noLifeCycleCallRule.spec.ts index fc3182125..763c593bd 100644 --- a/test/noLifeCycleCallRule.spec.ts +++ b/test/noLifeCycleCallRule.spec.ts @@ -58,7 +58,7 @@ describe(ruleName, () => { } `; - it(`should fail when explicitly call ${lifecycleHookMethod}`, () => { + it(`should fail when explicitly calling ${lifecycleHookMethodCall}`, () => { assertAnnotated({ ruleName, message: `Avoid explicitly calls to lifecycle hooks in class "${className}"`, @@ -85,7 +85,28 @@ describe(ruleName, () => { } `; - it(`should pass when call ${fakeMethod} method`, () => { + it(`should pass when calling ${fakeMethod} method`, () => { + assertSuccess(ruleName, source); + }); + }); + }); + } + + // call super lifecycle hook + for (const metadataKey of metadataKeys) { + describe(metadataKey, () => { + metadataPairs[metadataKey].forEach(lifecycleHookMethod => { + const lifecycleHookMethodCall = `super.${lifecycleHookMethod}()`; + const source = ` + @${metadataKey}() + class ${className} implements ${lifecycleHookMethod.slice(2)} { + ${lifecycleHookMethod}() { + ${lifecycleHookMethodCall} + } + } + `; + + it(`should pass when explicitly calling ${lifecycleHookMethodCall}`, () => { assertSuccess(ruleName, source); }); });