aboutsummaryrefslogtreecommitdiff
path: root/node_modules/tslint/lib/rules/awaitPromiseRule.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/tslint/lib/rules/awaitPromiseRule.js')
-rw-r--r--node_modules/tslint/lib/rules/awaitPromiseRule.js36
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;