diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index ae20772a209..7c4b9fe8dca 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8828,20 +8828,7 @@ module ts { return anyType; } - var variable = forOfStatement.initializer; - var links = getNodeLinks(variable); - if (!links.resolvedType) { - links.resolvedType = resolvingType; - var type = getIteratedType(getTypeOfExpression(forOfStatement.expression), forOfStatement.expression); - if (links.resolvedType === resolvingType) { - links.resolvedType = type; - } - } - else if (links.resolvedType === resolvingType) { - links.resolvedType = anyType; - } - - return links.resolvedType; + return getIteratedType(getTypeOfExpression(forOfStatement.expression), forOfStatement.expression); } function getIteratedType(iterable: Type, expressionForError: Expression): Type { diff --git a/tests/baselines/reference/for-of32.errors.txt b/tests/baselines/reference/for-of32.errors.txt new file mode 100644 index 00000000000..4b139d386c0 --- /dev/null +++ b/tests/baselines/reference/for-of32.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/for-ofStatements/for-of32.ts(1,10): error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + +==== tests/cases/conformance/es6/for-ofStatements/for-of32.ts (1 errors) ==== + for (var v of v) { } + ~ +!!! error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. \ No newline at end of file diff --git a/tests/baselines/reference/for-of32.js b/tests/baselines/reference/for-of32.js new file mode 100644 index 00000000000..d25d16fbebe --- /dev/null +++ b/tests/baselines/reference/for-of32.js @@ -0,0 +1,5 @@ +//// [for-of32.ts] +for (var v of v) { } + +//// [for-of32.js] +for (var v of v) { } diff --git a/tests/baselines/reference/for-of33.errors.txt b/tests/baselines/reference/for-of33.errors.txt new file mode 100644 index 00000000000..1c631042d7d --- /dev/null +++ b/tests/baselines/reference/for-of33.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/es6/for-ofStatements/for-of33.ts(1,10): error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + +==== tests/cases/conformance/es6/for-ofStatements/for-of33.ts (1 errors) ==== + for (var v of new StringIterator) { } + ~ +!!! error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + class StringIterator { + [Symbol.iterator]() { + return v; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/for-of33.js b/tests/baselines/reference/for-of33.js new file mode 100644 index 00000000000..91d8de41c6a --- /dev/null +++ b/tests/baselines/reference/for-of33.js @@ -0,0 +1,19 @@ +//// [for-of33.ts] +for (var v of new StringIterator) { } + +class StringIterator { + [Symbol.iterator]() { + return v; + } +} + +//// [for-of33.js] +for (var v of new StringIterator) { } +var StringIterator = (function () { + function StringIterator() { + } + StringIterator.prototype[Symbol.iterator] = function () { + return v; + }; + return StringIterator; +})(); diff --git a/tests/baselines/reference/for-of34.errors.txt b/tests/baselines/reference/for-of34.errors.txt new file mode 100644 index 00000000000..994302db88b --- /dev/null +++ b/tests/baselines/reference/for-of34.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/es6/for-ofStatements/for-of34.ts(1,10): error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + +==== tests/cases/conformance/es6/for-ofStatements/for-of34.ts (1 errors) ==== + for (var v of new StringIterator) { } + ~ +!!! error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + class StringIterator { + next() { + return v; + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/for-of34.js b/tests/baselines/reference/for-of34.js new file mode 100644 index 00000000000..ccb6006c63d --- /dev/null +++ b/tests/baselines/reference/for-of34.js @@ -0,0 +1,26 @@ +//// [for-of34.ts] +for (var v of new StringIterator) { } + +class StringIterator { + next() { + return v; + } + + [Symbol.iterator]() { + return this; + } +} + +//// [for-of34.js] +for (var v of new StringIterator) { } +var StringIterator = (function () { + function StringIterator() { + } + StringIterator.prototype.next = function () { + return v; + }; + StringIterator.prototype[Symbol.iterator] = function () { + return this; + }; + return StringIterator; +})(); diff --git a/tests/baselines/reference/for-of35.errors.txt b/tests/baselines/reference/for-of35.errors.txt new file mode 100644 index 00000000000..f83b6d2ec3c --- /dev/null +++ b/tests/baselines/reference/for-of35.errors.txt @@ -0,0 +1,20 @@ +tests/cases/conformance/es6/for-ofStatements/for-of35.ts(1,10): error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + +==== tests/cases/conformance/es6/for-ofStatements/for-of35.ts (1 errors) ==== + for (var v of new StringIterator) { } + ~ +!!! error TS7022: 'v' implicitly has type 'any' because it is does not have a type annotation and is referenced directly or indirectly in its own initializer. + + class StringIterator { + next() { + return { + done: true, + value: v + } + } + + [Symbol.iterator]() { + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/for-of35.js b/tests/baselines/reference/for-of35.js new file mode 100644 index 00000000000..a4f1a37e3bf --- /dev/null +++ b/tests/baselines/reference/for-of35.js @@ -0,0 +1,32 @@ +//// [for-of35.ts] +for (var v of new StringIterator) { } + +class StringIterator { + next() { + return { + done: true, + value: v + } + } + + [Symbol.iterator]() { + return this; + } +} + +//// [for-of35.js] +for (var v of new StringIterator) { } +var StringIterator = (function () { + function StringIterator() { + } + StringIterator.prototype.next = function () { + return { + done: true, + value: v + }; + }; + StringIterator.prototype[Symbol.iterator] = function () { + return this; + }; + return StringIterator; +})(); diff --git a/tests/cases/conformance/es6/for-ofStatements/for-of32.ts b/tests/cases/conformance/es6/for-ofStatements/for-of32.ts new file mode 100644 index 00000000000..de95350b724 --- /dev/null +++ b/tests/cases/conformance/es6/for-ofStatements/for-of32.ts @@ -0,0 +1,3 @@ +//@target: ES6 +//@noImplicitAny: true +for (var v of v) { } \ No newline at end of file diff --git a/tests/cases/conformance/es6/for-ofStatements/for-of33.ts b/tests/cases/conformance/es6/for-ofStatements/for-of33.ts new file mode 100644 index 00000000000..b73d2daee8a --- /dev/null +++ b/tests/cases/conformance/es6/for-ofStatements/for-of33.ts @@ -0,0 +1,9 @@ +//@target: ES6 +//@noImplicitAny: true +for (var v of new StringIterator) { } + +class StringIterator { + [Symbol.iterator]() { + return v; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/for-ofStatements/for-of34.ts b/tests/cases/conformance/es6/for-ofStatements/for-of34.ts new file mode 100644 index 00000000000..d00f5ccde2e --- /dev/null +++ b/tests/cases/conformance/es6/for-ofStatements/for-of34.ts @@ -0,0 +1,13 @@ +//@target: ES6 +//@noImplicitAny: true +for (var v of new StringIterator) { } + +class StringIterator { + next() { + return v; + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/es6/for-ofStatements/for-of35.ts b/tests/cases/conformance/es6/for-ofStatements/for-of35.ts new file mode 100644 index 00000000000..0d66ce39edf --- /dev/null +++ b/tests/cases/conformance/es6/for-ofStatements/for-of35.ts @@ -0,0 +1,16 @@ +//@target: ES6 +//@noImplicitAny: true +for (var v of new StringIterator) { } + +class StringIterator { + next() { + return { + done: true, + value: v + } + } + + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file