diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index b0d0e2cbcdb..cb08d23828b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7474,11 +7474,10 @@ namespace ts { // check if node is used as LHS in some assignment expression let isAssigned = false; - if (current.parent.kind === SyntaxKind.BinaryExpression) { - isAssigned = (current.parent).left === current && isAssignmentOperator((current.parent).operatorToken.kind); + if (isAssignmentTarget(current)) { + isAssigned = true; } - - if ((current.parent.kind === SyntaxKind.PrefixUnaryExpression || current.parent.kind === SyntaxKind.PostfixUnaryExpression)) { + else if ((current.parent.kind === SyntaxKind.PrefixUnaryExpression || current.parent.kind === SyntaxKind.PostfixUnaryExpression)) { const expr = current.parent; isAssigned = expr.operator === SyntaxKind.PlusPlusToken || expr.operator === SyntaxKind.MinusMinusToken; } diff --git a/tests/baselines/reference/capturedLetConstInLoop12.js b/tests/baselines/reference/capturedLetConstInLoop12.js new file mode 100644 index 00000000000..7235c959a59 --- /dev/null +++ b/tests/baselines/reference/capturedLetConstInLoop12.js @@ -0,0 +1,42 @@ +//// [capturedLetConstInLoop12.ts] +(function() { + "use strict"; + + for (let i = 0; i < 4; i++) { + (() => [i] = [i + 1])(); + } +})(); + +(function() { + "use strict"; + + for (let i = 0; i < 4; i++) { + (() => ({a:i} = {a:i + 1}))(); + } +})(); + +//// [capturedLetConstInLoop12.js] +(function () { + "use strict"; + var _loop_1 = function(i) { + (function () { return (_a = [i + 1], i = _a[0], _a); var _a; })(); + out_i_1 = i; + }; + var out_i_1; + for (var i = 0; i < 4; i++) { + _loop_1(i); + i = out_i_1; + } +})(); +(function () { + "use strict"; + var _loop_2 = function(i) { + (function () { return (_a = { a: i + 1 }, i = _a.a, _a); var _a; })(); + out_i_2 = i; + }; + var out_i_2; + for (var i = 0; i < 4; i++) { + _loop_2(i); + i = out_i_2; + } +})(); diff --git a/tests/baselines/reference/capturedLetConstInLoop12.symbols b/tests/baselines/reference/capturedLetConstInLoop12.symbols new file mode 100644 index 00000000000..8c0338ea84e --- /dev/null +++ b/tests/baselines/reference/capturedLetConstInLoop12.symbols @@ -0,0 +1,30 @@ +=== tests/cases/compiler/capturedLetConstInLoop12.ts === +(function() { + "use strict"; + + for (let i = 0; i < 4; i++) { +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12)) + + (() => [i] = [i + 1])(); +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 3, 12)) + } +})(); + +(function() { + "use strict"; + + for (let i = 0; i < 4; i++) { +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12)) + + (() => ({a:i} = {a:i + 1}))(); +>a : Symbol(a, Decl(capturedLetConstInLoop12.ts, 12, 17)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12)) +>a : Symbol(a, Decl(capturedLetConstInLoop12.ts, 12, 25)) +>i : Symbol(i, Decl(capturedLetConstInLoop12.ts, 11, 12)) + } +})(); diff --git a/tests/baselines/reference/capturedLetConstInLoop12.types b/tests/baselines/reference/capturedLetConstInLoop12.types new file mode 100644 index 00000000000..aee671b4d36 --- /dev/null +++ b/tests/baselines/reference/capturedLetConstInLoop12.types @@ -0,0 +1,65 @@ +=== tests/cases/compiler/capturedLetConstInLoop12.ts === +(function() { +>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => [i] = [i + 1])(); }})() : void +>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => [i] = [i + 1])(); }}) : () => void +>function() { "use strict"; for (let i = 0; i < 4; i++) { (() => [i] = [i + 1])(); }} : () => void + + "use strict"; +>"use strict" : string + + for (let i = 0; i < 4; i++) { +>i : number +>0 : number +>i < 4 : boolean +>i : number +>4 : number +>i++ : number +>i : number + + (() => [i] = [i + 1])(); +>(() => [i] = [i + 1])() : [number] +>(() => [i] = [i + 1]) : () => [number] +>() => [i] = [i + 1] : () => [number] +>[i] = [i + 1] : [number] +>[i] : [number] +>i : number +>[i + 1] : [number] +>i + 1 : number +>i : number +>1 : number + } +})(); + +(function() { +>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => ({a:i} = {a:i + 1}))(); }})() : void +>(function() { "use strict"; for (let i = 0; i < 4; i++) { (() => ({a:i} = {a:i + 1}))(); }}) : () => void +>function() { "use strict"; for (let i = 0; i < 4; i++) { (() => ({a:i} = {a:i + 1}))(); }} : () => void + + "use strict"; +>"use strict" : string + + for (let i = 0; i < 4; i++) { +>i : number +>0 : number +>i < 4 : boolean +>i : number +>4 : number +>i++ : number +>i : number + + (() => ({a:i} = {a:i + 1}))(); +>(() => ({a:i} = {a:i + 1}))() : { a: number; } +>(() => ({a:i} = {a:i + 1})) : () => { a: number; } +>() => ({a:i} = {a:i + 1}) : () => { a: number; } +>({a:i} = {a:i + 1}) : { a: number; } +>{a:i} = {a:i + 1} : { a: number; } +>{a:i} : { a: number; } +>a : number +>i : number +>{a:i + 1} : { a: number; } +>a : number +>i + 1 : number +>i : number +>1 : number + } +})(); diff --git a/tests/cases/compiler/capturedLetConstInLoop12.ts b/tests/cases/compiler/capturedLetConstInLoop12.ts new file mode 100644 index 00000000000..5540f75635e --- /dev/null +++ b/tests/cases/compiler/capturedLetConstInLoop12.ts @@ -0,0 +1,15 @@ +(function() { + "use strict"; + + for (let i = 0; i < 4; i++) { + (() => [i] = [i + 1])(); + } +})(); + +(function() { + "use strict"; + + for (let i = 0; i < 4; i++) { + (() => ({a:i} = {a:i + 1}))(); + } +})(); \ No newline at end of file