diff --git a/rules/earlyExitRule.ts b/rules/earlyExitRule.ts index 2115b6c..71dee6b 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) && !isThrow(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 === 1 + ? 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 + } +}