Skip to content

Commit da16b3e

Browse files
committed
Add more case
1 parent 1d93db8 commit da16b3e

31 files changed

+1626
-10
lines changed

src/compiler/transformers/esnext.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
/*@internal*/
22
namespace ts {
33
export function transformESNext(context: TransformationContext) {
4-
const {
5-
hoistVariableDeclaration
6-
} = context;
7-
84
return chainBundle(transformSourceFile);
95

106
function transformSourceFile(node: SourceFile) {
@@ -37,14 +33,9 @@ namespace ts {
3733
const nonAssignmentOperator = getNonAssignmentOperatorForCompoundAssignment(operator.kind);
3834
const left = visitNode(binaryExpression.left, visitor, isExpression);
3935
const right = visitNode(binaryExpression.right, visitor, isExpression);
40-
let cond = left;
41-
if (shouldCaptureInTempVariable(left)) {
42-
const temp = createTempVariable(hoistVariableDeclaration);
43-
cond = createAssignment(temp, left);
44-
}
4536

4637
return createBinary(
47-
cond,
38+
left,
4839
nonAssignmentOperator,
4940
createParen(
5041
createAssignment(
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//// [logicalAssignment2.ts]
2+
interface A {
3+
foo: {
4+
bar(): {
5+
baz: 0 | 1 | 42 | undefined | ''
6+
}
7+
baz: 0 | 1 | 42 | undefined | ''
8+
}
9+
baz: 0 | 1 | 42 | undefined | ''
10+
}
11+
12+
declare const result: A
13+
declare const a: A
14+
declare const b: A
15+
declare const c: A
16+
17+
a.baz &&= result.baz
18+
b.baz ||= result.baz
19+
c.baz ??= result.baz
20+
21+
a.foo["baz"] &&= result.foo.baz
22+
b.foo["baz"] &&= result.foo.baz
23+
c.foo["baz"] &&= result.foo.baz
24+
25+
a.foo.bar().baz &&= result.foo.bar().baz
26+
b.foo.bar().baz ||= result.foo.bar().baz
27+
c.foo.bar().baz ??= result.foo.bar().baz
28+
29+
30+
31+
//// [logicalAssignment2.js]
32+
"use strict";
33+
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);
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
2+
interface A {
3+
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
4+
5+
foo: {
6+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
7+
8+
bar(): {
9+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
10+
11+
baz: 0 | 1 | 42 | undefined | ''
12+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
13+
}
14+
baz: 0 | 1 | 42 | undefined | ''
15+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
16+
}
17+
baz: 0 | 1 | 42 | undefined | ''
18+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
19+
}
20+
21+
declare const result: A
22+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
23+
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
24+
25+
declare const a: A
26+
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
27+
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
28+
29+
declare const b: A
30+
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
31+
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
32+
33+
declare const c: A
34+
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
35+
>A : Symbol(A, Decl(logicalAssignment2.ts, 0, 0))
36+
37+
a.baz &&= result.baz
38+
>a.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
39+
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
40+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
41+
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
42+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
43+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
44+
45+
b.baz ||= result.baz
46+
>b.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
47+
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
48+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
49+
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
50+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
51+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
52+
53+
c.baz ??= result.baz
54+
>c.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
55+
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
56+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
57+
>result.baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
58+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
59+
>baz : Symbol(A.baz, Decl(logicalAssignment2.ts, 6, 5))
60+
61+
a.foo["baz"] &&= result.foo.baz
62+
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
63+
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
64+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
65+
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
66+
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
67+
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
68+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
69+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
70+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
71+
72+
b.foo["baz"] &&= result.foo.baz
73+
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
74+
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
75+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
76+
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
77+
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
78+
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
79+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
80+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
81+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
82+
83+
c.foo["baz"] &&= result.foo.baz
84+
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
85+
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
86+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
87+
>"baz" : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
88+
>result.foo.baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
89+
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
90+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
91+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
92+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 4, 9))
93+
94+
a.foo.bar().baz &&= result.foo.bar().baz
95+
>a.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
96+
>a.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
97+
>a.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
98+
>a : Symbol(a, Decl(logicalAssignment2.ts, 11, 13))
99+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
100+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
101+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
102+
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
103+
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
104+
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
105+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
106+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
107+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
108+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
109+
110+
b.foo.bar().baz ||= result.foo.bar().baz
111+
>b.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
112+
>b.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
113+
>b.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
114+
>b : Symbol(b, Decl(logicalAssignment2.ts, 12, 13))
115+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
116+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
117+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
118+
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
119+
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
120+
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
121+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
122+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
123+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
124+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
125+
126+
c.foo.bar().baz ??= result.foo.bar().baz
127+
>c.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
128+
>c.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
129+
>c.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
130+
>c : Symbol(c, Decl(logicalAssignment2.ts, 13, 13))
131+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
132+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
133+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
134+
>result.foo.bar().baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
135+
>result.foo.bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
136+
>result.foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
137+
>result : Symbol(result, Decl(logicalAssignment2.ts, 10, 13))
138+
>foo : Symbol(A.foo, Decl(logicalAssignment2.ts, 0, 13))
139+
>bar : Symbol(bar, Decl(logicalAssignment2.ts, 1, 10))
140+
>baz : Symbol(baz, Decl(logicalAssignment2.ts, 2, 16))
141+
142+
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
=== tests/cases/conformance/esnext/logicalAssignment/logicalAssignment2.ts ===
2+
interface A {
3+
foo: {
4+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
5+
6+
bar(): {
7+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
8+
9+
baz: 0 | 1 | 42 | undefined | ''
10+
>baz : "" | 0 | 1 | 42 | undefined
11+
}
12+
baz: 0 | 1 | 42 | undefined | ''
13+
>baz : "" | 0 | 1 | 42 | undefined
14+
}
15+
baz: 0 | 1 | 42 | undefined | ''
16+
>baz : "" | 0 | 1 | 42 | undefined
17+
}
18+
19+
declare const result: A
20+
>result : A
21+
22+
declare const a: A
23+
>a : A
24+
25+
declare const b: A
26+
>b : A
27+
28+
declare const c: A
29+
>c : A
30+
31+
a.baz &&= result.baz
32+
>a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined
33+
>a.baz : string | number | undefined
34+
>a : A
35+
>baz : string | number | undefined
36+
>result.baz : "" | 0 | 1 | 42 | undefined
37+
>result : A
38+
>baz : "" | 0 | 1 | 42 | undefined
39+
40+
b.baz ||= result.baz
41+
>b.baz ||= result.baz : string | number | undefined
42+
>b.baz : string | number | undefined
43+
>b : A
44+
>baz : string | number | undefined
45+
>result.baz : "" | 0 | 1 | 42 | undefined
46+
>result : A
47+
>baz : "" | 0 | 1 | 42 | undefined
48+
49+
c.baz ??= result.baz
50+
>c.baz ??= result.baz : string | number | undefined
51+
>c.baz : string | number | undefined
52+
>c : A
53+
>baz : string | number | undefined
54+
>result.baz : "" | 0 | 1 | 42 | undefined
55+
>result : A
56+
>baz : "" | 0 | 1 | 42 | undefined
57+
58+
a.foo["baz"] &&= result.foo.baz
59+
>a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
60+
>a.foo["baz"] : string | number | undefined
61+
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
62+
>a : A
63+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
64+
>"baz" : "baz"
65+
>result.foo.baz : "" | 0 | 1 | 42 | undefined
66+
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
67+
>result : A
68+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
69+
>baz : "" | 0 | 1 | 42 | undefined
70+
71+
b.foo["baz"] &&= result.foo.baz
72+
>b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
73+
>b.foo["baz"] : string | number | undefined
74+
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
75+
>b : A
76+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
77+
>"baz" : "baz"
78+
>result.foo.baz : "" | 0 | 1 | 42 | undefined
79+
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
80+
>result : A
81+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
82+
>baz : "" | 0 | 1 | 42 | undefined
83+
84+
c.foo["baz"] &&= result.foo.baz
85+
>c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined
86+
>c.foo["baz"] : string | number | undefined
87+
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
88+
>c : A
89+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
90+
>"baz" : "baz"
91+
>result.foo.baz : "" | 0 | 1 | 42 | undefined
92+
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
93+
>result : A
94+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
95+
>baz : "" | 0 | 1 | 42 | undefined
96+
97+
a.foo.bar().baz &&= result.foo.bar().baz
98+
>a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
99+
>a.foo.bar().baz : string | number | undefined
100+
>a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
101+
>a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
102+
>a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
103+
>a : A
104+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
105+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
106+
>baz : string | number | undefined
107+
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
108+
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
109+
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
110+
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
111+
>result : A
112+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
113+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
114+
>baz : "" | 0 | 1 | 42 | undefined
115+
116+
b.foo.bar().baz ||= result.foo.bar().baz
117+
>b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined
118+
>b.foo.bar().baz : string | number | undefined
119+
>b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
120+
>b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
121+
>b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
122+
>b : A
123+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
124+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
125+
>baz : string | number | undefined
126+
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
127+
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
128+
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
129+
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
130+
>result : A
131+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
132+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
133+
>baz : "" | 0 | 1 | 42 | undefined
134+
135+
c.foo.bar().baz ??= result.foo.bar().baz
136+
>c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined
137+
>c.foo.bar().baz : string | number | undefined
138+
>c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
139+
>c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
140+
>c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
141+
>c : A
142+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
143+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
144+
>baz : string | number | undefined
145+
>result.foo.bar().baz : "" | 0 | 1 | 42 | undefined
146+
>result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; }
147+
>result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
148+
>result.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
149+
>result : A
150+
>foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; }
151+
>bar : () => { baz: "" | 0 | 1 | 42 | undefined; }
152+
>baz : "" | 0 | 1 | 42 | undefined
153+
154+

0 commit comments

Comments
 (0)