diff options
Diffstat (limited to 'node_modules/tslint/lib/rules/awaitPromiseRule.js')
-rw-r--r-- | node_modules/tslint/lib/rules/awaitPromiseRule.js | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/node_modules/tslint/lib/rules/awaitPromiseRule.js b/node_modules/tslint/lib/rules/awaitPromiseRule.js index 69855f49f..cb1c35b08 100644 --- a/node_modules/tslint/lib/rules/awaitPromiseRule.js +++ b/node_modules/tslint/lib/rules/awaitPromiseRule.js @@ -47,7 +47,8 @@ var Rule = /** @class */ (function (_super) { requiresTypeInfo: true, }; /* tslint:enable:object-literal-sort-keys */ - Rule.FAILURE_STRING = "'await' of non-Promise."; + Rule.FAILURE_STRING = "Invalid 'await' of a non-Promise value."; + Rule.FAILURE_FOR_AWAIT_OF = "Invalid 'for-await-of' of a non-AsyncIterable value."; return Rule; }(Lint.Rules.TypedRule)); exports.Rule = Rule; @@ -55,24 +56,31 @@ function walk(ctx, tc) { var promiseTypes = ctx.options; return ts.forEachChild(ctx.sourceFile, cb); function cb(node) { - if (tsutils_1.isAwaitExpression(node) && !couldBePromise(tc.getTypeAtLocation(node.expression))) { + if (tsutils_1.isAwaitExpression(node) && !containsType(tc.getTypeAtLocation(node.expression), isPromiseType)) { ctx.addFailureAtNode(node, Rule.FAILURE_STRING); } + else if (tsutils_1.isForOfStatement(node) && node.awaitModifier !== undefined && + !containsType(tc.getTypeAtLocation(node.expression), isAsyncIterable)) { + ctx.addFailureAtNode(node.expression, Rule.FAILURE_FOR_AWAIT_OF); + } return ts.forEachChild(node, cb); } - function couldBePromise(type) { - if (Lint.isTypeFlagSet(type, ts.TypeFlags.Any) || isPromiseType(type)) { - return true; - } - if (tsutils_1.isUnionOrIntersectionType(type)) { - return type.types.some(couldBePromise); - } - var bases = type.getBaseTypes(); - return bases !== undefined && bases.some(couldBePromise); + function isPromiseType(name) { + return promiseTypes.has(name); } - function isPromiseType(type) { - var target = type.target; - return target !== undefined && target.symbol !== undefined && promiseTypes.has(target.symbol.name); +} +function containsType(type, predicate) { + if (Lint.isTypeFlagSet(type, ts.TypeFlags.Any) || + tsutils_1.isTypeReference(type) && type.target.symbol !== undefined && predicate(type.target.symbol.name)) { + return true; + } + if (tsutils_1.isUnionOrIntersectionType(type)) { + return type.types.some(function (t) { return containsType(t, predicate); }); } + var bases = type.getBaseTypes(); + return bases !== undefined && bases.some(function (t) { return containsType(t, predicate); }); +} +function isAsyncIterable(name) { + return name === "AsyncIterable" || name === "AsyncIterableIterator"; } var _a; |