Skip to content

Commit 2b7e790

Browse files
committed
Update control flow for nested binary exprs
1 parent 8a15291 commit 2b7e790

File tree

4 files changed

+504
-33
lines changed

4 files changed

+504
-33
lines changed

src/compiler/binder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1608,7 +1608,7 @@ namespace ts {
16081608
* If `node` is a BinaryExpression, adds it to the local work stack, otherwise recursively binds it
16091609
*/
16101610
function maybeBind(node: Node) {
1611-
if (node && isBinaryExpression(node)) {
1611+
if (node && isBinaryExpression(node) && !isDestructuringAssignment(node)) {
16121612
stackIndex++;
16131613
workStacks.expr[stackIndex] = node;
16141614
workStacks.state[stackIndex] = BindBinaryExpressionFlowState.BindThenBindChildren;
Lines changed: 180 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,218 @@
11
=== tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts ===
22
// https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363
3+
declare function f(): void;
4+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
35
{
46
let a: 0 | 1 = 0;
5-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7))
7+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
68

79
let b: 0 | 1 | 9;
8-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
10+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7))
911

1012
[{ [(a = 1)]: b } = [9, a] as const] = [];
11-
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 4, 6))
12-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7))
13-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
14-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7))
13+
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 5, 6))
14+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
15+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7))
16+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
1517

1618
const bb: 0 = b;
17-
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 5, 9))
18-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
19+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 6, 9))
20+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7))
1921
}
2022
{
2123
let a: 0 | 1 = 1;
22-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7))
24+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
2325

2426
let b: 0 | 1 | 9;
25-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
27+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7))
2628

2729
[{ [a]: b } = [9, a = 0] as const] = [];
28-
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 10, 6))
29-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7))
30-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
31-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7))
30+
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 11, 6))
31+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
32+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7))
33+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
3234

3335
const bb: 9 = b;
34-
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 11, 9))
35-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
36+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 12, 9))
37+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7))
3638
}
3739
{
3840
let a: 0 | 1 = 0;
39-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7))
41+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
4042

4143
let b: 0 | 1 | 8 | 9;
42-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
44+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7))
4345

4446
[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const];
45-
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 16, 6))
46-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7))
47-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
48-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7))
47+
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 17, 6))
48+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
49+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7))
50+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
4951

5052
const bb: 0 | 8 = b;
51-
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 17, 9))
52-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
53+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 18, 9))
54+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7))
5355
}
5456
{
5557
let a: 0 | 1 = 1;
56-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7))
58+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
5759

5860
let b: 0 | 1 | 8 | 9;
59-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
61+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7))
6062

6163
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
62-
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 22, 6))
63-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7))
64-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
65-
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7))
64+
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 23, 6))
65+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
66+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7))
67+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
6668

6769
const bb: 0 | 8 = b;
68-
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 23, 9))
69-
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
70+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 24, 9))
71+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7))
72+
}
73+
// same as above but on left of a binary expression
74+
{
75+
let a: 0 | 1 = 0;
76+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7))
77+
78+
let b: 0 | 1 | 9;
79+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7))
80+
81+
[{ [(a = 1)]: b } = [9, a] as const] = [], f();
82+
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 30, 6))
83+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7))
84+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7))
85+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7))
86+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
87+
88+
const bb: 0 = b;
89+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 31, 9))
90+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7))
91+
}
92+
{
93+
let a: 0 | 1 = 1;
94+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7))
95+
96+
let b: 0 | 1 | 9;
97+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7))
98+
99+
[{ [a]: b } = [9, a = 0] as const] = [], f();
100+
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 36, 6))
101+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7))
102+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7))
103+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7))
104+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
105+
106+
const bb: 9 = b;
107+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 37, 9))
108+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7))
109+
}
110+
{
111+
let a: 0 | 1 = 0;
112+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7))
113+
114+
let b: 0 | 1 | 8 | 9;
115+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7))
116+
117+
[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f();
118+
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 42, 6))
119+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7))
120+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7))
121+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7))
122+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
123+
124+
const bb: 0 | 8 = b;
125+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 43, 9))
126+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7))
127+
}
128+
{
129+
let a: 0 | 1 = 1;
130+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7))
131+
132+
let b: 0 | 1 | 8 | 9;
133+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7))
134+
135+
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f();
136+
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 48, 6))
137+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7))
138+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7))
139+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7))
140+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
141+
142+
const bb: 0 | 8 = b;
143+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 49, 9))
144+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7))
145+
}
146+
// same as above but on right of a binary expression
147+
{
148+
let a: 0 | 1 = 0;
149+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7))
150+
151+
let b: 0 | 1 | 9;
152+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7))
153+
154+
f(), [{ [(a = 1)]: b } = [9, a] as const] = [];
155+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
156+
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 55, 11))
157+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7))
158+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7))
159+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7))
160+
161+
const bb: 0 = b;
162+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 56, 9))
163+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7))
164+
}
165+
{
166+
let a: 0 | 1 = 1;
167+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7))
168+
169+
let b: 0 | 1 | 9;
170+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7))
171+
172+
f(), [{ [a]: b } = [9, a = 0] as const] = [];
173+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
174+
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 61, 11))
175+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7))
176+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7))
177+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7))
178+
179+
const bb: 9 = b;
180+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 62, 9))
181+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7))
182+
}
183+
{
184+
let a: 0 | 1 = 0;
185+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7))
186+
187+
let b: 0 | 1 | 8 | 9;
188+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7))
189+
190+
f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const];
191+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
192+
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 67, 11))
193+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7))
194+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7))
195+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7))
196+
197+
const bb: 0 | 8 = b;
198+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 68, 9))
199+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7))
200+
}
201+
{
202+
let a: 0 | 1 = 1;
203+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7))
204+
205+
let b: 0 | 1 | 8 | 9;
206+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7))
207+
208+
f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
209+
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
210+
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 73, 11))
211+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7))
212+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7))
213+
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7))
214+
215+
const bb: 0 | 8 = b;
216+
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 74, 9))
217+
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7))
70218
}

0 commit comments

Comments
 (0)