Skip to content

Commit ad6d086

Browse files
Add case to capture enum subtype reduction
* Add case to capture enum subtype reduction Signed-off-by: Lawrence Craft <[email protected]>
1 parent 020ef41 commit ad6d086

File tree

4 files changed

+361
-0
lines changed

4 files changed

+361
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//// [enumMemberReduction.ts]
2+
enum MyEnum {
3+
A,
4+
B,
5+
C,
6+
}
7+
8+
enum MyStringEnum {
9+
A = "a",
10+
B = "b",
11+
C = "c",
12+
}
13+
14+
enum MyStringEnumWithEmpty {
15+
A = "",
16+
B = "b",
17+
C = "c",
18+
}
19+
20+
export function fn(optionalEnum: MyEnum | undefined) {
21+
return optionalEnum ?? MyEnum.A;
22+
}
23+
24+
export function fn2(optionalEnum: MyEnum | undefined) {
25+
return optionalEnum || MyEnum.B;
26+
}
27+
28+
export function fn3(optionalEnum?: MyEnum) {
29+
return optionalEnum ?? MyEnum.A;
30+
}
31+
32+
export function fn4(optionalEnum?: MyEnum) {
33+
return optionalEnum || MyEnum.B;
34+
}
35+
36+
export function fn5(optionalEnum?: MyStringEnum) {
37+
return optionalEnum || MyStringEnum.B;
38+
}
39+
40+
export function fn6(optionalEnum?: MyStringEnumWithEmpty) {
41+
return optionalEnum || MyStringEnumWithEmpty.B;
42+
}
43+
44+
45+
//// [enumMemberReduction.js]
46+
"use strict";
47+
exports.__esModule = true;
48+
exports.fn6 = exports.fn5 = exports.fn4 = exports.fn3 = exports.fn2 = exports.fn = void 0;
49+
var MyEnum;
50+
(function (MyEnum) {
51+
MyEnum[MyEnum["A"] = 0] = "A";
52+
MyEnum[MyEnum["B"] = 1] = "B";
53+
MyEnum[MyEnum["C"] = 2] = "C";
54+
})(MyEnum || (MyEnum = {}));
55+
var MyStringEnum;
56+
(function (MyStringEnum) {
57+
MyStringEnum["A"] = "a";
58+
MyStringEnum["B"] = "b";
59+
MyStringEnum["C"] = "c";
60+
})(MyStringEnum || (MyStringEnum = {}));
61+
var MyStringEnumWithEmpty;
62+
(function (MyStringEnumWithEmpty) {
63+
MyStringEnumWithEmpty["A"] = "";
64+
MyStringEnumWithEmpty["B"] = "b";
65+
MyStringEnumWithEmpty["C"] = "c";
66+
})(MyStringEnumWithEmpty || (MyStringEnumWithEmpty = {}));
67+
function fn(optionalEnum) {
68+
return optionalEnum !== null && optionalEnum !== void 0 ? optionalEnum : MyEnum.A;
69+
}
70+
exports.fn = fn;
71+
function fn2(optionalEnum) {
72+
return optionalEnum || MyEnum.B;
73+
}
74+
exports.fn2 = fn2;
75+
function fn3(optionalEnum) {
76+
return optionalEnum !== null && optionalEnum !== void 0 ? optionalEnum : MyEnum.A;
77+
}
78+
exports.fn3 = fn3;
79+
function fn4(optionalEnum) {
80+
return optionalEnum || MyEnum.B;
81+
}
82+
exports.fn4 = fn4;
83+
function fn5(optionalEnum) {
84+
return optionalEnum || MyStringEnum.B;
85+
}
86+
exports.fn5 = fn5;
87+
function fn6(optionalEnum) {
88+
return optionalEnum || MyStringEnumWithEmpty.B;
89+
}
90+
exports.fn6 = fn6;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
=== tests/cases/compiler/enumMemberReduction.ts ===
2+
enum MyEnum {
3+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
4+
5+
A,
6+
>A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
7+
8+
B,
9+
>B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
10+
11+
C,
12+
>C : Symbol(MyEnum.C, Decl(enumMemberReduction.ts, 2, 4))
13+
}
14+
15+
enum MyStringEnum {
16+
>MyStringEnum : Symbol(MyStringEnum, Decl(enumMemberReduction.ts, 4, 1))
17+
18+
A = "a",
19+
>A : Symbol(MyStringEnum.A, Decl(enumMemberReduction.ts, 6, 19))
20+
21+
B = "b",
22+
>B : Symbol(MyStringEnum.B, Decl(enumMemberReduction.ts, 7, 10))
23+
24+
C = "c",
25+
>C : Symbol(MyStringEnum.C, Decl(enumMemberReduction.ts, 8, 10))
26+
}
27+
28+
enum MyStringEnumWithEmpty {
29+
>MyStringEnumWithEmpty : Symbol(MyStringEnumWithEmpty, Decl(enumMemberReduction.ts, 10, 1))
30+
31+
A = "",
32+
>A : Symbol(MyStringEnumWithEmpty.A, Decl(enumMemberReduction.ts, 12, 28))
33+
34+
B = "b",
35+
>B : Symbol(MyStringEnumWithEmpty.B, Decl(enumMemberReduction.ts, 13, 9))
36+
37+
C = "c",
38+
>C : Symbol(MyStringEnumWithEmpty.C, Decl(enumMemberReduction.ts, 14, 10))
39+
}
40+
41+
export function fn(optionalEnum: MyEnum | undefined) {
42+
>fn : Symbol(fn, Decl(enumMemberReduction.ts, 16, 1))
43+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 18, 19))
44+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
45+
46+
return optionalEnum ?? MyEnum.A;
47+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 18, 19))
48+
>MyEnum.A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
49+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
50+
>A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
51+
}
52+
53+
export function fn2(optionalEnum: MyEnum | undefined) {
54+
>fn2 : Symbol(fn2, Decl(enumMemberReduction.ts, 20, 1))
55+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 22, 20))
56+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
57+
58+
return optionalEnum || MyEnum.B;
59+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 22, 20))
60+
>MyEnum.B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
61+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
62+
>B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
63+
}
64+
65+
export function fn3(optionalEnum?: MyEnum) {
66+
>fn3 : Symbol(fn3, Decl(enumMemberReduction.ts, 24, 1))
67+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 26, 20))
68+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
69+
70+
return optionalEnum ?? MyEnum.A;
71+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 26, 20))
72+
>MyEnum.A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
73+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
74+
>A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
75+
}
76+
77+
export function fn4(optionalEnum?: MyEnum) {
78+
>fn4 : Symbol(fn4, Decl(enumMemberReduction.ts, 28, 1))
79+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 30, 20))
80+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
81+
82+
return optionalEnum || MyEnum.B;
83+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 30, 20))
84+
>MyEnum.B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
85+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
86+
>B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
87+
}
88+
89+
export function fn5(optionalEnum?: MyStringEnum) {
90+
>fn5 : Symbol(fn5, Decl(enumMemberReduction.ts, 32, 1))
91+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 34, 20))
92+
>MyStringEnum : Symbol(MyStringEnum, Decl(enumMemberReduction.ts, 4, 1))
93+
94+
return optionalEnum || MyStringEnum.B;
95+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 34, 20))
96+
>MyStringEnum.B : Symbol(MyStringEnum.B, Decl(enumMemberReduction.ts, 7, 10))
97+
>MyStringEnum : Symbol(MyStringEnum, Decl(enumMemberReduction.ts, 4, 1))
98+
>B : Symbol(MyStringEnum.B, Decl(enumMemberReduction.ts, 7, 10))
99+
}
100+
101+
export function fn6(optionalEnum?: MyStringEnumWithEmpty) {
102+
>fn6 : Symbol(fn6, Decl(enumMemberReduction.ts, 36, 1))
103+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 38, 20))
104+
>MyStringEnumWithEmpty : Symbol(MyStringEnumWithEmpty, Decl(enumMemberReduction.ts, 10, 1))
105+
106+
return optionalEnum || MyStringEnumWithEmpty.B;
107+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 38, 20))
108+
>MyStringEnumWithEmpty.B : Symbol(MyStringEnumWithEmpty.B, Decl(enumMemberReduction.ts, 13, 9))
109+
>MyStringEnumWithEmpty : Symbol(MyStringEnumWithEmpty, Decl(enumMemberReduction.ts, 10, 1))
110+
>B : Symbol(MyStringEnumWithEmpty.B, Decl(enumMemberReduction.ts, 13, 9))
111+
}
112+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
=== tests/cases/compiler/enumMemberReduction.ts ===
2+
enum MyEnum {
3+
>MyEnum : MyEnum
4+
5+
A,
6+
>A : MyEnum.A
7+
8+
B,
9+
>B : MyEnum.B
10+
11+
C,
12+
>C : MyEnum.C
13+
}
14+
15+
enum MyStringEnum {
16+
>MyStringEnum : MyStringEnum
17+
18+
A = "a",
19+
>A : MyStringEnum.A
20+
>"a" : "a"
21+
22+
B = "b",
23+
>B : MyStringEnum.B
24+
>"b" : "b"
25+
26+
C = "c",
27+
>C : MyStringEnum.C
28+
>"c" : "c"
29+
}
30+
31+
enum MyStringEnumWithEmpty {
32+
>MyStringEnumWithEmpty : MyStringEnumWithEmpty
33+
34+
A = "",
35+
>A : MyStringEnumWithEmpty.A
36+
>"" : ""
37+
38+
B = "b",
39+
>B : MyStringEnumWithEmpty.B
40+
>"b" : "b"
41+
42+
C = "c",
43+
>C : MyStringEnumWithEmpty.C
44+
>"c" : "c"
45+
}
46+
47+
export function fn(optionalEnum: MyEnum | undefined) {
48+
>fn : (optionalEnum: MyEnum | undefined) => MyEnum
49+
>optionalEnum : MyEnum
50+
51+
return optionalEnum ?? MyEnum.A;
52+
>optionalEnum ?? MyEnum.A : MyEnum
53+
>optionalEnum : MyEnum
54+
>MyEnum.A : MyEnum.A
55+
>MyEnum : typeof MyEnum
56+
>A : MyEnum.A
57+
}
58+
59+
export function fn2(optionalEnum: MyEnum | undefined) {
60+
>fn2 : (optionalEnum: MyEnum | undefined) => MyEnum.B | MyEnum.C
61+
>optionalEnum : MyEnum
62+
63+
return optionalEnum || MyEnum.B;
64+
>optionalEnum || MyEnum.B : MyEnum.B | MyEnum.C
65+
>optionalEnum : MyEnum
66+
>MyEnum.B : MyEnum.B
67+
>MyEnum : typeof MyEnum
68+
>B : MyEnum.B
69+
}
70+
71+
export function fn3(optionalEnum?: MyEnum) {
72+
>fn3 : (optionalEnum?: MyEnum) => MyEnum
73+
>optionalEnum : MyEnum
74+
75+
return optionalEnum ?? MyEnum.A;
76+
>optionalEnum ?? MyEnum.A : MyEnum
77+
>optionalEnum : MyEnum
78+
>MyEnum.A : MyEnum.A
79+
>MyEnum : typeof MyEnum
80+
>A : MyEnum.A
81+
}
82+
83+
export function fn4(optionalEnum?: MyEnum) {
84+
>fn4 : (optionalEnum?: MyEnum) => MyEnum.B | MyEnum.C
85+
>optionalEnum : MyEnum
86+
87+
return optionalEnum || MyEnum.B;
88+
>optionalEnum || MyEnum.B : MyEnum.B | MyEnum.C
89+
>optionalEnum : MyEnum
90+
>MyEnum.B : MyEnum.B
91+
>MyEnum : typeof MyEnum
92+
>B : MyEnum.B
93+
}
94+
95+
export function fn5(optionalEnum?: MyStringEnum) {
96+
>fn5 : (optionalEnum?: MyStringEnum) => MyStringEnum
97+
>optionalEnum : MyStringEnum
98+
99+
return optionalEnum || MyStringEnum.B;
100+
>optionalEnum || MyStringEnum.B : MyStringEnum
101+
>optionalEnum : MyStringEnum
102+
>MyStringEnum.B : MyStringEnum.B
103+
>MyStringEnum : typeof MyStringEnum
104+
>B : MyStringEnum.B
105+
}
106+
107+
export function fn6(optionalEnum?: MyStringEnumWithEmpty) {
108+
>fn6 : (optionalEnum?: MyStringEnumWithEmpty) => MyStringEnumWithEmpty.B | MyStringEnumWithEmpty.C
109+
>optionalEnum : MyStringEnumWithEmpty
110+
111+
return optionalEnum || MyStringEnumWithEmpty.B;
112+
>optionalEnum || MyStringEnumWithEmpty.B : MyStringEnumWithEmpty.B | MyStringEnumWithEmpty.C
113+
>optionalEnum : MyStringEnumWithEmpty
114+
>MyStringEnumWithEmpty.B : MyStringEnumWithEmpty.B
115+
>MyStringEnumWithEmpty : typeof MyStringEnumWithEmpty
116+
>B : MyStringEnumWithEmpty.B
117+
}
118+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
enum MyEnum {
2+
A,
3+
B,
4+
C,
5+
}
6+
7+
enum MyStringEnum {
8+
A = "a",
9+
B = "b",
10+
C = "c",
11+
}
12+
13+
enum MyStringEnumWithEmpty {
14+
A = "",
15+
B = "b",
16+
C = "c",
17+
}
18+
19+
export function fn(optionalEnum: MyEnum | undefined) {
20+
return optionalEnum ?? MyEnum.A;
21+
}
22+
23+
export function fn2(optionalEnum: MyEnum | undefined) {
24+
return optionalEnum || MyEnum.B;
25+
}
26+
27+
export function fn3(optionalEnum?: MyEnum) {
28+
return optionalEnum ?? MyEnum.A;
29+
}
30+
31+
export function fn4(optionalEnum?: MyEnum) {
32+
return optionalEnum || MyEnum.B;
33+
}
34+
35+
export function fn5(optionalEnum?: MyStringEnum) {
36+
return optionalEnum || MyStringEnum.B;
37+
}
38+
39+
export function fn6(optionalEnum?: MyStringEnumWithEmpty) {
40+
return optionalEnum || MyStringEnumWithEmpty.B;
41+
}

0 commit comments

Comments
 (0)