Merge pull request #27271 from Microsoft/fix24570-3

Fix iterated type in for-await-of
This commit is contained in:
Ron Buckton 2018-09-21 12:28:18 -07:00 committed by GitHub
commit 5fb39769ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 72 additions and 17 deletions

View File

@ -25313,14 +25313,18 @@ namespace ts {
if (allowSyncIterables) {
if (typeAsIterable.iteratedTypeOfIterable) {
return typeAsIterable.iteratedTypeOfIterable;
return allowAsyncIterables
? typeAsIterable.iteratedTypeOfAsyncIterable = getAwaitedType(typeAsIterable.iteratedTypeOfIterable)
: typeAsIterable.iteratedTypeOfIterable;
}
// As an optimization, if the type is an instantiation of the global `Iterable<T>` or
// `IterableIterator<T>` then just grab its type argument.
if (isReferenceToType(type, getGlobalIterableType(/*reportErrors*/ false)) ||
isReferenceToType(type, getGlobalIterableIteratorType(/*reportErrors*/ false))) {
return typeAsIterable.iteratedTypeOfIterable = (<GenericType>type).typeArguments![0];
return allowAsyncIterables
? typeAsIterable.iteratedTypeOfAsyncIterable = getAwaitedType((<GenericType>type).typeArguments![0])
: typeAsIterable.iteratedTypeOfIterable = (<GenericType>type).typeArguments![0];
}
}
@ -25351,9 +25355,11 @@ namespace ts {
: createIterableType(iteratedType), errorNode);
}
return asyncMethodType
? typeAsIterable.iteratedTypeOfAsyncIterable = iteratedType
: typeAsIterable.iteratedTypeOfIterable = iteratedType;
if (iteratedType) {
return allowAsyncIterables
? typeAsIterable.iteratedTypeOfAsyncIterable = asyncMethodType ? iteratedType : getAwaitedType(iteratedType)
: typeAsIterable.iteratedTypeOfIterable = iteratedType;
}
}
}

View File

@ -7,49 +7,70 @@ declare const iterable: Iterable<number>;
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
declare const iterableOfPromise: Iterable<Promise<number>>;
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
>Iterable : Symbol(Iterable, Decl(lib.es2015.iterable.d.ts, --, --))
>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, --, --))
async function f1() {
>f1 : Symbol(f1, Decl(types.forAwait.esnext.1.ts, 1, 41))
>f1 : Symbol(f1, Decl(types.forAwait.esnext.1.ts, 2, 59))
let y: number;
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 3, 7))
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
for await (const x of asyncIterable) {
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 4, 20))
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 5, 20))
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
}
for await (const x of iterable) {
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 6, 20))
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 7, 20))
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
}
for await (const x of iterableOfPromise) {
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 9, 20))
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
}
for await (y of asyncIterable) {
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 3, 7))
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
}
for await (y of iterable) {
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 3, 7))
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
}
for await (y of iterableOfPromise) {
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 4, 7))
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
}
}
async function * f2() {
>f2 : Symbol(f2, Decl(types.forAwait.esnext.1.ts, 12, 1))
>f2 : Symbol(f2, Decl(types.forAwait.esnext.1.ts, 17, 1))
let y: number;
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 14, 7))
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
for await (const x of asyncIterable) {
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 15, 20))
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 20, 20))
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
}
for await (const x of iterable) {
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 17, 20))
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 22, 20))
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
}
for await (const x of iterableOfPromise) {
>x : Symbol(x, Decl(types.forAwait.esnext.1.ts, 24, 20))
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
}
for await (y of asyncIterable) {
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 14, 7))
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
>asyncIterable : Symbol(asyncIterable, Decl(types.forAwait.esnext.1.ts, 0, 13))
}
for await (y of iterable) {
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 14, 7))
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
>iterable : Symbol(iterable, Decl(types.forAwait.esnext.1.ts, 1, 13))
}
for await (y of iterableOfPromise) {
>y : Symbol(y, Decl(types.forAwait.esnext.1.ts, 19, 7))
>iterableOfPromise : Symbol(iterableOfPromise, Decl(types.forAwait.esnext.1.ts, 2, 13))
}
}

View File

@ -5,6 +5,9 @@ declare const asyncIterable: AsyncIterable<number>;
declare const iterable: Iterable<number>;
>iterable : Iterable<number>
declare const iterableOfPromise: Iterable<Promise<number>>;
>iterableOfPromise : Iterable<Promise<number>>
async function f1() {
>f1 : () => Promise<void>
@ -18,6 +21,10 @@ async function f1() {
for await (const x of iterable) {
>x : number
>iterable : Iterable<number>
}
for await (const x of iterableOfPromise) {
>x : number
>iterableOfPromise : Iterable<Promise<number>>
}
for await (y of asyncIterable) {
>y : number
@ -27,6 +34,10 @@ async function f1() {
>y : number
>iterable : Iterable<number>
}
for await (y of iterableOfPromise) {
>y : number
>iterableOfPromise : Iterable<Promise<number>>
}
}
async function * f2() {
>f2 : () => AsyncIterableIterator<any>
@ -41,6 +52,10 @@ async function * f2() {
for await (const x of iterable) {
>x : number
>iterable : Iterable<number>
}
for await (const x of iterableOfPromise) {
>x : number
>iterableOfPromise : Iterable<Promise<number>>
}
for await (y of asyncIterable) {
>y : number
@ -50,4 +65,8 @@ async function * f2() {
>y : number
>iterable : Iterable<number>
}
for await (y of iterableOfPromise) {
>y : number
>iterableOfPromise : Iterable<Promise<number>>
}
}

View File

@ -3,16 +3,21 @@
// @noEmit: true
declare const asyncIterable: AsyncIterable<number>;
declare const iterable: Iterable<number>;
declare const iterableOfPromise: Iterable<Promise<number>>;
async function f1() {
let y: number;
for await (const x of asyncIterable) {
}
for await (const x of iterable) {
}
for await (const x of iterableOfPromise) {
}
for await (y of asyncIterable) {
}
for await (y of iterable) {
}
for await (y of iterableOfPromise) {
}
}
async function * f2() {
let y: number;
@ -20,8 +25,12 @@ async function * f2() {
}
for await (const x of iterable) {
}
for await (const x of iterableOfPromise) {
}
for await (y of asyncIterable) {
}
for await (y of iterable) {
}
for await (y of iterableOfPromise) {
}
}