From fa94fb079c42f406eaa936469b9ac66ca2bc614a Mon Sep 17 00:00:00 2001 From: Artem Tyurin Date: Sat, 5 May 2018 02:44:35 +0200 Subject: [PATCH] Always yield await in async generator --- src/compiler/transformers/esnext.ts | 50 +++++--- .../reference/asyncImportNestedYield.js | 7 +- ...ter.asyncGenerators.classMethods.es2015.js | 4 +- ...mitter.asyncGenerators.classMethods.es5.js | 10 +- ...cGenerators.functionDeclarations.es2015.js | 4 +- ...syncGenerators.functionDeclarations.es5.js | 10 +- ...ncGenerators.functionExpressions.es2015.js | 4 +- ...asyncGenerators.functionExpressions.es5.js | 10 +- ...cGenerators.objectLiteralMethods.es2015.js | 4 +- ...syncGenerators.objectLiteralMethods.es5.js | 10 +- .../reference/emitter.forAwait.es2015.js | 6 +- .../reference/emitter.forAwait.es2017.js | 6 +- .../reference/emitter.forAwait.es5.js | 111 +++++++++--------- ...mportHelpersNoHelpersForAsyncGenerators.js | 9 +- 14 files changed, 137 insertions(+), 108 deletions(-) diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index e60a39eecd2..fde07b6323e 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -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); } diff --git a/tests/baselines/reference/asyncImportNestedYield.js b/tests/baselines/reference/asyncImportNestedYield.js index 4c83c6caf17..ac27e581186 100644 --- a/tests/baselines/reference/asyncImportNestedYield.js +++ b/tests/baselines/reference/asyncImportNestedYield.js @@ -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*/]; } diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js index 639e56f7b7e..0eb63ae638f 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js @@ -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); }); })()))); }); } } diff --git a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js index 359c86683dd..827e1e535df 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js @@ -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*/]; } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js index f8d5b9b158e..f3cde3c01ea 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js @@ -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] diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js index 9ca02ccdfaa..4895ff855e6 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es5.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*/]; } diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js index a25653a10fd..fb5577ef8d1 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es2015.js @@ -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] diff --git a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js index 22a934c6f67..25d688d5115 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.functionExpressions.es5.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*/]; } diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js index 9cce459c9da..025713c1d1c 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es2015.js @@ -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); }); })()))); }); } }; diff --git a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js index 6b50d4c0834..32d6ce06c46 100644 --- a/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js +++ b/tests/baselines/reference/emitter.asyncGenerators.objectLiteralMethods.es5.js @@ -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*/]; } diff --git a/tests/baselines/reference/emitter.forAwait.es2015.js b/tests/baselines/reference/emitter.forAwait.es2015.js index ade1964638f..5f84389cd4e 100644 --- a/tests/baselines/reference/emitter.forAwait.es2015.js +++ b/tests/baselines/reference/emitter.forAwait.es2015.js @@ -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; } } diff --git a/tests/baselines/reference/emitter.forAwait.es2017.js b/tests/baselines/reference/emitter.forAwait.es2017.js index df401094158..525c7176372 100644 --- a/tests/baselines/reference/emitter.forAwait.es2017.js +++ b/tests/baselines/reference/emitter.forAwait.es2017.js @@ -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; } } diff --git a/tests/baselines/reference/emitter.forAwait.es5.js b/tests/baselines/reference/emitter.forAwait.es5.js index d847c216bb2..956ef4a4f02 100644 --- a/tests/baselines/reference/emitter.forAwait.es5.js +++ b/tests/baselines/reference/emitter.forAwait.es5.js @@ -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*/]; } }); }); diff --git a/tests/baselines/reference/importHelpersNoHelpersForAsyncGenerators.js b/tests/baselines/reference/importHelpersNoHelpersForAsyncGenerators.js index 699c4faf921..14057a6cdab 100644 --- a/tests/baselines/reference/importHelpersNoHelpersForAsyncGenerators.js +++ b/tests/baselines/reference/importHelpersNoHelpersForAsyncGenerators.js @@ -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*/]; }