diff options
Diffstat (limited to 'node_modules/tslint/lib/rules/noFloatingPromisesRule.js')
-rw-r--r-- | node_modules/tslint/lib/rules/noFloatingPromisesRule.js | 63 |
1 files changed, 38 insertions, 25 deletions
diff --git a/node_modules/tslint/lib/rules/noFloatingPromisesRule.js b/node_modules/tslint/lib/rules/noFloatingPromisesRule.js index 60839c9dc..6fe6d3329 100644 --- a/node_modules/tslint/lib/rules/noFloatingPromisesRule.js +++ b/node_modules/tslint/lib/rules/noFloatingPromisesRule.js @@ -28,39 +28,52 @@ var Rule = (function (_super) { Rule.prototype.applyWithProgram = function (sourceFile, program) { return this.applyWithFunction(sourceFile, function (ctx) { return walk(ctx, program.getTypeChecker()); }, ["Promise"].concat(this.ruleArguments)); }; + /* tslint:disable:object-literal-sort-keys */ + Rule.metadata = { + ruleName: "no-floating-promises", + description: "Promises returned by functions must be handled appropriately.", + descriptionDetails: "Use `no-unused-expressions` in addition to this rule to reveal even more floating promises.", + optionsDescription: (_a = ["\n A list of 'string' names of any additional classes that should also be handled as Promises.\n "], _a.raw = ["\n A list of \\'string\\' names of any additional classes that should also be handled as Promises.\n "], Lint.Utils.dedent(_a)), + options: { + type: "list", + listType: { + type: "array", + items: { type: "string" }, + }, + }, + optionExamples: [true, [true, "JQueryPromise"]], + rationale: "Unhandled Promises can cause unexpected behavior, such as resolving at unexpected times.", + type: "functionality", + typescriptOnly: true, + requiresTypeInfo: true, + }; + /* tslint:enable:object-literal-sort-keys */ + Rule.FAILURE_STRING = "Promises must be handled appropriately"; return Rule; }(Lint.Rules.TypedRule)); -/* tslint:disable:object-literal-sort-keys */ -Rule.metadata = { - ruleName: "no-floating-promises", - description: "Promises returned by functions must be handled appropriately.", - descriptionDetails: "Use `no-unused-expressions` in addition to this rule to reveal even more floating promises.", - optionsDescription: (_a = ["\n A list of 'string' names of any additional classes that should also be handled as Promises.\n "], _a.raw = ["\n A list of \\'string\\' names of any additional classes that should also be handled as Promises.\n "], Lint.Utils.dedent(_a)), - options: { - type: "list", - listType: { - type: "array", - items: { type: "string" }, - }, - }, - optionExamples: [true, [true, "JQueryPromise"]], - rationale: "Unhandled Promises can cause unexpected behavior, such as resolving at unexpected times.", - type: "functionality", - typescriptOnly: true, - requiresTypeInfo: true, -}; -/* tslint:enable:object-literal-sort-keys */ -Rule.FAILURE_STRING = "Promises must be handled appropriately"; exports.Rule = Rule; function walk(ctx, tc) { return ts.forEachChild(ctx.sourceFile, function cb(node) { - if (tsutils_1.isExpressionStatement(node) && node.expression.kind === ts.SyntaxKind.CallExpression) { - var symbol = tc.getTypeAtLocation(node.expression).symbol; - if (symbol !== undefined && ctx.options.indexOf(symbol.name) !== -1) { - ctx.addFailureAtNode(node.expression, Rule.FAILURE_STRING); + if (tsutils_1.isExpressionStatement(node)) { + var expression = node.expression; + if (tsutils_1.isCallExpression(expression) && + !isPromiseCatchCall(expression) && + !isPromiseThenCallWithRejectionHandler(expression)) { + var symbol = tc.getTypeAtLocation(expression).symbol; + if (symbol !== undefined && ctx.options.indexOf(symbol.name) !== -1) { + ctx.addFailureAtNode(expression, Rule.FAILURE_STRING); + } } } return ts.forEachChild(node, cb); }); } +function isPromiseCatchCall(expression) { + return tsutils_1.isPropertyAccessExpression(expression.expression) && expression.expression.name.text === "catch"; +} +function isPromiseThenCallWithRejectionHandler(expression) { + return tsutils_1.isPropertyAccessExpression(expression.expression) && + expression.expression.name.text === "then" && + expression.arguments.length >= 2; +} var _a; |