Skip to content

Commit 4e95898

Browse files
committed
Fix loop labels for for..await
1 parent 060ee30 commit 4e95898

17 files changed

+701
-1
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ namespace ts {
148148
}
149149

150150
function visitLabeledStatement(node: LabeledStatement) {
151-
if (enclosingFunctionFlags & FunctionFlags.Async && enclosingFunctionFlags & FunctionFlags.Generator) {
151+
if (enclosingFunctionFlags & FunctionFlags.Async) {
152152
const statement = unwrapInnermostStatementOfLabel(node);
153153
if (statement.kind === SyntaxKind.ForOfStatement && (<ForOfStatement>statement).awaitModifier) {
154154
return visitForOfStatement(<ForOfStatement>statement, node);

tests/baselines/reference/emitter.forAwait.es2015.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,22 @@ async function* f4() {
2424
for await (x of y) {
2525
}
2626
}
27+
//// [file5.ts]
28+
// https://github.com/Microsoft/TypeScript/issues/21363
29+
async function f5() {
30+
let y: any;
31+
outer: for await (const x of y) {
32+
continue outer;
33+
}
34+
}
35+
//// [file6.ts]
36+
// https://github.com/Microsoft/TypeScript/issues/21363
37+
async function* f6() {
38+
let y: any;
39+
outer: for await (const x of y) {
40+
continue outer;
41+
}
42+
}
2743

2844
//// [file1.js]
2945
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
@@ -161,3 +177,75 @@ function f4() {
161177
var e_1, _a;
162178
});
163179
}
180+
//// [file5.js]
181+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
182+
return new (P || (P = Promise))(function (resolve, reject) {
183+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
184+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
185+
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
186+
step((generator = generator.apply(thisArg, _arguments || [])).next());
187+
});
188+
};
189+
var __asyncValues = (this && this.__asyncValues) || function (o) {
190+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
191+
var m = o[Symbol.asyncIterator];
192+
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
193+
};
194+
// https://github.com/Microsoft/TypeScript/issues/21363
195+
function f5() {
196+
return __awaiter(this, void 0, void 0, function* () {
197+
let y;
198+
try {
199+
outer: for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield y_1.next(), !y_1_1.done;) {
200+
const x = yield y_1_1.value;
201+
continue outer;
202+
}
203+
}
204+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
205+
finally {
206+
try {
207+
if (y_1_1 && !y_1_1.done && (_a = y_1.return)) yield _a.call(y_1);
208+
}
209+
finally { if (e_1) throw e_1.error; }
210+
}
211+
var e_1, _a;
212+
});
213+
}
214+
//// [file6.js]
215+
var __asyncValues = (this && this.__asyncValues) || function (o) {
216+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
217+
var m = o[Symbol.asyncIterator];
218+
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
219+
};
220+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
221+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
222+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
223+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
224+
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
225+
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
226+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
227+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
228+
function fulfill(value) { resume("next", value); }
229+
function reject(value) { resume("throw", value); }
230+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
231+
};
232+
// https://github.com/Microsoft/TypeScript/issues/21363
233+
function f6() {
234+
return __asyncGenerator(this, arguments, function* f6_1() {
235+
let y;
236+
try {
237+
outer: for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
238+
const x = yield __await(y_1_1.value);
239+
continue outer;
240+
}
241+
}
242+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
243+
finally {
244+
try {
245+
if (y_1_1 && !y_1_1.done && (_a = y_1.return)) yield __await(_a.call(y_1));
246+
}
247+
finally { if (e_1) throw e_1.error; }
248+
}
249+
var e_1, _a;
250+
});
251+
}

tests/baselines/reference/emitter.forAwait.es2015.symbols

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,33 @@ async function* f4() {
4848
>y : Symbol(y, Decl(file4.ts, 1, 15))
4949
}
5050
}
51+
=== tests/cases/conformance/emitter/es2015/forAwait/file5.ts ===
52+
// https://github.com/Microsoft/TypeScript/issues/21363
53+
async function f5() {
54+
>f5 : Symbol(f5, Decl(file5.ts, 0, 0))
55+
56+
let y: any;
57+
>y : Symbol(y, Decl(file5.ts, 2, 7))
58+
59+
outer: for await (const x of y) {
60+
>x : Symbol(x, Decl(file5.ts, 3, 27))
61+
>y : Symbol(y, Decl(file5.ts, 2, 7))
62+
63+
continue outer;
64+
}
65+
}
66+
=== tests/cases/conformance/emitter/es2015/forAwait/file6.ts ===
67+
// https://github.com/Microsoft/TypeScript/issues/21363
68+
async function* f6() {
69+
>f6 : Symbol(f6, Decl(file6.ts, 0, 0))
70+
71+
let y: any;
72+
>y : Symbol(y, Decl(file6.ts, 2, 7))
73+
74+
outer: for await (const x of y) {
75+
>x : Symbol(x, Decl(file6.ts, 3, 27))
76+
>y : Symbol(y, Decl(file6.ts, 2, 7))
77+
78+
continue outer;
79+
}
80+
}

tests/baselines/reference/emitter.forAwait.es2015.types

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,37 @@ async function* f4() {
4848
>y : any
4949
}
5050
}
51+
=== tests/cases/conformance/emitter/es2015/forAwait/file5.ts ===
52+
// https://github.com/Microsoft/TypeScript/issues/21363
53+
async function f5() {
54+
>f5 : () => Promise<void>
55+
56+
let y: any;
57+
>y : any
58+
59+
outer: for await (const x of y) {
60+
>outer : any
61+
>x : any
62+
>y : any
63+
64+
continue outer;
65+
>outer : any
66+
}
67+
}
68+
=== tests/cases/conformance/emitter/es2015/forAwait/file6.ts ===
69+
// https://github.com/Microsoft/TypeScript/issues/21363
70+
async function* f6() {
71+
>f6 : () => AsyncIterableIterator<any>
72+
73+
let y: any;
74+
>y : any
75+
76+
outer: for await (const x of y) {
77+
>outer : any
78+
>x : any
79+
>y : any
80+
81+
continue outer;
82+
>outer : any
83+
}
84+
}

tests/baselines/reference/emitter.forAwait.es2017.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,22 @@ async function* f4() {
2424
for await (x of y) {
2525
}
2626
}
27+
//// [file5.ts]
28+
// https://github.com/Microsoft/TypeScript/issues/21363
29+
async function f5() {
30+
let y: any;
31+
outer: for await (const x of y) {
32+
continue outer;
33+
}
34+
}
35+
//// [file6.ts]
36+
// https://github.com/Microsoft/TypeScript/issues/21363
37+
async function* f6() {
38+
let y: any;
39+
outer: for await (const x of y) {
40+
continue outer;
41+
}
42+
}
2743

2844
//// [file1.js]
2945
var __asyncValues = (this && this.__asyncValues) || function (o) {
@@ -141,3 +157,65 @@ function f4() {
141157
var e_1, _a;
142158
});
143159
}
160+
//// [file5.js]
161+
var __asyncValues = (this && this.__asyncValues) || function (o) {
162+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
163+
var m = o[Symbol.asyncIterator];
164+
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
165+
};
166+
// https://github.com/Microsoft/TypeScript/issues/21363
167+
async function f5() {
168+
let y;
169+
try {
170+
outer: for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = await y_1.next(), !y_1_1.done;) {
171+
const x = await y_1_1.value;
172+
continue outer;
173+
}
174+
}
175+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
176+
finally {
177+
try {
178+
if (y_1_1 && !y_1_1.done && (_a = y_1.return)) await _a.call(y_1);
179+
}
180+
finally { if (e_1) throw e_1.error; }
181+
}
182+
var e_1, _a;
183+
}
184+
//// [file6.js]
185+
var __asyncValues = (this && this.__asyncValues) || function (o) {
186+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
187+
var m = o[Symbol.asyncIterator];
188+
return m ? m.call(o) : typeof __values === "function" ? __values(o) : o[Symbol.iterator]();
189+
};
190+
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
191+
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
192+
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
193+
var g = generator.apply(thisArg, _arguments || []), i, q = [];
194+
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
195+
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
196+
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
197+
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
198+
function fulfill(value) { resume("next", value); }
199+
function reject(value) { resume("throw", value); }
200+
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
201+
};
202+
// https://github.com/Microsoft/TypeScript/issues/21363
203+
function f6() {
204+
return __asyncGenerator(this, arguments, function* f6_1() {
205+
let y;
206+
try {
207+
outer: for (var y_1 = __asyncValues(y), y_1_1; y_1_1 = yield __await(y_1.next()), !y_1_1.done;) {
208+
const x = yield __await(y_1_1.value);
209+
continue outer;
210+
}
211+
}
212+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
213+
finally {
214+
try {
215+
if (y_1_1 && !y_1_1.done && (_a = y_1.return)) yield __await(_a.call(y_1));
216+
}
217+
finally { if (e_1) throw e_1.error; }
218+
}
219+
var e_1, _a;
220+
});
221+
}

tests/baselines/reference/emitter.forAwait.es2017.symbols

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,33 @@ async function* f4() {
4848
>y : Symbol(y, Decl(file4.ts, 1, 15))
4949
}
5050
}
51+
=== tests/cases/conformance/emitter/es2017/forAwait/file5.ts ===
52+
// https://github.com/Microsoft/TypeScript/issues/21363
53+
async function f5() {
54+
>f5 : Symbol(f5, Decl(file5.ts, 0, 0))
55+
56+
let y: any;
57+
>y : Symbol(y, Decl(file5.ts, 2, 7))
58+
59+
outer: for await (const x of y) {
60+
>x : Symbol(x, Decl(file5.ts, 3, 27))
61+
>y : Symbol(y, Decl(file5.ts, 2, 7))
62+
63+
continue outer;
64+
}
65+
}
66+
=== tests/cases/conformance/emitter/es2017/forAwait/file6.ts ===
67+
// https://github.com/Microsoft/TypeScript/issues/21363
68+
async function* f6() {
69+
>f6 : Symbol(f6, Decl(file6.ts, 0, 0))
70+
71+
let y: any;
72+
>y : Symbol(y, Decl(file6.ts, 2, 7))
73+
74+
outer: for await (const x of y) {
75+
>x : Symbol(x, Decl(file6.ts, 3, 27))
76+
>y : Symbol(y, Decl(file6.ts, 2, 7))
77+
78+
continue outer;
79+
}
80+
}

tests/baselines/reference/emitter.forAwait.es2017.types

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,37 @@ async function* f4() {
4848
>y : any
4949
}
5050
}
51+
=== tests/cases/conformance/emitter/es2017/forAwait/file5.ts ===
52+
// https://github.com/Microsoft/TypeScript/issues/21363
53+
async function f5() {
54+
>f5 : () => Promise<void>
55+
56+
let y: any;
57+
>y : any
58+
59+
outer: for await (const x of y) {
60+
>outer : any
61+
>x : any
62+
>y : any
63+
64+
continue outer;
65+
>outer : any
66+
}
67+
}
68+
=== tests/cases/conformance/emitter/es2017/forAwait/file6.ts ===
69+
// https://github.com/Microsoft/TypeScript/issues/21363
70+
async function* f6() {
71+
>f6 : () => AsyncIterableIterator<any>
72+
73+
let y: any;
74+
>y : any
75+
76+
outer: for await (const x of y) {
77+
>outer : any
78+
>x : any
79+
>y : any
80+
81+
continue outer;
82+
>outer : any
83+
}
84+
}

0 commit comments

Comments
 (0)