Skip to content

Commit 83da326

Browse files
authored
Merge pull request #15624 from Microsoft/fix15603
Fix var emit order for converted loops
2 parents 681f33e + ada4b3d commit 83da326

File tree

5 files changed

+77
-1
lines changed

5 files changed

+77
-1
lines changed

Diff for: src/compiler/transformers/es2015.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2009,13 +2009,14 @@ namespace ts {
20092009
}
20102010
else {
20112011
assignment = createBinary(<Identifier>decl.name, SyntaxKind.EqualsToken, visitNode(decl.initializer, visitor, isExpression));
2012+
setTextRange(assignment, decl);
20122013
}
20132014

20142015
assignments = append(assignments, assignment);
20152016
}
20162017
}
20172018
if (assignments) {
2018-
updated = setTextRange(createStatement(reduceLeft(assignments, (acc, v) => createBinary(v, SyntaxKind.CommaToken, acc))), node);
2019+
updated = setTextRange(createStatement(inlineExpressions(assignments)), node);
20192020
}
20202021
else {
20212022
// none of declarations has initializer - the entire variable statement can be deleted

Diff for: tests/baselines/reference/capturedVarInLoop.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//// [capturedVarInLoop.ts]
2+
for (var i = 0; i < 10; i++) {
3+
var str = 'x', len = str.length;
4+
let lambda1 = (y) => { };
5+
let lambda2 = () => lambda1(len);
6+
}
7+
8+
//// [capturedVarInLoop.js]
9+
var _loop_1 = function () {
10+
str = 'x', len = str.length;
11+
var lambda1 = function (y) { };
12+
var lambda2 = function () { return lambda1(len); };
13+
};
14+
var str, len;
15+
for (var i = 0; i < 10; i++) {
16+
_loop_1();
17+
}

Diff for: tests/baselines/reference/capturedVarInLoop.symbols

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
=== tests/cases/compiler/capturedVarInLoop.ts ===
2+
for (var i = 0; i < 10; i++) {
3+
>i : Symbol(i, Decl(capturedVarInLoop.ts, 0, 8))
4+
>i : Symbol(i, Decl(capturedVarInLoop.ts, 0, 8))
5+
>i : Symbol(i, Decl(capturedVarInLoop.ts, 0, 8))
6+
7+
var str = 'x', len = str.length;
8+
>str : Symbol(str, Decl(capturedVarInLoop.ts, 1, 7))
9+
>len : Symbol(len, Decl(capturedVarInLoop.ts, 1, 18))
10+
>str.length : Symbol(String.length, Decl(lib.d.ts, --, --))
11+
>str : Symbol(str, Decl(capturedVarInLoop.ts, 1, 7))
12+
>length : Symbol(String.length, Decl(lib.d.ts, --, --))
13+
14+
let lambda1 = (y) => { };
15+
>lambda1 : Symbol(lambda1, Decl(capturedVarInLoop.ts, 2, 7))
16+
>y : Symbol(y, Decl(capturedVarInLoop.ts, 2, 19))
17+
18+
let lambda2 = () => lambda1(len);
19+
>lambda2 : Symbol(lambda2, Decl(capturedVarInLoop.ts, 3, 7))
20+
>lambda1 : Symbol(lambda1, Decl(capturedVarInLoop.ts, 2, 7))
21+
>len : Symbol(len, Decl(capturedVarInLoop.ts, 1, 18))
22+
}

Diff for: tests/baselines/reference/capturedVarInLoop.types

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
=== tests/cases/compiler/capturedVarInLoop.ts ===
2+
for (var i = 0; i < 10; i++) {
3+
>i : number
4+
>0 : 0
5+
>i < 10 : boolean
6+
>i : number
7+
>10 : 10
8+
>i++ : number
9+
>i : number
10+
11+
var str = 'x', len = str.length;
12+
>str : string
13+
>'x' : "x"
14+
>len : number
15+
>str.length : number
16+
>str : string
17+
>length : number
18+
19+
let lambda1 = (y) => { };
20+
>lambda1 : (y: any) => void
21+
>(y) => { } : (y: any) => void
22+
>y : any
23+
24+
let lambda2 = () => lambda1(len);
25+
>lambda2 : () => void
26+
>() => lambda1(len) : () => void
27+
>lambda1(len) : void
28+
>lambda1 : (y: any) => void
29+
>len : number
30+
}

Diff for: tests/cases/compiler/capturedVarInLoop.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// @target: es5
2+
for (var i = 0; i < 10; i++) {
3+
var str = 'x', len = str.length;
4+
let lambda1 = (y) => { };
5+
let lambda2 = () => lambda1(len);
6+
}

0 commit comments

Comments
 (0)