Always yield await in async generator

This commit is contained in:
Artem Tyurin
2018-05-05 02:44:35 +02:00
parent 3e4279195f
commit fa94fb079c
14 changed files with 137 additions and 108 deletions
+33 -17
View File
@@ -118,28 +118,44 @@ namespace ts {
}
function visitYieldExpression(node: YieldExpression) {
if (enclosingFunctionFlags & FunctionFlags.Async && enclosingFunctionFlags & FunctionFlags.Generator && node.asteriskToken) {
const expression = visitNode(node.expression, visitor, isExpression);
return setOriginalNode(
setTextRange(
createYield(
createAwaitHelper(context,
updateYield(
node,
node.asteriskToken,
createAsyncDelegatorHelper(
context,
createAsyncValuesHelper(context, expression, expression),
expression
if (enclosingFunctionFlags & FunctionFlags.Async && enclosingFunctionFlags & FunctionFlags.Generator) {
if (node.asteriskToken) {
const expression = visitNode(node.expression, visitor, isExpression);
return setOriginalNode(
setTextRange(
createYield(
createAwaitHelper(context,
updateYield(
node,
node.asteriskToken,
createAsyncDelegatorHelper(
context,
createAsyncValuesHelper(context, expression, expression),
expression
)
)
)
)
),
node
),
node
),
node
);
);
}
if (node.expression && node.expression.kind !== SyntaxKind.AwaitExpression) {
return setOriginalNode(
setTextRange(
createYield(
createDownlevelAwait(node.expression)
),
node
),
node
);
}
}
return visitEachChild(node, visitor, context);
}
@@ -54,9 +54,10 @@ function foo() {
return __asyncGenerator(this, arguments, function foo_1() {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, "foo"];
case 1: return [4 /*yield*/, __await.apply(void 0, [Promise.resolve().then(function () { return require(_a.sent()); })])];
case 2:
case 0: return [4 /*yield*/, __await("foo")];
case 1: return [4 /*yield*/, _a.sent()];
case 2: return [4 /*yield*/, __await.apply(void 0, [Promise.resolve().then(function () { return require(_a.sent()); })])];
case 3:
Promise.resolve().then(function () { return require((_a.sent())["default"]); });
return [2 /*return*/];
}
@@ -136,7 +136,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
class C3 {
f() {
return __asyncGenerator(this, arguments, function* f_1() {
const x = yield 1;
const x = yield yield __await(1);
});
}
}
@@ -210,7 +210,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
class C5 {
f() {
return __asyncGenerator(this, arguments, function* f_1() {
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield 1; }); })())));
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield yield __await(1); }); })())));
});
}
}
@@ -239,8 +239,9 @@ var C3 = /** @class */ (function () {
var x;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
x = _a.sent();
return [2 /*return*/];
}
@@ -412,8 +413,9 @@ var C5 = /** @class */ (function () {
switch (_a.label) {
case 0: return [5 /*yield**/, __values(__asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
_a.sent();
return [2 /*return*/];
}
@@ -100,7 +100,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
};
function f3() {
return __asyncGenerator(this, arguments, function* f3_1() {
const x = yield 1;
const x = yield yield __await(1);
});
}
//// [F4.js]
@@ -170,7 +170,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
};
function f5() {
return __asyncGenerator(this, arguments, function* f5_1() {
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield 1; }); })())));
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield yield __await(1); }); })())));
});
}
//// [F6.js]
@@ -195,8 +195,9 @@ function f3() {
var x;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
x = _a.sent();
return [2 /*return*/];
}
@@ -358,8 +359,9 @@ function f5() {
switch (_a.label) {
case 0: return [5 /*yield**/, __values(__asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
_a.sent();
return [2 /*return*/];
}
@@ -100,7 +100,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
};
const f3 = function () {
return __asyncGenerator(this, arguments, function* () {
const x = yield 1;
const x = yield yield __await(1);
});
};
//// [F4.js]
@@ -170,7 +170,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
};
const f5 = function () {
return __asyncGenerator(this, arguments, function* () {
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield 1; }); })())));
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield yield __await(1); }); })())));
});
};
//// [F6.js]
@@ -195,8 +195,9 @@ var f3 = function () {
var x;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
x = _a.sent();
return [2 /*return*/];
}
@@ -358,8 +359,9 @@ var f5 = function () {
switch (_a.label) {
case 0: return [5 /*yield**/, __values(__asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
_a.sent();
return [2 /*return*/];
}
@@ -119,7 +119,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
const o3 = {
f() {
return __asyncGenerator(this, arguments, function* f_1() {
const x = yield 1;
const x = yield yield __await(1);
});
}
};
@@ -193,7 +193,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
const o5 = {
f() {
return __asyncGenerator(this, arguments, function* f_1() {
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield 1; }); })())));
const x = yield __await(yield* __asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function* () { yield yield __await(1); }); })())));
});
}
};
@@ -214,8 +214,9 @@ var o3 = {
var x;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
x = _a.sent();
return [2 /*return*/];
}
@@ -381,8 +382,9 @@ var o5 = {
switch (_a.label) {
case 0: return [5 /*yield**/, __values(__asyncDelegator(__asyncValues((function () { return __asyncGenerator(this, arguments, function () { return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, 1];
case 1:
case 0: return [4 /*yield*/, __await(1)];
case 1: return [4 /*yield*/, _a.sent()];
case 2:
_a.sent();
return [2 /*return*/];
}
@@ -135,7 +135,7 @@ function f3() {
let y;
try {
for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
const x = yield __await(y_1_1.value);
const x = yield yield __await(__await(y_1_1.value));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -178,7 +178,7 @@ function f4() {
let x, y;
try {
for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
x = yield __await(y_1_1.value);
x = yield yield __await(__await(y_1_1.value));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -256,7 +256,7 @@ function f6() {
let y;
try {
outer: for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
const x = yield __await(y_1_1.value);
const x = yield yield __await(__await(y_1_1.value));
continue outer;
}
}
@@ -115,7 +115,7 @@ function f3() {
let y;
try {
for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
const x = yield __await(y_1_1.value);
const x = yield yield __await(__await(y_1_1.value));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -158,7 +158,7 @@ function f4() {
let x, y;
try {
for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
x = yield __await(y_1_1.value);
x = yield yield __await(__await(y_1_1.value));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -226,7 +226,7 @@ function f6() {
let y;
try {
outer: for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
const x = yield __await(y_1_1.value);
const x = yield yield __await(__await(y_1_1.value));
continue outer;
}
}
@@ -259,35 +259,36 @@ function f3() {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 6, 7, 12]);
_b.trys.push([0, 7, 8, 13]);
y_1 = __asyncValues(y);
_b.label = 1;
case 1: return [4 /*yield*/, __await(y_1.next())];
case 2:
if (!(y_1_1 = _b.sent(), !y_1_1.done)) return [3 /*break*/, 5];
return [4 /*yield*/, __await(y_1_1.value)];
case 3:
if (!(y_1_1 = _b.sent(), !y_1_1.done)) return [3 /*break*/, 6];
return [4 /*yield*/, __await(__await(y_1_1.value))];
case 3: return [4 /*yield*/, _b.sent()];
case 4:
x = _b.sent();
_b.label = 4;
case 4: return [3 /*break*/, 1];
case 5: return [3 /*break*/, 12];
case 6:
_b.label = 5;
case 5: return [3 /*break*/, 1];
case 6: return [3 /*break*/, 13];
case 7:
e_1_1 = _b.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 12];
case 7:
_b.trys.push([7, , 10, 11]);
if (!(y_1_1 && !y_1_1.done && (_a = y_1.return))) return [3 /*break*/, 9];
return [4 /*yield*/, __await(_a.call(y_1))];
return [3 /*break*/, 13];
case 8:
_b.trys.push([8, , 11, 12]);
if (!(y_1_1 && !y_1_1.done && (_a = y_1.return))) return [3 /*break*/, 10];
return [4 /*yield*/, __await(_a.call(y_1))];
case 9:
_b.sent();
_b.label = 9;
case 9: return [3 /*break*/, 11];
case 10:
_b.label = 10;
case 10: return [3 /*break*/, 12];
case 11:
if (e_1) throw e_1.error;
return [7 /*endfinally*/];
case 11: return [7 /*endfinally*/];
case 12: return [2 /*return*/];
case 12: return [7 /*endfinally*/];
case 13: return [2 /*return*/];
}
});
});
@@ -350,35 +351,36 @@ function f4() {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 6, 7, 12]);
_b.trys.push([0, 7, 8, 13]);
y_1 = __asyncValues(y);
_b.label = 1;
case 1: return [4 /*yield*/, __await(y_1.next())];
case 2:
if (!(y_1_1 = _b.sent(), !y_1_1.done)) return [3 /*break*/, 5];
return [4 /*yield*/, __await(y_1_1.value)];
case 3:
if (!(y_1_1 = _b.sent(), !y_1_1.done)) return [3 /*break*/, 6];
return [4 /*yield*/, __await(__await(y_1_1.value))];
case 3: return [4 /*yield*/, _b.sent()];
case 4:
x = _b.sent();
_b.label = 4;
case 4: return [3 /*break*/, 1];
case 5: return [3 /*break*/, 12];
case 6:
_b.label = 5;
case 5: return [3 /*break*/, 1];
case 6: return [3 /*break*/, 13];
case 7:
e_1_1 = _b.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 12];
case 7:
_b.trys.push([7, , 10, 11]);
if (!(y_1_1 && !y_1_1.done && (_a = y_1.return))) return [3 /*break*/, 9];
return [4 /*yield*/, __await(_a.call(y_1))];
return [3 /*break*/, 13];
case 8:
_b.trys.push([8, , 11, 12]);
if (!(y_1_1 && !y_1_1.done && (_a = y_1.return))) return [3 /*break*/, 10];
return [4 /*yield*/, __await(_a.call(y_1))];
case 9:
_b.sent();
_b.label = 9;
case 9: return [3 /*break*/, 11];
case 10:
_b.label = 10;
case 10: return [3 /*break*/, 12];
case 11:
if (e_1) throw e_1.error;
return [7 /*endfinally*/];
case 11: return [7 /*endfinally*/];
case 12: return [2 /*return*/];
case 12: return [7 /*endfinally*/];
case 13: return [2 /*return*/];
}
});
});
@@ -523,35 +525,36 @@ function f6() {
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_b.trys.push([0, 6, 7, 12]);
_b.trys.push([0, 7, 8, 13]);
y_1 = __asyncValues(y);
_b.label = 1;
case 1: return [4 /*yield*/, __await(y_1.next())];
case 2:
if (!(y_1_1 = _b.sent(), !y_1_1.done)) return [3 /*break*/, 5];
return [4 /*yield*/, __await(y_1_1.value)];
case 3:
if (!(y_1_1 = _b.sent(), !y_1_1.done)) return [3 /*break*/, 6];
return [4 /*yield*/, __await(__await(y_1_1.value))];
case 3: return [4 /*yield*/, _b.sent()];
case 4:
x = _b.sent();
return [3 /*break*/, 4];
case 4: return [3 /*break*/, 1];
case 5: return [3 /*break*/, 12];
case 6:
return [3 /*break*/, 5];
case 5: return [3 /*break*/, 1];
case 6: return [3 /*break*/, 13];
case 7:
e_1_1 = _b.sent();
e_1 = { error: e_1_1 };
return [3 /*break*/, 12];
case 7:
_b.trys.push([7, , 10, 11]);
if (!(y_1_1 && !y_1_1.done && (_a = y_1.return))) return [3 /*break*/, 9];
return [4 /*yield*/, __await(_a.call(y_1))];
return [3 /*break*/, 13];
case 8:
_b.trys.push([8, , 11, 12]);
if (!(y_1_1 && !y_1_1.done && (_a = y_1.return))) return [3 /*break*/, 10];
return [4 /*yield*/, __await(_a.call(y_1))];
case 9:
_b.sent();
_b.label = 9;
case 9: return [3 /*break*/, 11];
case 10:
_b.label = 10;
case 10: return [3 /*break*/, 12];
case 11:
if (e_1) throw e_1.error;
return [7 /*endfinally*/];
case 11: return [7 /*endfinally*/];
case 12: return [2 /*return*/];
case 12: return [7 /*endfinally*/];
case 13: return [2 /*return*/];
}
});
});
@@ -22,12 +22,13 @@ function f() {
case 0: return [4 /*yield*/, tslib_1.__await(1)];
case 1:
_a.sent();
return [4 /*yield*/, 2];
case 2:
return [4 /*yield*/, tslib_1.__await(2)];
case 2: return [4 /*yield*/, _a.sent()];
case 3:
_a.sent();
return [5 /*yield**/, tslib_1.__values(tslib_1.__asyncDelegator(tslib_1.__asyncValues([3])))];
case 3: return [4 /*yield*/, tslib_1.__await.apply(void 0, [_a.sent()])];
case 4:
case 4: return [4 /*yield*/, tslib_1.__await.apply(void 0, [_a.sent()])];
case 5:
_a.sent();
return [2 /*return*/];
}