Skip to content

Commit 3a43940

Browse files
authored
Expand intersection reduction division strategy down to 3-member intersections (#59425)
1 parent 1250b48 commit 3a43940

File tree

5 files changed

+667
-2
lines changed

5 files changed

+667
-2
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18188,8 +18188,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1818818188
removeFromEach(typeSet, TypeFlags.Null);
1818918189
result = getUnionType([getIntersectionType(typeSet, flags), nullType], UnionReduction.Literal, aliasSymbol, aliasTypeArguments);
1819018190
}
18191-
else if (typeSet.length >= 4) {
18192-
// When we have four or more constituents, some of which are unions, we employ a "divide and conquer" strategy
18191+
else if (typeSet.length >= 3 && types.length > 2) {
18192+
// When we have three or more constituents, more than two inputs (to head off infinite reexpansion), some of which are unions, we employ a "divide and conquer" strategy
1819318193
// where A & B & C & D is processed as (A & B) & (C & D). Since intersections of unions often produce far smaller
1819418194
// unions of intersections than the full cartesian product (due to some intersections becoming `never`), this can
1819518195
// dramatically reduce the overall work.
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
//// [tests/cases/compiler/pickOfLargeObjectUnionWorks.ts] ////
2+
3+
//// [pickOfLargeObjectUnionWorks.ts]
4+
interface HTMLDataAttributes {
5+
[data: `data-${string}`]: unknown
6+
}
7+
8+
interface Base {
9+
id: string;
10+
prop01: string;
11+
prop02: string;
12+
prop03: string;
13+
prop04: string;
14+
prop05: string;
15+
prop06: string;
16+
prop07: string;
17+
prop08: string;
18+
prop09: string;
19+
prop10: string;
20+
prop11: string;
21+
prop12: string;
22+
prop13: string;
23+
prop14: string;
24+
prop15: string;
25+
prop16: string;
26+
prop17: string;
27+
prop18: string;
28+
prop19: string;
29+
prop20: string;
30+
prop21: string;
31+
prop22: string;
32+
prop23: string;
33+
prop24: string;
34+
prop25: string;
35+
prop26: string;
36+
prop27: string;
37+
prop28: string;
38+
prop29: string;
39+
prop30: string;
40+
prop31: string;
41+
prop32: string;
42+
prop33: string;
43+
prop34: string;
44+
prop35: string;
45+
prop36: string;
46+
prop37: string;
47+
}
48+
49+
interface A extends Base, HTMLDataAttributes {
50+
a1: string;
51+
a2: string;
52+
a3: string;
53+
a4: string;
54+
a5: string;
55+
a6: string;
56+
a7: string;
57+
a8: string;
58+
}
59+
60+
interface B extends Base, HTMLDataAttributes {
61+
b1: string;
62+
b2: string;
63+
b3: string;
64+
b4: string;
65+
b5: string;
66+
b6: string;
67+
b7: string;
68+
b8: string;
69+
}
70+
71+
interface C extends Base, HTMLDataAttributes {
72+
c1: string;
73+
c2: string;
74+
c3: string;
75+
c4: string;
76+
c5: string;
77+
c6: string;
78+
c7: string;
79+
c8: string;
80+
}
81+
82+
const xyz: Pick<A | B | C, 'id'> = {id: 'id'}
83+
84+
//// [pickOfLargeObjectUnionWorks.js]
85+
var xyz = { id: 'id' };
Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
//// [tests/cases/compiler/pickOfLargeObjectUnionWorks.ts] ////
2+
3+
=== pickOfLargeObjectUnionWorks.ts ===
4+
interface HTMLDataAttributes {
5+
>HTMLDataAttributes : Symbol(HTMLDataAttributes, Decl(pickOfLargeObjectUnionWorks.ts, 0, 0))
6+
7+
[data: `data-${string}`]: unknown
8+
>data : Symbol(data, Decl(pickOfLargeObjectUnionWorks.ts, 1, 5))
9+
}
10+
11+
interface Base {
12+
>Base : Symbol(Base, Decl(pickOfLargeObjectUnionWorks.ts, 2, 1))
13+
14+
id: string;
15+
>id : Symbol(Base.id, Decl(pickOfLargeObjectUnionWorks.ts, 4, 16))
16+
17+
prop01: string;
18+
>prop01 : Symbol(Base.prop01, Decl(pickOfLargeObjectUnionWorks.ts, 5, 15))
19+
20+
prop02: string;
21+
>prop02 : Symbol(Base.prop02, Decl(pickOfLargeObjectUnionWorks.ts, 6, 19))
22+
23+
prop03: string;
24+
>prop03 : Symbol(Base.prop03, Decl(pickOfLargeObjectUnionWorks.ts, 7, 19))
25+
26+
prop04: string;
27+
>prop04 : Symbol(Base.prop04, Decl(pickOfLargeObjectUnionWorks.ts, 8, 19))
28+
29+
prop05: string;
30+
>prop05 : Symbol(Base.prop05, Decl(pickOfLargeObjectUnionWorks.ts, 9, 19))
31+
32+
prop06: string;
33+
>prop06 : Symbol(Base.prop06, Decl(pickOfLargeObjectUnionWorks.ts, 10, 19))
34+
35+
prop07: string;
36+
>prop07 : Symbol(Base.prop07, Decl(pickOfLargeObjectUnionWorks.ts, 11, 19))
37+
38+
prop08: string;
39+
>prop08 : Symbol(Base.prop08, Decl(pickOfLargeObjectUnionWorks.ts, 12, 19))
40+
41+
prop09: string;
42+
>prop09 : Symbol(Base.prop09, Decl(pickOfLargeObjectUnionWorks.ts, 13, 19))
43+
44+
prop10: string;
45+
>prop10 : Symbol(Base.prop10, Decl(pickOfLargeObjectUnionWorks.ts, 14, 19))
46+
47+
prop11: string;
48+
>prop11 : Symbol(Base.prop11, Decl(pickOfLargeObjectUnionWorks.ts, 15, 19))
49+
50+
prop12: string;
51+
>prop12 : Symbol(Base.prop12, Decl(pickOfLargeObjectUnionWorks.ts, 16, 19))
52+
53+
prop13: string;
54+
>prop13 : Symbol(Base.prop13, Decl(pickOfLargeObjectUnionWorks.ts, 17, 19))
55+
56+
prop14: string;
57+
>prop14 : Symbol(Base.prop14, Decl(pickOfLargeObjectUnionWorks.ts, 18, 19))
58+
59+
prop15: string;
60+
>prop15 : Symbol(Base.prop15, Decl(pickOfLargeObjectUnionWorks.ts, 19, 19))
61+
62+
prop16: string;
63+
>prop16 : Symbol(Base.prop16, Decl(pickOfLargeObjectUnionWorks.ts, 20, 19))
64+
65+
prop17: string;
66+
>prop17 : Symbol(Base.prop17, Decl(pickOfLargeObjectUnionWorks.ts, 21, 19))
67+
68+
prop18: string;
69+
>prop18 : Symbol(Base.prop18, Decl(pickOfLargeObjectUnionWorks.ts, 22, 19))
70+
71+
prop19: string;
72+
>prop19 : Symbol(Base.prop19, Decl(pickOfLargeObjectUnionWorks.ts, 23, 19))
73+
74+
prop20: string;
75+
>prop20 : Symbol(Base.prop20, Decl(pickOfLargeObjectUnionWorks.ts, 24, 19))
76+
77+
prop21: string;
78+
>prop21 : Symbol(Base.prop21, Decl(pickOfLargeObjectUnionWorks.ts, 25, 19))
79+
80+
prop22: string;
81+
>prop22 : Symbol(Base.prop22, Decl(pickOfLargeObjectUnionWorks.ts, 26, 19))
82+
83+
prop23: string;
84+
>prop23 : Symbol(Base.prop23, Decl(pickOfLargeObjectUnionWorks.ts, 27, 19))
85+
86+
prop24: string;
87+
>prop24 : Symbol(Base.prop24, Decl(pickOfLargeObjectUnionWorks.ts, 28, 19))
88+
89+
prop25: string;
90+
>prop25 : Symbol(Base.prop25, Decl(pickOfLargeObjectUnionWorks.ts, 29, 19))
91+
92+
prop26: string;
93+
>prop26 : Symbol(Base.prop26, Decl(pickOfLargeObjectUnionWorks.ts, 30, 19))
94+
95+
prop27: string;
96+
>prop27 : Symbol(Base.prop27, Decl(pickOfLargeObjectUnionWorks.ts, 31, 19))
97+
98+
prop28: string;
99+
>prop28 : Symbol(Base.prop28, Decl(pickOfLargeObjectUnionWorks.ts, 32, 19))
100+
101+
prop29: string;
102+
>prop29 : Symbol(Base.prop29, Decl(pickOfLargeObjectUnionWorks.ts, 33, 19))
103+
104+
prop30: string;
105+
>prop30 : Symbol(Base.prop30, Decl(pickOfLargeObjectUnionWorks.ts, 34, 19))
106+
107+
prop31: string;
108+
>prop31 : Symbol(Base.prop31, Decl(pickOfLargeObjectUnionWorks.ts, 35, 19))
109+
110+
prop32: string;
111+
>prop32 : Symbol(Base.prop32, Decl(pickOfLargeObjectUnionWorks.ts, 36, 19))
112+
113+
prop33: string;
114+
>prop33 : Symbol(Base.prop33, Decl(pickOfLargeObjectUnionWorks.ts, 37, 19))
115+
116+
prop34: string;
117+
>prop34 : Symbol(Base.prop34, Decl(pickOfLargeObjectUnionWorks.ts, 38, 19))
118+
119+
prop35: string;
120+
>prop35 : Symbol(Base.prop35, Decl(pickOfLargeObjectUnionWorks.ts, 39, 19))
121+
122+
prop36: string;
123+
>prop36 : Symbol(Base.prop36, Decl(pickOfLargeObjectUnionWorks.ts, 40, 19))
124+
125+
prop37: string;
126+
>prop37 : Symbol(Base.prop37, Decl(pickOfLargeObjectUnionWorks.ts, 41, 19))
127+
}
128+
129+
interface A extends Base, HTMLDataAttributes {
130+
>A : Symbol(A, Decl(pickOfLargeObjectUnionWorks.ts, 43, 3))
131+
>Base : Symbol(Base, Decl(pickOfLargeObjectUnionWorks.ts, 2, 1))
132+
>HTMLDataAttributes : Symbol(HTMLDataAttributes, Decl(pickOfLargeObjectUnionWorks.ts, 0, 0))
133+
134+
a1: string;
135+
>a1 : Symbol(A.a1, Decl(pickOfLargeObjectUnionWorks.ts, 45, 48))
136+
137+
a2: string;
138+
>a2 : Symbol(A.a2, Decl(pickOfLargeObjectUnionWorks.ts, 46, 15))
139+
140+
a3: string;
141+
>a3 : Symbol(A.a3, Decl(pickOfLargeObjectUnionWorks.ts, 47, 15))
142+
143+
a4: string;
144+
>a4 : Symbol(A.a4, Decl(pickOfLargeObjectUnionWorks.ts, 48, 15))
145+
146+
a5: string;
147+
>a5 : Symbol(A.a5, Decl(pickOfLargeObjectUnionWorks.ts, 49, 15))
148+
149+
a6: string;
150+
>a6 : Symbol(A.a6, Decl(pickOfLargeObjectUnionWorks.ts, 50, 15))
151+
152+
a7: string;
153+
>a7 : Symbol(A.a7, Decl(pickOfLargeObjectUnionWorks.ts, 51, 15))
154+
155+
a8: string;
156+
>a8 : Symbol(A.a8, Decl(pickOfLargeObjectUnionWorks.ts, 52, 15))
157+
}
158+
159+
interface B extends Base, HTMLDataAttributes {
160+
>B : Symbol(B, Decl(pickOfLargeObjectUnionWorks.ts, 54, 3))
161+
>Base : Symbol(Base, Decl(pickOfLargeObjectUnionWorks.ts, 2, 1))
162+
>HTMLDataAttributes : Symbol(HTMLDataAttributes, Decl(pickOfLargeObjectUnionWorks.ts, 0, 0))
163+
164+
b1: string;
165+
>b1 : Symbol(B.b1, Decl(pickOfLargeObjectUnionWorks.ts, 56, 48))
166+
167+
b2: string;
168+
>b2 : Symbol(B.b2, Decl(pickOfLargeObjectUnionWorks.ts, 57, 15))
169+
170+
b3: string;
171+
>b3 : Symbol(B.b3, Decl(pickOfLargeObjectUnionWorks.ts, 58, 15))
172+
173+
b4: string;
174+
>b4 : Symbol(B.b4, Decl(pickOfLargeObjectUnionWorks.ts, 59, 15))
175+
176+
b5: string;
177+
>b5 : Symbol(B.b5, Decl(pickOfLargeObjectUnionWorks.ts, 60, 15))
178+
179+
b6: string;
180+
>b6 : Symbol(B.b6, Decl(pickOfLargeObjectUnionWorks.ts, 61, 15))
181+
182+
b7: string;
183+
>b7 : Symbol(B.b7, Decl(pickOfLargeObjectUnionWorks.ts, 62, 15))
184+
185+
b8: string;
186+
>b8 : Symbol(B.b8, Decl(pickOfLargeObjectUnionWorks.ts, 63, 15))
187+
}
188+
189+
interface C extends Base, HTMLDataAttributes {
190+
>C : Symbol(C, Decl(pickOfLargeObjectUnionWorks.ts, 65, 3))
191+
>Base : Symbol(Base, Decl(pickOfLargeObjectUnionWorks.ts, 2, 1))
192+
>HTMLDataAttributes : Symbol(HTMLDataAttributes, Decl(pickOfLargeObjectUnionWorks.ts, 0, 0))
193+
194+
c1: string;
195+
>c1 : Symbol(C.c1, Decl(pickOfLargeObjectUnionWorks.ts, 67, 48))
196+
197+
c2: string;
198+
>c2 : Symbol(C.c2, Decl(pickOfLargeObjectUnionWorks.ts, 68, 15))
199+
200+
c3: string;
201+
>c3 : Symbol(C.c3, Decl(pickOfLargeObjectUnionWorks.ts, 69, 15))
202+
203+
c4: string;
204+
>c4 : Symbol(C.c4, Decl(pickOfLargeObjectUnionWorks.ts, 70, 15))
205+
206+
c5: string;
207+
>c5 : Symbol(C.c5, Decl(pickOfLargeObjectUnionWorks.ts, 71, 15))
208+
209+
c6: string;
210+
>c6 : Symbol(C.c6, Decl(pickOfLargeObjectUnionWorks.ts, 72, 15))
211+
212+
c7: string;
213+
>c7 : Symbol(C.c7, Decl(pickOfLargeObjectUnionWorks.ts, 73, 15))
214+
215+
c8: string;
216+
>c8 : Symbol(C.c8, Decl(pickOfLargeObjectUnionWorks.ts, 74, 15))
217+
}
218+
219+
const xyz: Pick<A | B | C, 'id'> = {id: 'id'}
220+
>xyz : Symbol(xyz, Decl(pickOfLargeObjectUnionWorks.ts, 78, 7))
221+
>Pick : Symbol(Pick, Decl(lib.es5.d.ts, --, --))
222+
>A : Symbol(A, Decl(pickOfLargeObjectUnionWorks.ts, 43, 3))
223+
>B : Symbol(B, Decl(pickOfLargeObjectUnionWorks.ts, 54, 3))
224+
>C : Symbol(C, Decl(pickOfLargeObjectUnionWorks.ts, 65, 3))
225+
>id : Symbol(id, Decl(pickOfLargeObjectUnionWorks.ts, 78, 38))
226+

0 commit comments

Comments
 (0)