Skip to content

Commit 7d77c2b

Browse files
committed
Fix for-await-of emit in async function
1 parent ef25b25 commit 7d77c2b

11 files changed

+96
-18
lines changed

src/compiler/transformers/esnext.ts

+14-8
Original file line numberDiff line numberDiff line change
@@ -357,10 +357,12 @@ namespace ts {
357357
const values = createAsyncValuesHelper(context, expression, /*location*/ node.expression);
358358
const next = createYield(
359359
/*asteriskToken*/ undefined,
360-
createArrayLiteral([
361-
createLiteral("await"),
362-
createCall(createPropertyAccess(iterator, "next" ), /*typeArguments*/ undefined, [])
363-
])
360+
enclosingFunctionFlags & FunctionFlags.Generator
361+
? createArrayLiteral([
362+
createLiteral("await"),
363+
createCall(createPropertyAccess(iterator, "next" ), /*typeArguments*/ undefined, [])
364+
])
365+
: createCall(createPropertyAccess(iterator, "next" ), /*typeArguments*/ undefined, [])
364366
);
365367

366368
hoistVariableDeclaration(errorRecord);
@@ -431,10 +433,12 @@ namespace ts {
431433
createStatement(
432434
createYield(
433435
/*asteriskToken*/ undefined,
434-
createArrayLiteral([
435-
createLiteral("await"),
436-
createFunctionCall(returnMethod, iterator, [])
437-
])
436+
enclosingFunctionFlags & FunctionFlags.Generator
437+
? createArrayLiteral([
438+
createLiteral("await"),
439+
createFunctionCall(returnMethod, iterator, [])
440+
])
441+
: createFunctionCall(returnMethod, iterator, [])
438442
)
439443
)
440444
),
@@ -872,6 +876,7 @@ namespace ts {
872876
scoped: false,
873877
text: `
874878
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
879+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
875880
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
876881
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
877882
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -932,6 +937,7 @@ namespace ts {
932937
scoped: false,
933938
text: `
934939
var __asyncValues = (this && this.__asyncIterator) || function (o) {
940+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
935941
var m = o[Symbol.asyncIterator];
936942
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
937943
};

tests/baselines/reference/emitter.asyncGenerators.classMethods.es2015.js

+9
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class C9 extends B9 {
6262

6363
//// [C1.js]
6464
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
65+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
6566
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
6667
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
6768
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -81,6 +82,7 @@ class C1 {
8182
}
8283
//// [C2.js]
8384
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
85+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
8486
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
8587
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
8688
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -101,6 +103,7 @@ class C2 {
101103
}
102104
//// [C3.js]
103105
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
106+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
104107
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
105108
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
106109
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -126,6 +129,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
126129
function verb(n, f) { return function (v) { return { value: ["delegate", (o[n] || f).call(o, v)], done: false }; }; }
127130
};
128131
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
132+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
129133
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
130134
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
131135
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -146,6 +150,7 @@ class C4 {
146150
}
147151
//// [C5.js]
148152
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
153+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
149154
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
150155
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
151156
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -171,6 +176,7 @@ class C5 {
171176
}
172177
//// [C6.js]
173178
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
179+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
174180
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
175181
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
176182
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -191,6 +197,7 @@ class C6 {
191197
}
192198
//// [C7.js]
193199
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
200+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
194201
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
195202
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
196203
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -211,6 +218,7 @@ class C7 {
211218
}
212219
//// [C8.js]
213220
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
221+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
214222
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
215223
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
216224
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -233,6 +241,7 @@ class C8 {
233241
}
234242
//// [C9.js]
235243
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
244+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
236245
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
237246
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
238247
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }

tests/baselines/reference/emitter.asyncGenerators.classMethods.es5.js

+9
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
8989
}
9090
};
9191
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
92+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
9293
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
9394
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
9495
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -141,6 +142,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
141142
}
142143
};
143144
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
145+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
144146
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
145147
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
146148
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -199,6 +201,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
199201
}
200202
};
201203
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
204+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
202205
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
203206
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
204207
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -262,6 +265,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
262265
function verb(n, f) { return function (v) { return { value: ["delegate", (o[n] || f).call(o, v)], done: false }; }; }
263266
};
264267
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
268+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
265269
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
266270
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
267271
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -330,6 +334,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
330334
}
331335
};
332336
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
337+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
333338
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
334339
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
335340
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -410,6 +415,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
410415
}
411416
};
412417
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
418+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
413419
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
414420
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
415421
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -468,6 +474,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
468474
}
469475
};
470476
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
477+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
471478
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
472479
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
473480
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -520,6 +527,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
520527
}
521528
};
522529
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
530+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
523531
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
524532
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
525533
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -585,6 +593,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
585593
}
586594
};
587595
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
596+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
588597
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
589598
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
590599
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }

tests/baselines/reference/emitter.asyncGenerators.functionDeclarations.es2015.js

+7
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ async function * f7() {
3131

3232
//// [F1.js]
3333
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
34+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
3435
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
3536
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
3637
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -48,6 +49,7 @@ function f1() {
4849
}
4950
//// [F2.js]
5051
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
52+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
5153
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
5254
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
5355
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -66,6 +68,7 @@ function f2() {
6668
}
6769
//// [F3.js]
6870
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
71+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
6972
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
7073
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
7174
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -89,6 +92,7 @@ var __asyncDelegator = (this && this.__asyncDelegator) || function (o) {
8992
function verb(n, f) { return function (v) { return { value: ["delegate", (o[n] || f).call(o, v)], done: false }; }; }
9093
};
9194
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
95+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
9296
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
9397
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
9498
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -107,6 +111,7 @@ function f4() {
107111
}
108112
//// [F5.js]
109113
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
114+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
110115
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
111116
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
112117
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -130,6 +135,7 @@ function f5() {
130135
}
131136
//// [F6.js]
132137
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
138+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
133139
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
134140
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
135141
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }
@@ -148,6 +154,7 @@ function f6() {
148154
}
149155
//// [F7.js]
150156
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
157+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
151158
var g = generator.apply(thisArg, _arguments || []), q = [], c, i;
152159
return i = { next: verb("next"), "throw": verb("throw"), "return": verb("return") }, i[Symbol.asyncIterator] = function () { return this; }, i;
153160
function verb(n) { return function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]), next(); }); }; }

0 commit comments

Comments
 (0)