Skip to content

Commit d3076fa

Browse files
committed
Add case to capture enum subtype reduction (addresses microsoft#35867)
1 parent 44d6b51 commit d3076fa

File tree

4 files changed

+279
-0
lines changed

4 files changed

+279
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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+
export function fn(optionalEnum: MyEnum | undefined) {
15+
return optionalEnum ?? MyEnum.A;
16+
}
17+
18+
export function fn2(optionalEnum: MyEnum | undefined) {
19+
return optionalEnum || MyEnum.B;
20+
}
21+
22+
export function fn3(optionalEnum?: MyEnum) {
23+
return optionalEnum ?? MyEnum.A;
24+
}
25+
26+
export function fn4(optionalEnum?: MyEnum) {
27+
return optionalEnum || MyEnum.B;
28+
}
29+
30+
export function fn5(optionalEnum?: MyStringEnum) {
31+
return optionalEnum || MyStringEnum.B;
32+
}
33+
34+
35+
//// [enumMemberReduction.js]
36+
"use strict";
37+
exports.__esModule = true;
38+
exports.fn5 = exports.fn4 = exports.fn3 = exports.fn2 = exports.fn = void 0;
39+
var MyEnum;
40+
(function (MyEnum) {
41+
MyEnum[MyEnum["A"] = 0] = "A";
42+
MyEnum[MyEnum["B"] = 1] = "B";
43+
MyEnum[MyEnum["C"] = 2] = "C";
44+
})(MyEnum || (MyEnum = {}));
45+
var MyStringEnum;
46+
(function (MyStringEnum) {
47+
MyStringEnum["A"] = "a";
48+
MyStringEnum["B"] = "b";
49+
MyStringEnum["C"] = "c";
50+
})(MyStringEnum || (MyStringEnum = {}));
51+
function fn(optionalEnum) {
52+
return optionalEnum !== null && optionalEnum !== void 0 ? optionalEnum : MyEnum.A;
53+
}
54+
exports.fn = fn;
55+
function fn2(optionalEnum) {
56+
return optionalEnum || MyEnum.B;
57+
}
58+
exports.fn2 = fn2;
59+
function fn3(optionalEnum) {
60+
return optionalEnum !== null && optionalEnum !== void 0 ? optionalEnum : MyEnum.A;
61+
}
62+
exports.fn3 = fn3;
63+
function fn4(optionalEnum) {
64+
return optionalEnum || MyEnum.B;
65+
}
66+
exports.fn4 = fn4;
67+
function fn5(optionalEnum) {
68+
return optionalEnum || MyStringEnum.B;
69+
}
70+
exports.fn5 = fn5;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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+
export function fn(optionalEnum: MyEnum | undefined) {
29+
>fn : Symbol(fn, Decl(enumMemberReduction.ts, 10, 1))
30+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 12, 19))
31+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
32+
33+
return optionalEnum ?? MyEnum.A;
34+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 12, 19))
35+
>MyEnum.A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
36+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
37+
>A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
38+
}
39+
40+
export function fn2(optionalEnum: MyEnum | undefined) {
41+
>fn2 : Symbol(fn2, Decl(enumMemberReduction.ts, 14, 1))
42+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 16, 20))
43+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
44+
45+
return optionalEnum || MyEnum.B;
46+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 16, 20))
47+
>MyEnum.B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
48+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
49+
>B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
50+
}
51+
52+
export function fn3(optionalEnum?: MyEnum) {
53+
>fn3 : Symbol(fn3, Decl(enumMemberReduction.ts, 18, 1))
54+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 20, 20))
55+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
56+
57+
return optionalEnum ?? MyEnum.A;
58+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 20, 20))
59+
>MyEnum.A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
60+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
61+
>A : Symbol(MyEnum.A, Decl(enumMemberReduction.ts, 0, 13))
62+
}
63+
64+
export function fn4(optionalEnum?: MyEnum) {
65+
>fn4 : Symbol(fn4, Decl(enumMemberReduction.ts, 22, 1))
66+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 24, 20))
67+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
68+
69+
return optionalEnum || MyEnum.B;
70+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 24, 20))
71+
>MyEnum.B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
72+
>MyEnum : Symbol(MyEnum, Decl(enumMemberReduction.ts, 0, 0))
73+
>B : Symbol(MyEnum.B, Decl(enumMemberReduction.ts, 1, 4))
74+
}
75+
76+
export function fn5(optionalEnum?: MyStringEnum) {
77+
>fn5 : Symbol(fn5, Decl(enumMemberReduction.ts, 26, 1))
78+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 28, 20))
79+
>MyStringEnum : Symbol(MyStringEnum, Decl(enumMemberReduction.ts, 4, 1))
80+
81+
return optionalEnum || MyStringEnum.B;
82+
>optionalEnum : Symbol(optionalEnum, Decl(enumMemberReduction.ts, 28, 20))
83+
>MyStringEnum.B : Symbol(MyStringEnum.B, Decl(enumMemberReduction.ts, 7, 10))
84+
>MyStringEnum : Symbol(MyStringEnum, Decl(enumMemberReduction.ts, 4, 1))
85+
>B : Symbol(MyStringEnum.B, Decl(enumMemberReduction.ts, 7, 10))
86+
}
87+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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+
export function fn(optionalEnum: MyEnum | undefined) {
32+
>fn : (optionalEnum: MyEnum | undefined) => MyEnum
33+
>optionalEnum : MyEnum
34+
35+
return optionalEnum ?? MyEnum.A;
36+
>optionalEnum ?? MyEnum.A : MyEnum
37+
>optionalEnum : MyEnum
38+
>MyEnum.A : MyEnum.A
39+
>MyEnum : typeof MyEnum
40+
>A : MyEnum.A
41+
}
42+
43+
export function fn2(optionalEnum: MyEnum | undefined) {
44+
>fn2 : (optionalEnum: MyEnum | undefined) => MyEnum.B | MyEnum.C
45+
>optionalEnum : MyEnum
46+
47+
return optionalEnum || MyEnum.B;
48+
>optionalEnum || MyEnum.B : MyEnum.B | MyEnum.C
49+
>optionalEnum : MyEnum
50+
>MyEnum.B : MyEnum.B
51+
>MyEnum : typeof MyEnum
52+
>B : MyEnum.B
53+
}
54+
55+
export function fn3(optionalEnum?: MyEnum) {
56+
>fn3 : (optionalEnum?: MyEnum) => MyEnum
57+
>optionalEnum : MyEnum
58+
59+
return optionalEnum ?? MyEnum.A;
60+
>optionalEnum ?? MyEnum.A : MyEnum
61+
>optionalEnum : MyEnum
62+
>MyEnum.A : MyEnum.A
63+
>MyEnum : typeof MyEnum
64+
>A : MyEnum.A
65+
}
66+
67+
export function fn4(optionalEnum?: MyEnum) {
68+
>fn4 : (optionalEnum?: MyEnum) => MyEnum.B | MyEnum.C
69+
>optionalEnum : MyEnum
70+
71+
return optionalEnum || MyEnum.B;
72+
>optionalEnum || MyEnum.B : MyEnum.B | MyEnum.C
73+
>optionalEnum : MyEnum
74+
>MyEnum.B : MyEnum.B
75+
>MyEnum : typeof MyEnum
76+
>B : MyEnum.B
77+
}
78+
79+
export function fn5(optionalEnum?: MyStringEnum) {
80+
>fn5 : (optionalEnum?: MyStringEnum) => MyStringEnum
81+
>optionalEnum : MyStringEnum
82+
83+
return optionalEnum || MyStringEnum.B;
84+
>optionalEnum || MyStringEnum.B : MyStringEnum
85+
>optionalEnum : MyStringEnum
86+
>MyStringEnum.B : MyStringEnum.B
87+
>MyStringEnum : typeof MyStringEnum
88+
>B : MyStringEnum.B
89+
}
90+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
export function fn(optionalEnum: MyEnum | undefined) {
14+
return optionalEnum ?? MyEnum.A;
15+
}
16+
17+
export function fn2(optionalEnum: MyEnum | undefined) {
18+
return optionalEnum || MyEnum.B;
19+
}
20+
21+
export function fn3(optionalEnum?: MyEnum) {
22+
return optionalEnum ?? MyEnum.A;
23+
}
24+
25+
export function fn4(optionalEnum?: MyEnum) {
26+
return optionalEnum || MyEnum.B;
27+
}
28+
29+
export function fn5(optionalEnum?: MyStringEnum) {
30+
return optionalEnum || MyStringEnum.B;
31+
}
32+

0 commit comments

Comments
 (0)