Skip to content

Commit 5fb3976

Browse files
authored
Merge pull request #27271 from Microsoft/fix24570-3
Fix iterated type in for-await-of
2 parents 336be23 + 112fe6e commit 5fb3976

File tree

4 files changed

+72
-17
lines changed

4 files changed

+72
-17
lines changed

src/compiler/checker.ts

+11-5
Original file line numberDiff line numberDiff line change
@@ -25313,14 +25313,18 @@ namespace ts {
2531325313

2531425314
if (allowSyncIterables) {
2531525315
if (typeAsIterable.iteratedTypeOfIterable) {
25316-
return typeAsIterable.iteratedTypeOfIterable;
25316+
return allowAsyncIterables
25317+
? typeAsIterable.iteratedTypeOfAsyncIterable = getAwaitedType(typeAsIterable.iteratedTypeOfIterable)
25318+
: typeAsIterable.iteratedTypeOfIterable;
2531725319
}
2531825320

2531925321
// As an optimization, if the type is an instantiation of the global `Iterable<T>` or
2532025322
// `IterableIterator<T>` then just grab its type argument.
2532125323
if (isReferenceToType(type, getGlobalIterableType(/*reportErrors*/ false)) ||
2532225324
isReferenceToType(type, getGlobalIterableIteratorType(/*reportErrors*/ false))) {
25323-
return typeAsIterable.iteratedTypeOfIterable = (<GenericType>type).typeArguments![0];
25325+
return allowAsyncIterables
25326+
? typeAsIterable.iteratedTypeOfAsyncIterable = getAwaitedType((<GenericType>type).typeArguments![0])
25327+
: typeAsIterable.iteratedTypeOfIterable = (<GenericType>type).typeArguments![0];
2532425328
}
2532525329
}
2532625330

@@ -25351,9 +25355,11 @@ namespace ts {
2535125355
: createIterableType(iteratedType), errorNode);
2535225356
}
2535325357

25354-
return asyncMethodType
25355-
? typeAsIterable.iteratedTypeOfAsyncIterable = iteratedType
25356-
: typeAsIterable.iteratedTypeOfIterable = iteratedType;
25358+
if (iteratedType) {
25359+
return allowAsyncIterables
25360+
? typeAsIterable.iteratedTypeOfAsyncIterable = asyncMethodType ? iteratedType : getAwaitedType(iteratedType)
25361+
: typeAsIterable.iteratedTypeOfIterable = iteratedType;
25362+
}
2535725363
}
2535825364
}
2535925365

tests/baselines/reference/types.forAwait.esnext.1.symbols

+33-12
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,70 @@ declare const iterable: Iterable<number>;
77
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
88
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
99

10+
declare const iterableOfPromise: Iterable<Promise<number>>;
11+
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
12+
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
13+
>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --))
14+
1015
async function f1() {
11-
>f1 : Symbol(f1, Decl(types.forAwait.esnext.1.ts, 1, 41))
16+
>f1 : Symbol(f1, Decl(types.forAwait.esnext.1.ts, 2, 59))
1217

1318
let y: number;
14-
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 3, 7))
19+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
1520

1621
for await (const x of asyncIterable) {
17-
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 4, 20))
22+
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 5, 20))
1823
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
1924
}
2025
for await (const x of iterable) {
21-
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 6, 20))
26+
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 7, 20))
2227
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
28+
}
29+
for await (const x of iterableOfPromise) {
30+
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 9, 20))
31+
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
2332
}
2433
for await (y of asyncIterable) {
25-
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 3, 7))
34+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
2635
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
2736
}
2837
for await (y of iterable) {
29-
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 3, 7))
38+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
3039
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
3140
}
41+
for await (y of iterableOfPromise) {
42+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
43+
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
44+
}
3245
}
3346
async function * f2() {
34-
>f2 : Symbol(f2, Decl(types.forAwait.esnext.1.ts, 12, 1))
47+
>f2 : Symbol(f2, Decl(types.forAwait.esnext.1.ts, 17, 1))
3548

3649
let y: number;
37-
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 14, 7))
50+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
3851

3952
for await (const x of asyncIterable) {
40-
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 15, 20))
53+
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 20, 20))
4154
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
4255
}
4356
for await (const x of iterable) {
44-
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 17, 20))
57+
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 22, 20))
4558
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
59+
}
60+
for await (const x of iterableOfPromise) {
61+
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 24, 20))
62+
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
4663
}
4764
for await (y of asyncIterable) {
48-
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 14, 7))
65+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
4966
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
5067
}
5168
for await (y of iterable) {
52-
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 14, 7))
69+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
5370
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
5471
}
72+
for await (y of iterableOfPromise) {
73+
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
74+
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
75+
}
5576
}

tests/baselines/reference/types.forAwait.esnext.1.types

+19
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ declare const asyncIterable: AsyncIterable<number>;
55
declare const iterable: Iterable<number>;
66
>iterable : Iterable<number>
77

8+
declare const iterableOfPromise: Iterable<Promise<number>>;
9+
>iterableOfPromise : Iterable<Promise<number>>
10+
811
async function f1() {
912
>f1 : () => Promise<void>
1013

@@ -18,6 +21,10 @@ async function f1() {
1821
for await (const x of iterable) {
1922
>x : number
2023
>iterable : Iterable<number>
24+
}
25+
for await (const x of iterableOfPromise) {
26+
>x : number
27+
>iterableOfPromise : Iterable<Promise<number>>
2128
}
2229
for await (y of asyncIterable) {
2330
>y : number
@@ -27,6 +34,10 @@ async function f1() {
2734
>y : number
2835
>iterable : Iterable<number>
2936
}
37+
for await (y of iterableOfPromise) {
38+
>y : number
39+
>iterableOfPromise : Iterable<Promise<number>>
40+
}
3041
}
3142
async function * f2() {
3243
>f2 : () => AsyncIterableIterator<any>
@@ -41,6 +52,10 @@ async function * f2() {
4152
for await (const x of iterable) {
4253
>x : number
4354
>iterable : Iterable<number>
55+
}
56+
for await (const x of iterableOfPromise) {
57+
>x : number
58+
>iterableOfPromise : Iterable<Promise<number>>
4459
}
4560
for await (y of asyncIterable) {
4661
>y : number
@@ -50,4 +65,8 @@ async function * f2() {
5065
>y : number
5166
>iterable : Iterable<number>
5267
}
68+
for await (y of iterableOfPromise) {
69+
>y : number
70+
>iterableOfPromise : Iterable<Promise<number>>
71+
}
5372
}

tests/cases/conformance/types/forAwait/types.forAwait.esnext.1.ts

+9
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,34 @@
33
// @noEmit: true
44
declare const asyncIterable: AsyncIterable<number>;
55
declare const iterable: Iterable<number>;
6+
declare const iterableOfPromise: Iterable<Promise<number>>;
67
async function f1() {
78
let y: number;
89
for await (const x of asyncIterable) {
910
}
1011
for await (const x of iterable) {
1112
}
13+
for await (const x of iterableOfPromise) {
14+
}
1215
for await (y of asyncIterable) {
1316
}
1417
for await (y of iterable) {
1518
}
19+
for await (y of iterableOfPromise) {
20+
}
1621
}
1722
async function * f2() {
1823
let y: number;
1924
for await (const x of asyncIterable) {
2025
}
2126
for await (const x of iterable) {
2227
}
28+
for await (const x of iterableOfPromise) {
29+
}
2330
for await (y of asyncIterable) {
2431
}
2532
for await (y of iterable) {
2633
}
34+
for await (y of iterableOfPromise) {
35+
}
2736
}

0 commit comments

Comments
 (0)