Skip to content

Commit 229acaa

Browse files
committed
Add more check
1 parent f9c78a6 commit 229acaa

11 files changed

+126
-87
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
/*@internal*/
22
namespace ts {
33
export function transformESNext(context: TransformationContext) {
4+
const {
5+
hoistVariableDeclaration
6+
} = context;
47
return chainBundle(transformSourceFile);
58

69
function transformSourceFile(node: SourceFile) {
@@ -31,15 +34,45 @@ namespace ts {
3134
const operator = binaryExpression.operatorToken;
3235
if (isCompoundAssignment(operator.kind) && isLogicalOrCoalescingAssignmentOperator(operator.kind)) {
3336
const nonAssignmentOperator = getNonAssignmentOperatorForCompoundAssignment(operator.kind);
34-
const left = visitNode(binaryExpression.left, visitor, isExpression);
35-
const right = visitNode(binaryExpression.right, visitor, isExpression);
37+
let left = skipParentheses(visitNode(binaryExpression.left, visitor, isLeftHandSideExpression));
38+
let assignmentTarget = left
39+
const right = skipParentheses(visitNode(binaryExpression.right, visitor, isExpression));
40+
if (isPropertyAccessExpression(left) || isElementAccessExpression(left)) {
41+
const tempVariable = createTempVariable(hoistVariableDeclaration)
42+
if (isPropertyAccessExpression(left)) {
43+
assignmentTarget = createPropertyAccess(
44+
tempVariable,
45+
left.name
46+
);
47+
left = createPropertyAccess(
48+
createAssignment(
49+
tempVariable,
50+
left.expression
51+
),
52+
left.name
53+
);
54+
}
55+
else {
56+
assignmentTarget = createElementAccess(
57+
tempVariable,
58+
left.argumentExpression
59+
);
60+
left = createElementAccess(
61+
createAssignment(
62+
tempVariable,
63+
left.expression
64+
),
65+
left.argumentExpression
66+
);
67+
}
68+
}
3669

3770
return createBinary(
3871
left,
3972
nonAssignmentOperator,
4073
createParen(
4174
createAssignment(
42-
left,
75+
assignmentTarget,
4376
right
4477
)
4578
)

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -388,28 +388,29 @@ declare namespace ts {
388388
JSDocAugmentsTag = 310,
389389
JSDocImplementsTag = 311,
390390
JSDocAuthorTag = 312,
391-
JSDocClassTag = 313,
392-
JSDocPublicTag = 314,
393-
JSDocPrivateTag = 315,
394-
JSDocProtectedTag = 316,
395-
JSDocReadonlyTag = 317,
396-
JSDocCallbackTag = 318,
397-
JSDocEnumTag = 319,
398-
JSDocParameterTag = 320,
399-
JSDocReturnTag = 321,
400-
JSDocThisTag = 322,
401-
JSDocTypeTag = 323,
402-
JSDocTemplateTag = 324,
403-
JSDocTypedefTag = 325,
404-
JSDocPropertyTag = 326,
405-
SyntaxList = 327,
406-
NotEmittedStatement = 328,
407-
PartiallyEmittedExpression = 329,
408-
CommaListExpression = 330,
409-
MergeDeclarationMarker = 331,
410-
EndOfDeclarationMarker = 332,
411-
SyntheticReferenceExpression = 333,
412-
Count = 334,
391+
JSDocDeprecatedTag = 313,
392+
JSDocClassTag = 314,
393+
JSDocPublicTag = 315,
394+
JSDocPrivateTag = 316,
395+
JSDocProtectedTag = 317,
396+
JSDocReadonlyTag = 318,
397+
JSDocCallbackTag = 319,
398+
JSDocEnumTag = 320,
399+
JSDocParameterTag = 321,
400+
JSDocReturnTag = 322,
401+
JSDocThisTag = 323,
402+
JSDocTypeTag = 324,
403+
JSDocTemplateTag = 325,
404+
JSDocTypedefTag = 326,
405+
JSDocPropertyTag = 327,
406+
SyntaxList = 328,
407+
NotEmittedStatement = 329,
408+
PartiallyEmittedExpression = 330,
409+
CommaListExpression = 331,
410+
MergeDeclarationMarker = 332,
411+
EndOfDeclarationMarker = 333,
412+
SyntheticReferenceExpression = 334,
413+
Count = 335,
413414
FirstAssignment = 62,
414415
LastAssignment = 77,
415416
FirstCompoundAssignment = 63,
@@ -438,9 +439,9 @@ declare namespace ts {
438439
LastStatement = 244,
439440
FirstNode = 156,
440441
FirstJSDocNode = 297,
441-
LastJSDocNode = 326,
442+
LastJSDocNode = 327,
442443
FirstJSDocTagNode = 309,
443-
LastJSDocTagNode = 326,
444+
LastJSDocTagNode = 327,
444445
}
445446
export enum NodeFlags {
446447
None = 0,

tests/baselines/reference/api/typescript.d.ts

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -388,28 +388,29 @@ declare namespace ts {
388388
JSDocAugmentsTag = 310,
389389
JSDocImplementsTag = 311,
390390
JSDocAuthorTag = 312,
391-
JSDocClassTag = 313,
392-
JSDocPublicTag = 314,
393-
JSDocPrivateTag = 315,
394-
JSDocProtectedTag = 316,
395-
JSDocReadonlyTag = 317,
396-
JSDocCallbackTag = 318,
397-
JSDocEnumTag = 319,
398-
JSDocParameterTag = 320,
399-
JSDocReturnTag = 321,
400-
JSDocThisTag = 322,
401-
JSDocTypeTag = 323,
402-
JSDocTemplateTag = 324,
403-
JSDocTypedefTag = 325,
404-
JSDocPropertyTag = 326,
405-
SyntaxList = 327,
406-
NotEmittedStatement = 328,
407-
PartiallyEmittedExpression = 329,
408-
CommaListExpression = 330,
409-
MergeDeclarationMarker = 331,
410-
EndOfDeclarationMarker = 332,
411-
SyntheticReferenceExpression = 333,
412-
Count = 334,
391+
JSDocDeprecatedTag = 313,
392+
JSDocClassTag = 314,
393+
JSDocPublicTag = 315,
394+
JSDocPrivateTag = 316,
395+
JSDocProtectedTag = 317,
396+
JSDocReadonlyTag = 318,
397+
JSDocCallbackTag = 319,
398+
JSDocEnumTag = 320,
399+
JSDocParameterTag = 321,
400+
JSDocReturnTag = 322,
401+
JSDocThisTag = 323,
402+
JSDocTypeTag = 324,
403+
JSDocTemplateTag = 325,
404+
JSDocTypedefTag = 326,
405+
JSDocPropertyTag = 327,
406+
SyntaxList = 328,
407+
NotEmittedStatement = 329,
408+
PartiallyEmittedExpression = 330,
409+
CommaListExpression = 331,
410+
MergeDeclarationMarker = 332,
411+
EndOfDeclarationMarker = 333,
412+
SyntheticReferenceExpression = 334,
413+
Count = 335,
413414
FirstAssignment = 62,
414415
LastAssignment = 77,
415416
FirstCompoundAssignment = 63,
@@ -438,9 +439,9 @@ declare namespace ts {
438439
LastStatement = 244,
439440
FirstNode = 156,
440441
FirstJSDocNode = 297,
441-
LastJSDocNode = 326,
442+
LastJSDocNode = 327,
442443
FirstJSDocTagNode = 309,
443-
LastJSDocTagNode = 326,
444+
LastJSDocTagNode = 327,
444445
}
445446
export enum NodeFlags {
446447
None = 0,

tests/baselines/reference/logicalAssignment2(target=es2015).js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ c.foo.bar().baz ??= result.foo.bar().baz
3131
//// [logicalAssignment2.js]
3232
"use strict";
3333
var _a, _b;
34-
a.baz && (a.baz = result.baz);
35-
b.baz || (b.baz = result.baz);
36-
(_a = c.baz) !== null && _a !== void 0 ? _a : (c.baz = result.baz);
37-
a.foo["baz"] && (a.foo["baz"] = result.foo.baz);
38-
b.foo["baz"] && (b.foo["baz"] = result.foo.baz);
39-
c.foo["baz"] && (c.foo["baz"] = result.foo.baz);
40-
a.foo.bar().baz && (a.foo.bar().baz = result.foo.bar().baz);
41-
b.foo.bar().baz || (b.foo.bar().baz = result.foo.bar().baz);
42-
(_b = c.foo.bar().baz) !== null && _b !== void 0 ? _b : (c.foo.bar().baz = result.foo.bar().baz);
34+
var _c, _d, _e, _f, _g, _h, _j, _k, _l;
35+
(_c = a).baz && (_c.baz = result.baz);
36+
(_d = b).baz || (_d.baz = result.baz);
37+
(_a = (_e = c).baz) !== null && _a !== void 0 ? _a : (_e.baz = result.baz);
38+
(_f = a.foo)["baz"] && (_f["baz"] = result.foo.baz);
39+
(_g = b.foo)["baz"] && (_g["baz"] = result.foo.baz);
40+
(_h = c.foo)["baz"] && (_h["baz"] = result.foo.baz);
41+
(_j = a.foo.bar()).baz && (_j.baz = result.foo.bar().baz);
42+
(_k = b.foo.bar()).baz || (_k.baz = result.foo.bar().baz);
43+
(_b = (_l = c.foo.bar()).baz) !== null && _b !== void 0 ? _b : (_l.baz = result.foo.bar().baz);

tests/baselines/reference/logicalAssignment2(target=es2020).js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ c.foo.bar().baz ??= result.foo.bar().baz
3030

3131
//// [logicalAssignment2.js]
3232
"use strict";
33-
a.baz && (a.baz = result.baz);
34-
b.baz || (b.baz = result.baz);
35-
c.baz ?? (c.baz = result.baz);
36-
a.foo["baz"] && (a.foo["baz"] = result.foo.baz);
37-
b.foo["baz"] && (b.foo["baz"] = result.foo.baz);
38-
c.foo["baz"] && (c.foo["baz"] = result.foo.baz);
39-
a.foo.bar().baz && (a.foo.bar().baz = result.foo.bar().baz);
40-
b.foo.bar().baz || (b.foo.bar().baz = result.foo.bar().baz);
41-
c.foo.bar().baz ?? (c.foo.bar().baz = result.foo.bar().baz);
33+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
34+
(_a = a).baz && (_a.baz = result.baz);
35+
(_b = b).baz || (_b.baz = result.baz);
36+
(_c = c).baz ?? (_c.baz = result.baz);
37+
(_d = a.foo)["baz"] && (_d["baz"] = result.foo.baz);
38+
(_e = b.foo)["baz"] && (_e["baz"] = result.foo.baz);
39+
(_f = c.foo)["baz"] && (_f["baz"] = result.foo.baz);
40+
(_g = a.foo.bar()).baz && (_g.baz = result.foo.bar().baz);
41+
(_h = b.foo.bar()).baz || (_h.baz = result.foo.bar().baz);
42+
(_j = c.foo.bar()).baz ?? (_j.baz = result.foo.bar().baz);

tests/baselines/reference/logicalAssignment3(target=es2015).js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ declare const c: A;
1717
//// [logicalAssignment3.js]
1818
"use strict";
1919
var _a;
20-
(a.baz) && ((a.baz) = result.baz);
21-
(b.baz) || ((b.baz) = result.baz);
22-
(_a = (c.baz)) !== null && _a !== void 0 ? _a : ((c.baz) = result.baz);
20+
var _b, _c, _d;
21+
(_b = a).baz && (_b.baz = result.baz);
22+
(_c = b).baz || (_c.baz = result.baz);
23+
(_a = (_d = c).baz) !== null && _a !== void 0 ? _a : (_d.baz = result.baz);

tests/baselines/reference/logicalAssignment3(target=es2020).js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ declare const c: A;
1616

1717
//// [logicalAssignment3.js]
1818
"use strict";
19-
(a.baz) && ((a.baz) = result.baz);
20-
(b.baz) || ((b.baz) = result.baz);
21-
(c.baz) ?? ((c.baz) = result.baz);
19+
var _a, _b, _c;
20+
(_a = a).baz && (_a.baz = result.baz);
21+
(_b = b).baz || (_b.baz = result.baz);
22+
(_c = c).baz ?? (_c.baz = result.baz);

tests/baselines/reference/logicalAssignment5(target=es2015).js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ function bar3 (f?: (a: number) => void) {
3333
//// [logicalAssignment5.js]
3434
"use strict";
3535
function foo1(f) {
36-
f !== null && f !== void 0 ? f : (f = (a => a));
36+
f !== null && f !== void 0 ? f : (f = a => a);
3737
f(42);
3838
}
3939
function foo2(f) {
40-
f || (f = (a => a));
40+
f || (f = a => a);
4141
f(42);
4242
}
4343
function foo3(f) {
44-
f && (f = (a => a));
44+
f && (f = a => a);
4545
f(42);
4646
}
4747
function bar1(f) {

tests/baselines/reference/logicalAssignment5(target=es2020).js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,15 @@ function bar3 (f?: (a: number) => void) {
3333
//// [logicalAssignment5.js]
3434
"use strict";
3535
function foo1(f) {
36-
f ?? (f = (a => a));
36+
f ?? (f = a => a);
3737
f(42);
3838
}
3939
function foo2(f) {
40-
f || (f = (a => a));
40+
f || (f = a => a);
4141
f(42);
4242
}
4343
function foo3(f) {
44-
f && (f = (a => a));
44+
f && (f = a => a);
4545
f(42);
4646
}
4747
function bar1(f) {

tests/baselines/reference/logicalAssignment6(target=es2015).js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ function foo3(results: number[] | undefined, results1: number[] | undefined) {
1414
//// [logicalAssignment6.js]
1515
"use strict";
1616
function foo1(results, results1) {
17-
(results || (results = (results1 || (results1 = [])))).push(100);
17+
(results || (results = results1 || (results1 = []))).push(100);
1818
}
1919
function foo2(results, results1) {
20-
(results !== null && results !== void 0 ? results : (results = (results1 !== null && results1 !== void 0 ? results1 : (results1 = [])))).push(100);
20+
(results !== null && results !== void 0 ? results : (results = results1 !== null && results1 !== void 0 ? results1 : (results1 = []))).push(100);
2121
}
2222
function foo3(results, results1) {
23-
(results && (results = (results1 && (results1 = [])))).push(100);
23+
(results && (results = results1 && (results1 = []))).push(100);
2424
}

tests/baselines/reference/logicalAssignment6(target=es2020).js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ function foo3(results: number[] | undefined, results1: number[] | undefined) {
1414
//// [logicalAssignment6.js]
1515
"use strict";
1616
function foo1(results, results1) {
17-
(results || (results = (results1 || (results1 = [])))).push(100);
17+
(results || (results = results1 || (results1 = []))).push(100);
1818
}
1919
function foo2(results, results1) {
20-
(results ?? (results = (results1 ?? (results1 = [])))).push(100);
20+
(results ?? (results = results1 ?? (results1 = []))).push(100);
2121
}
2222
function foo3(results, results1) {
23-
(results && (results = (results1 && (results1 = [])))).push(100);
23+
(results && (results = results1 && (results1 = []))).push(100);
2424
}

0 commit comments

Comments
 (0)