Skip to content

Commit 63319d1

Browse files
committed
Treat enums with a single literal member as literal enums
1 parent be0fc3b commit 63319d1

File tree

1 file changed

+14
-13
lines changed

1 file changed

+14
-13
lines changed

src/compiler/checker.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3047,9 +3047,14 @@ namespace ts {
30473047
writeTypeReference(<TypeReference>type, nextFlags);
30483048
}
30493049
else if (type.flags & TypeFlags.EnumLiteral && !(type.flags & TypeFlags.Union)) {
3050-
buildSymbolDisplay(getParentOfSymbol(type.symbol), writer, enclosingDeclaration, SymbolFlags.Type, SymbolFormatFlags.None, nextFlags);
3051-
writePunctuation(writer, SyntaxKind.DotToken);
3052-
appendSymbolNameOnly(type.symbol, writer);
3050+
const parent = getParentOfSymbol(type.symbol);
3051+
buildSymbolDisplay(parent, writer, enclosingDeclaration, SymbolFlags.Type, SymbolFormatFlags.None, nextFlags);
3052+
// In a literal enum type with a single member E { A }, E and E.A denote the
3053+
// same type. We always display this type simply as E.
3054+
if (getDeclaredTypeOfSymbol(parent).flags & TypeFlags.Union) {
3055+
writePunctuation(writer, SyntaxKind.DotToken);
3056+
appendSymbolNameOnly(type.symbol, writer);
3057+
}
30533058
}
30543059
else if (getObjectFlags(type) & ObjectFlags.ClassOrInterface || type.flags & (TypeFlags.EnumLike | TypeFlags.TypeParameter)) {
30553060
// The specified symbol flags need to be reinterpreted as type flags
@@ -4952,23 +4957,19 @@ namespace ts {
49524957
if (declaration.kind === SyntaxKind.EnumDeclaration) {
49534958
for (const member of (<EnumDeclaration>declaration).members) {
49544959
const memberType = getLiteralType(getEnumMemberValue(member), enumCount, getSymbolOfNode(member));
4960+
getSymbolLinks(getSymbolOfNode(member)).declaredType = memberType;
49554961
if (!contains(memberTypeList, memberType)) {
49564962
memberTypeList.push(memberType);
49574963
}
49584964
}
49594965
}
49604966
}
4961-
if (memberTypeList.length > 1) {
4962-
for (const declaration of symbol.declarations) {
4963-
if (declaration.kind === SyntaxKind.EnumDeclaration) {
4964-
for (const member of (<EnumDeclaration>declaration).members) {
4965-
getSymbolLinks(getSymbolOfNode(member)).declaredType = getLiteralType(getEnumMemberValue(member), enumCount, getSymbolOfNode(member));
4966-
}
4967-
}
4968-
}
4967+
if (memberTypeList.length) {
49694968
const enumType = getUnionType(memberTypeList, /*subtypeReduction*/ false, symbol, /*aliasTypeArguments*/ undefined);
4970-
enumType.flags |= TypeFlags.EnumLiteral;
4971-
enumType.symbol = symbol;
4969+
if (enumType.flags & TypeFlags.Union) {
4970+
enumType.flags |= TypeFlags.EnumLiteral;
4971+
enumType.symbol = symbol;
4972+
}
49724973
return links.declaredType = enumType;
49734974
}
49744975
}

0 commit comments

Comments
 (0)