Skip to content

Commit bf7f2e2

Browse files
committed
Add tests
1 parent 6a0f729 commit bf7f2e2

File tree

4 files changed

+627
-0
lines changed

4 files changed

+627
-0
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
//// [intersectionTypeNormalization.ts]
2+
interface A { a: string }
3+
interface B { b: string }
4+
interface C { c: string }
5+
interface D { d: string }
6+
7+
// Identical ways of writing the same type
8+
type X1 = (A | B) & (C | D);
9+
type X2 = A & (C | D) | B & (C | D)
10+
type X3 = A & C | A & D | B & C | B & D;
11+
12+
var x: X1;
13+
var x: X2;
14+
var x: X3;
15+
16+
interface X { x: string }
17+
interface Y { y: string }
18+
19+
// Identical ways of writing the same type
20+
type Y1 = (A | X & Y) & (C | D);
21+
type Y2 = A & (C | D) | X & Y & (C | D)
22+
type Y3 = A & C | A & D | X & Y & C | X & Y & D;
23+
24+
var y: Y1;
25+
var y: Y2;
26+
var y: Y3;
27+
28+
interface M { m: string }
29+
interface N { n: string }
30+
31+
// Identical ways of writing the same type
32+
type Z1 = (A | X & (M | N)) & (C | D);
33+
type Z2 = A & (C | D) | X & (M | N) & (C | D)
34+
type Z3 = A & C | A & D | X & (M | N) & C | X & (M | N) & D;
35+
type Z4 = A & C | A & D | X & M & C | X & N & C | X & M & D | X & N & D;
36+
37+
var z: Z1;
38+
var z: Z2;
39+
var z: Z3;
40+
var z: Z4;
41+
42+
// Repro from #9919
43+
44+
type ToString = {
45+
toString(): string;
46+
}
47+
48+
type BoxedValue = { kind: 'int', num: number }
49+
| { kind: 'string', str: string }
50+
51+
type IntersectionFail = BoxedValue & ToString
52+
53+
type IntersectionInline = { kind: 'int', num: number } & ToString
54+
| { kind: 'string', str: string } & ToString
55+
56+
function getValueAsString(value: IntersectionFail): string {
57+
if (value.kind === 'int') {
58+
return '' + value.num;
59+
}
60+
return value.str;
61+
}
62+
63+
//// [intersectionTypeNormalization.js]
64+
var x;
65+
var x;
66+
var x;
67+
var y;
68+
var y;
69+
var y;
70+
var z;
71+
var z;
72+
var z;
73+
var z;
74+
function getValueAsString(value) {
75+
if (value.kind === 'int') {
76+
return '' + value.num;
77+
}
78+
return value.str;
79+
}
Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
=== tests/cases/compiler/intersectionTypeNormalization.ts ===
2+
interface A { a: string }
3+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
4+
>a : Symbol(A.a, Decl(intersectionTypeNormalization.ts, 0, 13))
5+
6+
interface B { b: string }
7+
>B : Symbol(B, Decl(intersectionTypeNormalization.ts, 0, 25))
8+
>b : Symbol(B.b, Decl(intersectionTypeNormalization.ts, 1, 13))
9+
10+
interface C { c: string }
11+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
12+
>c : Symbol(C.c, Decl(intersectionTypeNormalization.ts, 2, 13))
13+
14+
interface D { d: string }
15+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
16+
>d : Symbol(D.d, Decl(intersectionTypeNormalization.ts, 3, 13))
17+
18+
// Identical ways of writing the same type
19+
type X1 = (A | B) & (C | D);
20+
>X1 : Symbol(X1, Decl(intersectionTypeNormalization.ts, 3, 25))
21+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
22+
>B : Symbol(B, Decl(intersectionTypeNormalization.ts, 0, 25))
23+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
24+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
25+
26+
type X2 = A & (C | D) | B & (C | D)
27+
>X2 : Symbol(X2, Decl(intersectionTypeNormalization.ts, 6, 28))
28+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
29+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
30+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
31+
>B : Symbol(B, Decl(intersectionTypeNormalization.ts, 0, 25))
32+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
33+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
34+
35+
type X3 = A & C | A & D | B & C | B & D;
36+
>X3 : Symbol(X3, Decl(intersectionTypeNormalization.ts, 7, 35))
37+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
38+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
39+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
40+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
41+
>B : Symbol(B, Decl(intersectionTypeNormalization.ts, 0, 25))
42+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
43+
>B : Symbol(B, Decl(intersectionTypeNormalization.ts, 0, 25))
44+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
45+
46+
var x: X1;
47+
>x : Symbol(x, Decl(intersectionTypeNormalization.ts, 10, 3), Decl(intersectionTypeNormalization.ts, 11, 3), Decl(intersectionTypeNormalization.ts, 12, 3))
48+
>X1 : Symbol(X1, Decl(intersectionTypeNormalization.ts, 3, 25))
49+
50+
var x: X2;
51+
>x : Symbol(x, Decl(intersectionTypeNormalization.ts, 10, 3), Decl(intersectionTypeNormalization.ts, 11, 3), Decl(intersectionTypeNormalization.ts, 12, 3))
52+
>X2 : Symbol(X2, Decl(intersectionTypeNormalization.ts, 6, 28))
53+
54+
var x: X3;
55+
>x : Symbol(x, Decl(intersectionTypeNormalization.ts, 10, 3), Decl(intersectionTypeNormalization.ts, 11, 3), Decl(intersectionTypeNormalization.ts, 12, 3))
56+
>X3 : Symbol(X3, Decl(intersectionTypeNormalization.ts, 7, 35))
57+
58+
interface X { x: string }
59+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
60+
>x : Symbol(X.x, Decl(intersectionTypeNormalization.ts, 14, 13))
61+
62+
interface Y { y: string }
63+
>Y : Symbol(Y, Decl(intersectionTypeNormalization.ts, 14, 25))
64+
>y : Symbol(Y.y, Decl(intersectionTypeNormalization.ts, 15, 13))
65+
66+
// Identical ways of writing the same type
67+
type Y1 = (A | X & Y) & (C | D);
68+
>Y1 : Symbol(Y1, Decl(intersectionTypeNormalization.ts, 15, 25))
69+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
70+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
71+
>Y : Symbol(Y, Decl(intersectionTypeNormalization.ts, 14, 25))
72+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
73+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
74+
75+
type Y2 = A & (C | D) | X & Y & (C | D)
76+
>Y2 : Symbol(Y2, Decl(intersectionTypeNormalization.ts, 18, 32))
77+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
78+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
79+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
80+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
81+
>Y : Symbol(Y, Decl(intersectionTypeNormalization.ts, 14, 25))
82+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
83+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
84+
85+
type Y3 = A & C | A & D | X & Y & C | X & Y & D;
86+
>Y3 : Symbol(Y3, Decl(intersectionTypeNormalization.ts, 19, 39))
87+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
88+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
89+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
90+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
91+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
92+
>Y : Symbol(Y, Decl(intersectionTypeNormalization.ts, 14, 25))
93+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
94+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
95+
>Y : Symbol(Y, Decl(intersectionTypeNormalization.ts, 14, 25))
96+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
97+
98+
var y: Y1;
99+
>y : Symbol(y, Decl(intersectionTypeNormalization.ts, 22, 3), Decl(intersectionTypeNormalization.ts, 23, 3), Decl(intersectionTypeNormalization.ts, 24, 3))
100+
>Y1 : Symbol(Y1, Decl(intersectionTypeNormalization.ts, 15, 25))
101+
102+
var y: Y2;
103+
>y : Symbol(y, Decl(intersectionTypeNormalization.ts, 22, 3), Decl(intersectionTypeNormalization.ts, 23, 3), Decl(intersectionTypeNormalization.ts, 24, 3))
104+
>Y2 : Symbol(Y2, Decl(intersectionTypeNormalization.ts, 18, 32))
105+
106+
var y: Y3;
107+
>y : Symbol(y, Decl(intersectionTypeNormalization.ts, 22, 3), Decl(intersectionTypeNormalization.ts, 23, 3), Decl(intersectionTypeNormalization.ts, 24, 3))
108+
>Y3 : Symbol(Y3, Decl(intersectionTypeNormalization.ts, 19, 39))
109+
110+
interface M { m: string }
111+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
112+
>m : Symbol(M.m, Decl(intersectionTypeNormalization.ts, 26, 13))
113+
114+
interface N { n: string }
115+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
116+
>n : Symbol(N.n, Decl(intersectionTypeNormalization.ts, 27, 13))
117+
118+
// Identical ways of writing the same type
119+
type Z1 = (A | X & (M | N)) & (C | D);
120+
>Z1 : Symbol(Z1, Decl(intersectionTypeNormalization.ts, 27, 25))
121+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
122+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
123+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
124+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
125+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
126+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
127+
128+
type Z2 = A & (C | D) | X & (M | N) & (C | D)
129+
>Z2 : Symbol(Z2, Decl(intersectionTypeNormalization.ts, 30, 38))
130+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
131+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
132+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
133+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
134+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
135+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
136+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
137+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
138+
139+
type Z3 = A & C | A & D | X & (M | N) & C | X & (M | N) & D;
140+
>Z3 : Symbol(Z3, Decl(intersectionTypeNormalization.ts, 31, 45))
141+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
142+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
143+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
144+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
145+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
146+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
147+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
148+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
149+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
150+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
151+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
152+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
153+
154+
type Z4 = A & C | A & D | X & M & C | X & N & C | X & M & D | X & N & D;
155+
>Z4 : Symbol(Z4, Decl(intersectionTypeNormalization.ts, 32, 60))
156+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
157+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
158+
>A : Symbol(A, Decl(intersectionTypeNormalization.ts, 0, 0))
159+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
160+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
161+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
162+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
163+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
164+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
165+
>C : Symbol(C, Decl(intersectionTypeNormalization.ts, 1, 25))
166+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
167+
>M : Symbol(M, Decl(intersectionTypeNormalization.ts, 24, 10))
168+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
169+
>X : Symbol(X, Decl(intersectionTypeNormalization.ts, 12, 10))
170+
>N : Symbol(N, Decl(intersectionTypeNormalization.ts, 26, 25))
171+
>D : Symbol(D, Decl(intersectionTypeNormalization.ts, 2, 25))
172+
173+
var z: Z1;
174+
>z : Symbol(z, Decl(intersectionTypeNormalization.ts, 35, 3), Decl(intersectionTypeNormalization.ts, 36, 3), Decl(intersectionTypeNormalization.ts, 37, 3), Decl(intersectionTypeNormalization.ts, 38, 3))
175+
>Z1 : Symbol(Z1, Decl(intersectionTypeNormalization.ts, 27, 25))
176+
177+
var z: Z2;
178+
>z : Symbol(z, Decl(intersectionTypeNormalization.ts, 35, 3), Decl(intersectionTypeNormalization.ts, 36, 3), Decl(intersectionTypeNormalization.ts, 37, 3), Decl(intersectionTypeNormalization.ts, 38, 3))
179+
>Z2 : Symbol(Z2, Decl(intersectionTypeNormalization.ts, 30, 38))
180+
181+
var z: Z3;
182+
>z : Symbol(z, Decl(intersectionTypeNormalization.ts, 35, 3), Decl(intersectionTypeNormalization.ts, 36, 3), Decl(intersectionTypeNormalization.ts, 37, 3), Decl(intersectionTypeNormalization.ts, 38, 3))
183+
>Z3 : Symbol(Z3, Decl(intersectionTypeNormalization.ts, 31, 45))
184+
185+
var z: Z4;
186+
>z : Symbol(z, Decl(intersectionTypeNormalization.ts, 35, 3), Decl(intersectionTypeNormalization.ts, 36, 3), Decl(intersectionTypeNormalization.ts, 37, 3), Decl(intersectionTypeNormalization.ts, 38, 3))
187+
>Z4 : Symbol(Z4, Decl(intersectionTypeNormalization.ts, 32, 60))
188+
189+
// Repro from #9919
190+
191+
type ToString = {
192+
>ToString : Symbol(ToString, Decl(intersectionTypeNormalization.ts, 38, 10))
193+
194+
toString(): string;
195+
>toString : Symbol(toString, Decl(intersectionTypeNormalization.ts, 42, 17))
196+
}
197+
198+
type BoxedValue = { kind: 'int', num: number }
199+
>BoxedValue : Symbol(BoxedValue, Decl(intersectionTypeNormalization.ts, 44, 1))
200+
>kind : Symbol(kind, Decl(intersectionTypeNormalization.ts, 46, 19))
201+
>num : Symbol(num, Decl(intersectionTypeNormalization.ts, 46, 32))
202+
203+
| { kind: 'string', str: string }
204+
>kind : Symbol(kind, Decl(intersectionTypeNormalization.ts, 47, 19))
205+
>str : Symbol(str, Decl(intersectionTypeNormalization.ts, 47, 35))
206+
207+
type IntersectionFail = BoxedValue & ToString
208+
>IntersectionFail : Symbol(IntersectionFail, Decl(intersectionTypeNormalization.ts, 47, 49))
209+
>BoxedValue : Symbol(BoxedValue, Decl(intersectionTypeNormalization.ts, 44, 1))
210+
>ToString : Symbol(ToString, Decl(intersectionTypeNormalization.ts, 38, 10))
211+
212+
type IntersectionInline = { kind: 'int', num: number } & ToString
213+
>IntersectionInline : Symbol(IntersectionInline, Decl(intersectionTypeNormalization.ts, 49, 45))
214+
>kind : Symbol(kind, Decl(intersectionTypeNormalization.ts, 51, 27))
215+
>num : Symbol(num, Decl(intersectionTypeNormalization.ts, 51, 40))
216+
>ToString : Symbol(ToString, Decl(intersectionTypeNormalization.ts, 38, 10))
217+
218+
| { kind: 'string', str: string } & ToString
219+
>kind : Symbol(kind, Decl(intersectionTypeNormalization.ts, 52, 27))
220+
>str : Symbol(str, Decl(intersectionTypeNormalization.ts, 52, 43))
221+
>ToString : Symbol(ToString, Decl(intersectionTypeNormalization.ts, 38, 10))
222+
223+
function getValueAsString(value: IntersectionFail): string {
224+
>getValueAsString : Symbol(getValueAsString, Decl(intersectionTypeNormalization.ts, 52, 68))
225+
>value : Symbol(value, Decl(intersectionTypeNormalization.ts, 54, 26))
226+
>IntersectionFail : Symbol(IntersectionFail, Decl(intersectionTypeNormalization.ts, 47, 49))
227+
228+
if (value.kind === 'int') {
229+
>value.kind : Symbol(kind, Decl(intersectionTypeNormalization.ts, 46, 19), Decl(intersectionTypeNormalization.ts, 47, 19))
230+
>value : Symbol(value, Decl(intersectionTypeNormalization.ts, 54, 26))
231+
>kind : Symbol(kind, Decl(intersectionTypeNormalization.ts, 46, 19), Decl(intersectionTypeNormalization.ts, 47, 19))
232+
233+
return '' + value.num;
234+
>value.num : Symbol(num, Decl(intersectionTypeNormalization.ts, 46, 32))
235+
>value : Symbol(value, Decl(intersectionTypeNormalization.ts, 54, 26))
236+
>num : Symbol(num, Decl(intersectionTypeNormalization.ts, 46, 32))
237+
}
238+
return value.str;
239+
>value.str : Symbol(str, Decl(intersectionTypeNormalization.ts, 47, 35))
240+
>value : Symbol(value, Decl(intersectionTypeNormalization.ts, 54, 26))
241+
>str : Symbol(str, Decl(intersectionTypeNormalization.ts, 47, 35))
242+
}

0 commit comments

Comments
 (0)