Skip to content

Commit 489bf92

Browse files
committed
Merge pull request #7464 from Microsoft/capturedLetConstInDestructuringAssignment
correctly recognize captured loop variables in destructuring assignment
2 parents bda5737 + 7344d9c commit 489bf92

File tree

5 files changed

+155
-4
lines changed

5 files changed

+155
-4
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7485,11 +7485,10 @@ namespace ts {
74857485

74867486
// check if node is used as LHS in some assignment expression
74877487
let isAssigned = false;
7488-
if (current.parent.kind === SyntaxKind.BinaryExpression) {
7489-
isAssigned = (<BinaryExpression>current.parent).left === current && isAssignmentOperator((<BinaryExpression>current.parent).operatorToken.kind);
7488+
if (isAssignmentTarget(current)) {
7489+
isAssigned = true;
74907490
}
7491-
7492-
if ((current.parent.kind === SyntaxKind.PrefixUnaryExpression || current.parent.kind === SyntaxKind.PostfixUnaryExpression)) {
7491+
else if ((current.parent.kind === SyntaxKind.PrefixUnaryExpression || current.parent.kind === SyntaxKind.PostfixUnaryExpression)) {
74937492
const expr = <PrefixUnaryExpression | PostfixUnaryExpression>current.parent;
74947493
isAssigned = expr.operator === SyntaxKind.PlusPlusToken || expr.operator === SyntaxKind.MinusMinusToken;
74957494
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//// [capturedLetConstInLoop12.ts]
2+
(function() {
3+
"use strict";
4+
5+
for (let i = 0; i < 4; i++) {
6+
(() => [i] = [i + 1])();
7+
}
8+
})();
9+
10+
(function() {
11+
"use strict";
12+
13+
for (let i = 0; i < 4; i++) {
14+
(() => ({a:i} = {a:i + 1}))();
15+
}
16+
})();
17+
18+
//// [capturedLetConstInLoop12.js]
19+
(function () {
20+
"use strict";
21+
var _loop_1 = function(i) {
22+
(function () { return (_a = [i + 1], i = _a[0], _a); var _a; })();
23+
out_i_1 = i;
24+
};
25+
var out_i_1;
26+
for (var i = 0; i < 4; i++) {
27+
_loop_1(i);
28+
i = out_i_1;
29+
}
30+
})();
31+
(function () {
32+
"use strict";
33+
var _loop_2 = function(i) {
34+
(function () { return (_a = { a: i + 1 }, i = _a.a, _a); var _a; })();
35+
out_i_2 = i;
36+
};
37+
var out_i_2;
38+
for (var i = 0; i < 4; i++) {
39+
_loop_2(i);
40+
i = out_i_2;
41+
}
42+
})();
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
=== tests/cases/compiler/capturedLetConstInLoop12.ts ===
2+
(function() {
3+
"use strict";
4+
5+
for (let i = 0; i < 4; i++) {
6+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12))
7+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12))
8+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12))
9+
10+
(() => [i] = [i + 1])();
11+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12))
12+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12))
13+
}
14+
})();
15+
16+
(function() {
17+
"use strict";
18+
19+
for (let i = 0; i < 4; i++) {
20+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12))
21+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12))
22+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12))
23+
24+
(() => ({a:i} = {a:i + 1}))();
25+
>a : Symbol(a, Decl(capturedLetConstInLoop12.ts, 12, 17))
26+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12))
27+
>a : Symbol(a, Decl(capturedLetConstInLoop12.ts, 12, 25))
28+
>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12))
29+
}
30+
})();
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
=== tests/cases/compiler/capturedLetConstInLoop12.ts ===
2+
(function() {
3+
>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => [i] = [i + 1])(); }})() : void
4+
>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => [i] = [i + 1])(); }}) : () => void
5+
>function() { "use strict"; for (let i = 0; i < 4; i++) { (() => [i] = [i + 1])(); }} : () => void
6+
7+
"use strict";
8+
>"use strict" : string
9+
10+
for (let i = 0; i < 4; i++) {
11+
>i : number
12+
>0 : number
13+
>i < 4 : boolean
14+
>i : number
15+
>4 : number
16+
>i++ : number
17+
>i : number
18+
19+
(() => [i] = [i + 1])();
20+
>(() => [i] = [i + 1])() : [number]
21+
>(() => [i] = [i + 1]) : () => [number]
22+
>() => [i] = [i + 1] : () => [number]
23+
>[i] = [i + 1] : [number]
24+
>[i] : [number]
25+
>i : number
26+
>[i + 1] : [number]
27+
>i + 1 : number
28+
>i : number
29+
>1 : number
30+
}
31+
})();
32+
33+
(function() {
34+
>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => ({a:i} = {a:i + 1}))(); }})() : void
35+
>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => ({a:i} = {a:i + 1}))(); }}) : () => void
36+
>function() { "use strict"; for (let i = 0; i < 4; i++) { (() => ({a:i} = {a:i + 1}))(); }} : () => void
37+
38+
"use strict";
39+
>"use strict" : string
40+
41+
for (let i = 0; i < 4; i++) {
42+
>i : number
43+
>0 : number
44+
>i < 4 : boolean
45+
>i : number
46+
>4 : number
47+
>i++ : number
48+
>i : number
49+
50+
(() => ({a:i} = {a:i + 1}))();
51+
>(() => ({a:i} = {a:i + 1}))() : { a: number; }
52+
>(() => ({a:i} = {a:i + 1})) : () => { a: number; }
53+
>() => ({a:i} = {a:i + 1}) : () => { a: number; }
54+
>({a:i} = {a:i + 1}) : { a: number; }
55+
>{a:i} = {a:i + 1} : { a: number; }
56+
>{a:i} : { a: number; }
57+
>a : number
58+
>i : number
59+
>{a:i + 1} : { a: number; }
60+
>a : number
61+
>i + 1 : number
62+
>i : number
63+
>1 : number
64+
}
65+
})();
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
(function() {
2+
"use strict";
3+
4+
for (let i = 0; i < 4; i++) {
5+
(() => [i] = [i + 1])();
6+
}
7+
})();
8+
9+
(function() {
10+
"use strict";
11+
12+
for (let i = 0; i < 4; i++) {
13+
(() => ({a:i} = {a:i + 1}))();
14+
}
15+
})();

0 commit comments

Comments
 (0)