@@ -157,6 +157,7 @@ import {
157157 entityNameToString,
158158 EnumDeclaration,
159159 EnumMember,
160+ EnumType,
160161 equateValues,
161162 escapeLeadingUnderscores,
162163 escapeString,
@@ -9660,8 +9661,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
96609661 const t = types[i];
96619662 flags |= t.flags;
96629663 if (!(t.flags & TypeFlags.Nullable)) {
9663- if (t.flags & (TypeFlags.BooleanLiteral | TypeFlags.EnumLiteral )) {
9664- const baseType = t.flags & TypeFlags.BooleanLiteral ? booleanType : getBaseTypeOfEnumLiteralType (t as LiteralType);
9664+ if (t.flags & (TypeFlags.BooleanLiteral | TypeFlags.EnumLike )) {
9665+ const baseType = t.flags & TypeFlags.BooleanLiteral ? booleanType : getBaseTypeOfEnumLikeType (t as LiteralType);
96659666 if (baseType.flags & TypeFlags.Union) {
96669667 const count = (baseType as UnionType).types.length;
96679668 if (i + count <= types.length && getRegularTypeOfLiteralType(types[i + count - 1]) === getRegularTypeOfLiteralType((baseType as UnionType).types[count - 1])) {
@@ -11906,8 +11907,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1190611907 return links.declaredType;
1190711908 }
1190811909
11909- function getBaseTypeOfEnumLiteralType (type: Type) {
11910- return type.flags & TypeFlags.EnumLiteral && !( type.flags & TypeFlags.Union) ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)!) : type;
11910+ function getBaseTypeOfEnumLikeType (type: Type) {
11911+ return type.flags & TypeFlags.EnumLike && type.symbol. flags & SymbolFlags.EnumMember ? getDeclaredTypeOfSymbol(getParentOfSymbol(type.symbol)!) : type;
1191111912 }
1191211913
1191311914 function getDeclaredTypeOfEnum(symbol: Symbol): Type {
@@ -11921,9 +11922,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1192111922 if (hasBindableName(member)) {
1192211923 const memberSymbol = getSymbolOfDeclaration(member);
1192311924 const value = getEnumMemberValue(member);
11924- const memberType = value !== undefined ?
11925- getFreshTypeOfLiteralType( getEnumLiteralType(value, getSymbolId(symbol), memberSymbol) ) :
11926- createTypeWithSymbol(TypeFlags.Enum, memberSymbol);
11925+ const memberType = getFreshTypeOfLiteralType( value !== undefined ?
11926+ getEnumLiteralType(value, getSymbolId(symbol), memberSymbol) :
11927+ createComputedEnumType( memberSymbol) );
1192711928 getSymbolLinks(memberSymbol).declaredType = memberType;
1192811929 memberTypeList.push(getRegularTypeOfLiteralType(memberType));
1192911930 }
@@ -11933,7 +11934,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1193311934 }
1193411935 const enumType = memberTypeList.length ?
1193511936 getUnionType(memberTypeList, UnionReduction.Literal, symbol, /*aliasTypeArguments*/ undefined) :
11936- createTypeWithSymbol(TypeFlags.Enum, symbol);
11937+ createComputedEnumType( symbol);
1193711938 if (enumType.flags & TypeFlags.Union) {
1193811939 enumType.flags |= TypeFlags.EnumLiteral;
1193911940 enumType.symbol = symbol;
@@ -11943,6 +11944,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1194311944 return links.declaredType;
1194411945 }
1194511946
11947+ function createComputedEnumType(symbol: Symbol) {
11948+ const regularType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
11949+ const freshType = createTypeWithSymbol(TypeFlags.Enum, symbol) as EnumType;
11950+ regularType.regularType = regularType;
11951+ regularType.freshType = freshType;
11952+ freshType.regularType = regularType;
11953+ freshType.freshType = freshType;
11954+ return regularType;
11955+ }
11956+
1194611957 function getDeclaredTypeOfEnumMember(symbol: Symbol): Type {
1194711958 const links = getSymbolLinks(symbol);
1194811959 if (!links.declaredType) {
@@ -16201,7 +16212,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1620116212 orderedRemoveItemAt(typeSet, 1);
1620216213 }
1620316214 }
16204- if (includes & (TypeFlags.Literal | TypeFlags.UniqueESSymbol | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) || includes & TypeFlags.Void && includes & TypeFlags.Undefined) {
16215+ if (includes & (TypeFlags.Enum | TypeFlags. Literal | TypeFlags.UniqueESSymbol | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) || includes & TypeFlags.Void && includes & TypeFlags.Undefined) {
1620516216 removeRedundantLiteralTypes(typeSet, includes, !!(unionReduction & UnionReduction.Subtype));
1620616217 }
1620716218 if (includes & TypeFlags.StringLiteral && includes & TypeFlags.TemplateLiteral) {
@@ -18046,25 +18057,25 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1804618057 }
1804718058
1804818059 function getFreshTypeOfLiteralType(type: Type): Type {
18049- if (type.flags & TypeFlags.Literal ) {
18050- if (!(type as LiteralType ).freshType) {
18060+ if (type.flags & TypeFlags.Freshable ) {
18061+ if (!(type as FreshableType ).freshType) {
1805118062 const freshType = createLiteralType(type.flags, (type as LiteralType).value, (type as LiteralType).symbol, type as LiteralType);
1805218063 freshType.freshType = freshType;
18053- (type as LiteralType ).freshType = freshType;
18064+ (type as FreshableType ).freshType = freshType;
1805418065 }
18055- return (type as LiteralType ).freshType;
18066+ return (type as FreshableType ).freshType;
1805618067 }
1805718068 return type;
1805818069 }
1805918070
1806018071 function getRegularTypeOfLiteralType(type: Type): Type {
18061- return type.flags & TypeFlags.Literal ? (type as LiteralType ).regularType :
18072+ return type.flags & TypeFlags.Freshable ? (type as FreshableType ).regularType :
1806218073 type.flags & TypeFlags.Union ? ((type as UnionType).regularType || ((type as UnionType).regularType = mapType(type, getRegularTypeOfLiteralType) as UnionType)) :
1806318074 type;
1806418075 }
1806518076
1806618077 function isFreshLiteralType(type: Type) {
18067- return !!(type.flags & TypeFlags.Literal ) && (type as LiteralType).freshType === type;
18078+ return !!(type.flags & TypeFlags.Freshable ) && (type as LiteralType).freshType === type;
1806818079 }
1806918080
1807018081 function getStringLiteralType(value: string): StringLiteralType {
@@ -22993,7 +23004,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2299323004 }
2299423005
2299523006 function getBaseTypeOfLiteralType(type: Type): Type {
22996- return type.flags & TypeFlags.EnumLiteral ? getBaseTypeOfEnumLiteralType (type as LiteralType) :
23007+ return type.flags & TypeFlags.EnumLike ? getBaseTypeOfEnumLikeType (type as LiteralType) :
2299723008 type.flags & (TypeFlags.StringLiteral | TypeFlags.TemplateLiteral | TypeFlags.StringMapping) ? stringType :
2299823009 type.flags & TypeFlags.NumberLiteral ? numberType :
2299923010 type.flags & TypeFlags.BigIntLiteral ? bigintType :
@@ -23008,7 +23019,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2300823019 }
2300923020
2301023021 function getWidenedLiteralType(type: Type): Type {
23011- return type.flags & TypeFlags.EnumLiteral && isFreshLiteralType(type) ? getBaseTypeOfEnumLiteralType (type as LiteralType) :
23022+ return type.flags & TypeFlags.EnumLike && isFreshLiteralType(type) ? getBaseTypeOfEnumLikeType (type as LiteralType) :
2301223023 type.flags & TypeFlags.StringLiteral && isFreshLiteralType(type) ? stringType :
2301323024 type.flags & TypeFlags.NumberLiteral && isFreshLiteralType(type) ? numberType :
2301423025 type.flags & TypeFlags.BigIntLiteral && isFreshLiteralType(type) ? bigintType :
@@ -25652,7 +25663,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2565225663 }
2565325664 return true;
2565425665 }
25655- if (source.flags & TypeFlags.EnumLiteral && getBaseTypeOfEnumLiteralType (source as LiteralType) === target) {
25666+ if (source.flags & TypeFlags.EnumLike && getBaseTypeOfEnumLikeType (source as LiteralType) === target) {
2565625667 return true;
2565725668 }
2565825669 return containsType(target.types, source);
@@ -45995,7 +46006,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4599546006 }
4599646007
4599746008 function literalTypeToNode(type: FreshableType, enclosing: Node, tracker: SymbolTracker): Expression {
45998- const enumResult = type.flags & TypeFlags.EnumLiteral ? nodeBuilder.symbolToExpression(type.symbol, SymbolFlags.Value, enclosing, /*flags*/ undefined, tracker)
46009+ const enumResult = type.flags & TypeFlags.EnumLike ? nodeBuilder.symbolToExpression(type.symbol, SymbolFlags.Value, enclosing, /*flags*/ undefined, tracker)
4599946010 : type === trueType ? factory.createTrue() : type === falseType && factory.createFalse();
4600046011 if (enumResult) return enumResult;
4600146012 const literalValue = (type as LiteralType).value;
@@ -47782,7 +47793,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4778247793 function isSimpleLiteralEnumReference(expr: Expression) {
4778347794 if ((isPropertyAccessExpression(expr) || (isElementAccessExpression(expr) && isStringOrNumberLiteralExpression(expr.argumentExpression))) &&
4778447795 isEntityNameExpression(expr.expression)) {
47785- return !!(checkExpressionCached(expr).flags & TypeFlags.EnumLiteral );
47796+ return !!(checkExpressionCached(expr).flags & TypeFlags.EnumLike );
4778647797 }
4778747798 }
4778847799
0 commit comments