Skip to content

Commit f915efa

Browse files
committed
Emit for...of when LHS is expression
1 parent 9b76a02 commit f915efa

13 files changed

Lines changed: 120 additions & 9 deletions

File tree

src/compiler/emitter.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3491,10 +3491,10 @@ module ts {
34913491
var endPos = emitToken(SyntaxKind.ForKeyword, node.pos);
34923492
write(" ");
34933493
endPos = emitToken(SyntaxKind.OpenParenToken, endPos);
3494+
write("var ");
34943495
if (node.initializer.kind === SyntaxKind.VariableDeclarationList) {
34953496
var variableDeclarationList = <VariableDeclarationList>node.initializer;
34963497
if (variableDeclarationList.declarations.length >= 1) {
3497-
write("var ");
34983498
var decl = variableDeclarationList.declarations[0];
34993499
// TODO handle binding patterns
35003500
emit(decl.name);
@@ -3537,13 +3537,25 @@ module ts {
35373537
// v = _a[_i];
35383538
if (decl) {
35393539
emit(decl.name);
3540-
write(" = ");
3541-
emit(rhsReference)
3542-
write("[");
3543-
emit(counter);
3544-
write("];");
3545-
writeLine();
35463540
}
3541+
else if (variableDeclarationList) {
3542+
// It's an empty declaration list. This can only happen in an error case, if the user wrote
3543+
// for (var of []) {}
3544+
var emptyDeclarationListTemp = createTempVariable(node, /*forLoopVariable*/ false);
3545+
write("var ");
3546+
emit(emptyDeclarationListTemp);
3547+
}
3548+
else {
3549+
// Initializer is an expression. Emit the expression in the body, so that it's
3550+
// evaluated on every iteration.
3551+
emit(node.initializer);
3552+
}
3553+
write(" = ");
3554+
emit(rhsReference)
3555+
write("[");
3556+
emit(counter);
3557+
write("];");
3558+
writeLine();
35473559

35483560
if (node.statement.kind === SyntaxKind.Block) {
35493561
emitLines((<Block>node.statement).statements);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
//// [ES5For-of10.ts]
2+
function foo() {
3+
return { x: 0 };
4+
}
5+
for (foo().x of []) {
6+
for (foo().x of [])
7+
var p = foo().x;
8+
}
9+
10+
//// [ES5For-of10.js]
11+
function foo() {
12+
return { x: 0 };
13+
}
14+
for (var _i = 0, _a = []; _i < _a.length; _i++) {
15+
foo().x = _a[_i];
16+
for (var _i_1 = 0, _a_1 = []; _i_1 < _a_1.length; _i_1++) {
17+
foo().x = _a_1[_i_1];
18+
var p = foo().x;
19+
}
20+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
//// [ES5For-of11.ts]
2+
var v;
3+
for (v of []) { }
4+
5+
//// [ES5For-of11.js]
6+
var v;
7+
for (var _i = 0, _a = []; _i < _a.length; _i++) {
8+
v = _a[_i];
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
//// [ES5For-of12.ts]
2+
for ([""] of []) { }
3+
4+
//// [ES5For-of12.js]
5+
for (var _i = 0, _a = []; _i < _a.length; _i++) {
6+
[""] = _a[_i];
7+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//// [ES5For-of8.ts]
2+
function foo() {
3+
return { x: 0 };
4+
}
5+
for (foo().x of []) {
6+
var p = foo().x;
7+
}
8+
9+
//// [ES5For-of8.js]
10+
function foo() {
11+
return { x: 0 };
12+
}
13+
for (var _i = 0, _a = []; _i < _a.length; _i++) {
14+
foo().x = _a[_i];
15+
var p = foo().x;
16+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [ES5For-of9.ts]
2+
function foo() {
3+
return { x: 0 };
4+
}
5+
for (foo().x of []) {
6+
for (foo().x of []) {
7+
var p = foo().x;
8+
}
9+
}
10+
11+
//// [ES5For-of9.js]
12+
function foo() {
13+
return { x: 0 };
14+
}
15+
for (var _i = 0, _a = []; _i < _a.length; _i++) {
16+
foo().x = _a[_i];
17+
for (var _i_1 = 0, _a_1 = []; _i_1 < _a_1.length; _i_1++) {
18+
foo().x = _a_1[_i_1];
19+
var p = foo().x;
20+
}
21+
}

tests/baselines/reference/parserES5ForOfStatement2.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ for (var of X) {
33
}
44

55
//// [parserES5ForOfStatement2.js]
6-
for (_i = 0, _a = X; _i < _a.length; _i++) {
6+
for (var _i = 0, _a = X; _i < _a.length; _i++) {
7+
var _a_1 = _a[_i];
78
}

tests/baselines/reference/parserES5ForOfStatement21.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
for (var of of) { }
33

44
//// [parserES5ForOfStatement21.js]
5-
for (_i = 0, _a = of; _i < _a.length; _i++) {
5+
for (var _i = 0, _a = of; _i < _a.length; _i++) {
6+
var _a_1 = _a[_i];
67
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
function foo() {
2+
return { x: 0 };
3+
}
4+
for (foo().x of []) {
5+
for (foo().x of [])
6+
var p = foo().x;
7+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
var v;
2+
for (v of []) { }

0 commit comments

Comments
 (0)