From 329ce4008de63dcaca7ff0dbdd55cb9df7075818 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 14 Feb 2020 20:08:28 -0300 Subject: [PATCH 1/3] Make early-exit consider throwing as early exit --- rules/earlyExitRule.ts | 12 ++++++++++-- .../early-exit/throwing-is-early-exit/test.ts.lint | 8 ++++++++ .../early-exit/throwing-is-early-exit/tslint.json | 6 ++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 test/rules/early-exit/throwing-is-early-exit/test.ts.lint create mode 100644 test/rules/early-exit/throwing-is-early-exit/tslint.json diff --git a/rules/earlyExitRule.ts b/rules/earlyExitRule.ts index 2115b6c..dd6873d 100644 --- a/rules/earlyExitRule.ts +++ b/rules/earlyExitRule.ts @@ -1,4 +1,4 @@ -import { isBlock, isCaseOrDefaultClause, isIfStatement, isFunctionScopeBoundary } from 'tsutils'; +import { isBlock, isThrowStatement, isCaseOrDefaultClause, isIfStatement, isFunctionScopeBoundary } from 'tsutils'; import * as Lint from 'tslint'; import * as ts from 'typescript'; @@ -52,7 +52,7 @@ function walk(ctx: Lint.WalkContext) { const thenSize = size(thenStatement, sourceFile); if (elseStatement === undefined) { - if (isLarge(thenSize)) + if (isLarge(thenSize) || !isThrowStatement(thenStatement)) fail(failureString(exit)); return; } @@ -92,6 +92,14 @@ function size(node: ts.Node, sourceFile: ts.SourceFile): number { : diff(node.getStart(sourceFile), node.end, sourceFile); } +function isThrow(node: ts.Node): boolean { + return isBlock(node) + ? node.statements.length > 0 + ? isThrowStatement(node.statements[0]) + : false + : isThrowStatement(node); +} + function diff(start: number, end: number, sourceFile: ts.SourceFile): number { return ts.getLineAndCharacterOfPosition(sourceFile, end).line - ts.getLineAndCharacterOfPosition(sourceFile, start).line diff --git a/test/rules/early-exit/throwing-is-early-exit/test.ts.lint b/test/rules/early-exit/throwing-is-early-exit/test.ts.lint new file mode 100644 index 0000000..106d955 --- /dev/null +++ b/test/rules/early-exit/throwing-is-early-exit/test.ts.lint @@ -0,0 +1,8 @@ +class Foo { + f(a) { + if (a === undefined) { + throw new Error("a is undefined"); + } + } +} + diff --git a/test/rules/early-exit/throwing-is-early-exit/tslint.json b/test/rules/early-exit/throwing-is-early-exit/tslint.json new file mode 100644 index 0000000..cccd816 --- /dev/null +++ b/test/rules/early-exit/throwing-is-early-exit/tslint.json @@ -0,0 +1,6 @@ +{ + "rulesDirectory": "../../../../rules", + "rules": { + "early-exit": true + } +} From 60fd751a2bb1cfe8638da350d3a5e9ad16b71f0f Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 14 Feb 2020 20:17:10 -0300 Subject: [PATCH 2/3] Fix a bug in early-exit --- rules/earlyExitRule.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/earlyExitRule.ts b/rules/earlyExitRule.ts index dd6873d..e585799 100644 --- a/rules/earlyExitRule.ts +++ b/rules/earlyExitRule.ts @@ -52,7 +52,7 @@ function walk(ctx: Lint.WalkContext) { const thenSize = size(thenStatement, sourceFile); if (elseStatement === undefined) { - if (isLarge(thenSize) || !isThrowStatement(thenStatement)) + if (isLarge(thenSize) || !isThrow(thenStatement)) fail(failureString(exit)); return; } From 09316f63c547b52162dbde80f1607537e28469fa Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 14 Feb 2020 20:21:13 -0300 Subject: [PATCH 3/3] Fix isThrow condition --- rules/earlyExitRule.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/earlyExitRule.ts b/rules/earlyExitRule.ts index e585799..71dee6b 100644 --- a/rules/earlyExitRule.ts +++ b/rules/earlyExitRule.ts @@ -52,7 +52,7 @@ function walk(ctx: Lint.WalkContext) { const thenSize = size(thenStatement, sourceFile); if (elseStatement === undefined) { - if (isLarge(thenSize) || !isThrow(thenStatement)) + if (isLarge(thenSize) && !isThrow(thenStatement)) fail(failureString(exit)); return; } @@ -94,7 +94,7 @@ function size(node: ts.Node, sourceFile: ts.SourceFile): number { function isThrow(node: ts.Node): boolean { return isBlock(node) - ? node.statements.length > 0 + ? node.statements.length === 1 ? isThrowStatement(node.statements[0]) : false : isThrowStatement(node);