Optimize direct Iterable reference in getIteratedType

This commit is contained in:
Jason Freeman 2015-03-25 18:38:14 -07:00
parent e1f2fbff63
commit 197a42a692
7 changed files with 49 additions and 0 deletions

View file

@ -9346,6 +9346,12 @@ module ts {
return undefined;
}
// As an optimization, if the type is instantiated directly using the globalIterableType (Iterable<number>),
// then just grab its type argument.
if ((iterable.flags & TypeFlags.Reference) && (<GenericType>iterable).target === globalIterableType) {
return (<GenericType>iterable).typeArguments[0];
}
let iteratorFunction = getTypeOfPropertyOfType(iterable, getPropertyNameForKnownSymbolName("iterator"));
if (iteratorFunction && allConstituentTypesHaveKind(iteratorFunction, TypeFlags.Any)) {
return undefined;

View file

@ -0,0 +1,8 @@
//// [for-of57.ts]
var iter: Iterable<number>;
for (let num of iter) { }
//// [for-of57.js]
var iter;
for (let num of iter) {
}

View file

@ -0,0 +1,9 @@
=== tests/cases/conformance/es6/for-ofStatements/for-of57.ts ===
var iter: Iterable<number>;
>iter : Iterable<number>
>Iterable : Iterable<T>
for (let num of iter) { }
>num : number
>iter : Iterable<number>

View file

@ -0,0 +1,9 @@
//// [iteratorSpreadInArray11.ts]
var iter: Iterable<number>;
var array = [...iter];
//// [iteratorSpreadInArray11.js]
var iter;
var array = [
...iter
];

View file

@ -0,0 +1,11 @@
=== tests/cases/conformance/es6/spread/iteratorSpreadInArray11.ts ===
var iter: Iterable<number>;
>iter : Iterable<number>
>Iterable : Iterable<T>
var array = [...iter];
>array : number[]
>[...iter] : number[]
>...iter : number
>iter : Iterable<number>

View file

@ -0,0 +1,3 @@
//@target: ES6
var iter: Iterable<number>;
for (let num of iter) { }

View file

@ -0,0 +1,3 @@
//@target: ES6
var iter: Iterable<number>;
var array = [...iter];