Skip to content

Commit e808551

Browse files
committed
Fix unions
1 parent d7cefaf commit e808551

File tree

6 files changed

+63
-34
lines changed

6 files changed

+63
-34
lines changed

Diff for: src/compiler/checker.ts

+9-4
Original file line numberDiff line numberDiff line change
@@ -22978,6 +22978,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2297822978
type;
2297922979
}
2298022980

22981+
function getBaseTypeOfLiteralTypeUnion(type: UnionType) {
22982+
const key = `B${getTypeId(type)}`;
22983+
return getCachedType(key) ?? setCachedType(key, mapType(type, getBaseTypeOfLiteralType));
22984+
}
22985+
2298122986
// This is the same as getBaseTypeOfLiteralType, but checks EnumLiteral last so we get
2298222987
// a specific literal's base type rather than the enum's base type.
2298322988
function getBaseTypeOfLiteralTypeForComparison(type: Type): Type {
@@ -22986,13 +22991,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2298622991
type.flags & TypeFlags.BigIntLiteral ? bigintType :
2298722992
type.flags & TypeFlags.BooleanLiteral ? booleanType :
2298822993
type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType(type as LiteralType) :
22989-
type.flags & TypeFlags.Union ? getBaseTypeOfLiteralTypeUnion(type as UnionType) :
22994+
type.flags & TypeFlags.Union ? getBaseTypeOfLiteralTypeUnionForComparison(type as UnionType) :
2299022995
type;
2299122996
}
2299222997

22993-
function getBaseTypeOfLiteralTypeUnion(type: UnionType) {
22994-
const key = `B${getTypeId(type)}`;
22995-
return getCachedType(key) ?? setCachedType(key, mapType(type, getBaseTypeOfLiteralType));
22998+
function getBaseTypeOfLiteralTypeUnionForComparison(type: UnionType) {
22999+
const key = `BC${getTypeId(type)}`;
23000+
return getCachedType(key) ?? setCachedType(key, mapType(type, getBaseTypeOfLiteralTypeForComparison));
2299623001
}
2299723002

2299823003
function getWidenedLiteralType(type: Type): Type {

Diff for: tests/baselines/reference/mixedTypeEnumComparison.errors.txt

-27
This file was deleted.

Diff for: tests/baselines/reference/mixedTypeEnumComparison.js

+9
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ if (someNumber > E.N2) {
1313
someNumber = E.N2;
1414
}
1515

16+
declare const unionOfEnum: E.N1 | E.N2;
17+
18+
if (someNumber > unionOfEnum) {
19+
someNumber = E.N2;
20+
}
21+
1622
declare var someString: string
1723

1824
if (someString > E.S1) {
@@ -26,6 +32,9 @@ if (someString > E.S1) {
2632
if (someNumber > 25 /* E.N2 */) {
2733
someNumber = 25 /* E.N2 */;
2834
}
35+
if (someNumber > unionOfEnum) {
36+
someNumber = 25 /* E.N2 */;
37+
}
2938
if (someString > "foo" /* E.S1 */) {
3039
someString = "bar" /* E.S2 */;
3140
}

Diff for: tests/baselines/reference/mixedTypeEnumComparison.symbols

+21-3
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,35 @@ if (someNumber > E.N2) {
3131
>N2 : Symbol(E.N2, Decl(mixedTypeEnumComparison.ts, 4, 14))
3232
}
3333

34+
declare const unionOfEnum: E.N1 | E.N2;
35+
>unionOfEnum : Symbol(unionOfEnum, Decl(mixedTypeEnumComparison.ts, 14, 13))
36+
>E : Symbol(E, Decl(mixedTypeEnumComparison.ts, 0, 0))
37+
>N1 : Symbol(E.N1, Decl(mixedTypeEnumComparison.ts, 2, 15))
38+
>E : Symbol(E, Decl(mixedTypeEnumComparison.ts, 0, 0))
39+
>N2 : Symbol(E.N2, Decl(mixedTypeEnumComparison.ts, 4, 14))
40+
41+
if (someNumber > unionOfEnum) {
42+
>someNumber : Symbol(someNumber, Decl(mixedTypeEnumComparison.ts, 8, 11))
43+
>unionOfEnum : Symbol(unionOfEnum, Decl(mixedTypeEnumComparison.ts, 14, 13))
44+
45+
someNumber = E.N2;
46+
>someNumber : Symbol(someNumber, Decl(mixedTypeEnumComparison.ts, 8, 11))
47+
>E.N2 : Symbol(E.N2, Decl(mixedTypeEnumComparison.ts, 4, 14))
48+
>E : Symbol(E, Decl(mixedTypeEnumComparison.ts, 0, 0))
49+
>N2 : Symbol(E.N2, Decl(mixedTypeEnumComparison.ts, 4, 14))
50+
}
51+
3452
declare var someString: string
35-
>someString : Symbol(someString, Decl(mixedTypeEnumComparison.ts, 14, 11))
53+
>someString : Symbol(someString, Decl(mixedTypeEnumComparison.ts, 20, 11))
3654

3755
if (someString > E.S1) {
38-
>someString : Symbol(someString, Decl(mixedTypeEnumComparison.ts, 14, 11))
56+
>someString : Symbol(someString, Decl(mixedTypeEnumComparison.ts, 20, 11))
3957
>E.S1 : Symbol(E.S1, Decl(mixedTypeEnumComparison.ts, 0, 14))
4058
>E : Symbol(E, Decl(mixedTypeEnumComparison.ts, 0, 0))
4159
>S1 : Symbol(E.S1, Decl(mixedTypeEnumComparison.ts, 0, 14))
4260

4361
someString = E.S2;
44-
>someString : Symbol(someString, Decl(mixedTypeEnumComparison.ts, 14, 11))
62+
>someString : Symbol(someString, Decl(mixedTypeEnumComparison.ts, 20, 11))
4563
>E.S2 : Symbol(E.S2, Decl(mixedTypeEnumComparison.ts, 1, 15))
4664
>E : Symbol(E, Decl(mixedTypeEnumComparison.ts, 0, 0))
4765
>S2 : Symbol(E.S2, Decl(mixedTypeEnumComparison.ts, 1, 15))

Diff for: tests/baselines/reference/mixedTypeEnumComparison.types

+18
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ if (someNumber > E.N2) {
3737
>N2 : E.N2
3838
}
3939

40+
declare const unionOfEnum: E.N1 | E.N2;
41+
>unionOfEnum : E.N1 | E.N2
42+
>E : any
43+
>E : any
44+
45+
if (someNumber > unionOfEnum) {
46+
>someNumber > unionOfEnum : boolean
47+
>someNumber : number
48+
>unionOfEnum : E.N1 | E.N2
49+
50+
someNumber = E.N2;
51+
>someNumber = E.N2 : E.N2
52+
>someNumber : number
53+
>E.N2 : E.N2
54+
>E : typeof E
55+
>N2 : E.N2
56+
}
57+
4058
declare var someString: string
4159
>someString : string
4260

Diff for: tests/cases/compiler/mixedTypeEnumComparison.ts

+6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ if (someNumber > E.N2) {
1414
someNumber = E.N2;
1515
}
1616

17+
declare const unionOfEnum: E.N1 | E.N2;
18+
19+
if (someNumber > unionOfEnum) {
20+
someNumber = E.N2;
21+
}
22+
1723
declare var someString: string
1824

1925
if (someString > E.S1) {

0 commit comments

Comments
 (0)