@@ -157,6 +157,7 @@ import {
157
157
entityNameToString,
158
158
EnumDeclaration,
159
159
EnumMember,
160
+ EnumType,
160
161
equateValues,
161
162
escapeLeadingUnderscores,
162
163
escapeString,
@@ -9654,8 +9655,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
9654
9655
const t = types[i];
9655
9656
flags |= t.flags;
9656
9657
if (!(t.flags & TypeFlags.Nullable)) {
9657
- if (t.flags & (TypeFlags.BooleanLiteral | TypeFlags.EnumLiteral )) {
9658
- const baseType = t.flags & TypeFlags.BooleanLiteral ? booleanType : getBaseTypeOfEnumLiteralType (t as LiteralType);
9658
+ if (t.flags & (TypeFlags.BooleanLiteral | TypeFlags.EnumLike )) {
9659
+ const baseType = t.flags & TypeFlags.BooleanLiteral ? booleanType : getBaseTypeOfEnumLikeType (t as LiteralType);
9659
9660
if (baseType.flags & TypeFlags.Union) {
9660
9661
const count = (baseType as UnionType).types.length;
9661
9662
if (i + count <= types.length && getRegularTypeOfLiteralType(types[i + count - 1]) === getRegularTypeOfLiteralType((baseType as UnionType).types[count - 1])) {
@@ -11898,8 +11899,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
11898
11899
return links.declaredType;
11899
11900
}
11900
11901
11901
- function getBaseTypeOfEnumLiteralType (type: Type) {
11902
- return type.flags & TypeFlags.EnumLiteral && !( type.flags & TypeFlags.Union) ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)!) : type;
11902
+ function getBaseTypeOfEnumLikeType (type: Type) {
11903
+ return type.flags & TypeFlags.EnumLike && type.symbol. flags & SymbolFlags.EnumMember ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)!) : type;
11903
11904
}
11904
11905
11905
11906
function getDeclaredTypeOfEnum(symbol: Symbol): Type {
@@ -11913,9 +11914,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
11913
11914
if (hasBindableName(member)) {
11914
11915
const memberSymbol = getSymbolOfDeclaration(member);
11915
11916
const value = getEnumMemberValue(member);
11916
- const memberType = value !== undefined ?
11917
- getFreshTypeOfLiteralType( getEnumLiteralType(value, getSymbolId(symbol), memberSymbol) ) :
11918
- createTypeWithSymbol(TypeFlags.Enum, memberSymbol);
11917
+ const memberType = getFreshTypeOfLiteralType( value !== undefined ?
11918
+ getEnumLiteralType(value, getSymbolId(symbol), memberSymbol) :
11919
+ createComputedEnumType( memberSymbol) );
11919
11920
getSymbolLinks(memberSymbol).declaredType = memberType;
11920
11921
memberTypeList.push(getRegularTypeOfLiteralType(memberType));
11921
11922
}
@@ -11925,7 +11926,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
11925
11926
}
11926
11927
const enumType = memberTypeList.length ?
11927
11928
getUnionType(memberTypeList, UnionReduction.Literal, symbol, /*aliasTypeArguments*/ undefined) :
11928
- createTypeWithSymbol(TypeFlags.Enum, symbol);
11929
+ createComputedEnumType( symbol);
11929
11930
if (enumType.flags & TypeFlags.Union) {
11930
11931
enumType.flags |= TypeFlags.EnumLiteral;
11931
11932
enumType.symbol = symbol;
@@ -11935,6 +11936,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
11935
11936
return links.declaredType;
11936
11937
}
11937
11938
11939
+ function createComputedEnumType(symbol: Symbol) {
11940
+ const regularType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
11941
+ const freshType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
11942
+ regularType.regularType = regularType;
11943
+ regularType.freshType = freshType;
11944
+ freshType.regularType = regularType;
11945
+ freshType.freshType = freshType;
11946
+ return regularType;
11947
+ }
11948
+
11938
11949
function getDeclaredTypeOfEnumMember(symbol: Symbol): Type {
11939
11950
const links = getSymbolLinks(symbol);
11940
11951
if (!links.declaredType) {
@@ -16176,7 +16187,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
16176
16187
orderedRemoveItemAt(typeSet, 1);
16177
16188
}
16178
16189
}
16179
- if (includes & (TypeFlags.Literal | TypeFlags.UniqueESSymbol | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) || includes & TypeFlags.Void && includes & TypeFlags.Undefined) {
16190
+ if (includes & (TypeFlags.Enum | TypeFlags. Literal | TypeFlags.UniqueESSymbol | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) || includes & TypeFlags.Void && includes & TypeFlags.Undefined) {
16180
16191
removeRedundantLiteralTypes(typeSet, includes, !!(unionReduction & UnionReduction.Subtype));
16181
16192
}
16182
16193
if (includes & TypeFlags.StringLiteral && includes & TypeFlags.TemplateLiteral) {
@@ -18026,25 +18037,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
18026
18037
}
18027
18038
18028
18039
function getFreshTypeOfLiteralType(type: Type): Type {
18029
- if (type.flags & TypeFlags.Literal ) {
18030
- if (!(type as LiteralType ).freshType) {
18040
+ if (type.flags & TypeFlags.Freshable ) {
18041
+ if (!(type as FreshableType ).freshType) {
18031
18042
const freshType = createLiteralType(type.flags, (type as LiteralType).value, (type as LiteralType).symbol, type as LiteralType);
18032
18043
freshType.freshType = freshType;
18033
- (type as LiteralType ).freshType = freshType;
18044
+ (type as FreshableType ).freshType = freshType;
18034
18045
}
18035
- return (type as LiteralType ).freshType;
18046
+ return (type as FreshableType ).freshType;
18036
18047
}
18037
18048
return type;
18038
18049
}
18039
18050
18040
18051
function getRegularTypeOfLiteralType(type: Type): Type {
18041
- return type.flags & TypeFlags.Literal ? (type as LiteralType ).regularType :
18052
+ return type.flags & TypeFlags.Freshable ? (type as FreshableType ).regularType :
18042
18053
type.flags & TypeFlags.Union ? ((type as UnionType).regularType || ((type as UnionType).regularType = mapType(type, getRegularTypeOfLiteralType) as UnionType)) :
18043
18054
type;
18044
18055
}
18045
18056
18046
18057
function isFreshLiteralType(type: Type) {
18047
- return !!(type.flags & TypeFlags.Literal ) && (type as LiteralType).freshType === type;
18058
+ return !!(type.flags & TypeFlags.Freshable ) && (type as LiteralType).freshType === type;
18048
18059
}
18049
18060
18050
18061
function getStringLiteralType(value: string): StringLiteralType {
@@ -22935,7 +22946,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22935
22946
}
22936
22947
22937
22948
function getBaseTypeOfLiteralType(type: Type): Type {
22938
- return type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType (type as LiteralType) :
22949
+ return type.flags & TypeFlags.EnumLike ? getBaseTypeOfEnumLikeType (type as LiteralType) :
22939
22950
type.flags & (TypeFlags.StringLiteral | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) ? stringType :
22940
22951
type.flags & TypeFlags.NumberLiteral ? numberType :
22941
22952
type.flags & TypeFlags.BigIntLiteral ? bigintType :
@@ -22950,7 +22961,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22950
22961
}
22951
22962
22952
22963
function getWidenedLiteralType(type: Type): Type {
22953
- return type.flags & TypeFlags.EnumLiteral && isFreshLiteralType(type) ? getBaseTypeOfEnumLiteralType (type as LiteralType) :
22964
+ return type.flags & TypeFlags.EnumLike && isFreshLiteralType(type) ? getBaseTypeOfEnumLikeType (type as LiteralType) :
22954
22965
type.flags & TypeFlags.StringLiteral && isFreshLiteralType(type) ? stringType :
22955
22966
type.flags & TypeFlags.NumberLiteral && isFreshLiteralType(type) ? numberType :
22956
22967
type.flags & TypeFlags.BigIntLiteral && isFreshLiteralType(type) ? bigintType :
@@ -25587,7 +25598,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
25587
25598
}
25588
25599
return true;
25589
25600
}
25590
- if (source.flags & TypeFlags.EnumLiteral && getBaseTypeOfEnumLiteralType (source as LiteralType) === target) {
25601
+ if (source.flags & TypeFlags.EnumLike && getBaseTypeOfEnumLikeType (source as LiteralType) === target) {
25591
25602
return true;
25592
25603
}
25593
25604
return containsType(target.types, source);
0 commit comments