Skip to content

Commit 76a7421

Browse files
committed
Remove usage of TypeFlags.FreshLiteral for fresh literal types
1 parent aa023eb commit 76a7421

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

src/compiler/checker.ts

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -408,11 +408,13 @@ namespace ts {
408408
const regularFalseType = createIntrinsicType(TypeFlags.BooleanLiteral, "false") as FreshableIntrinsicType;
409409
const trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true") as FreshableIntrinsicType;
410410
const regularTrueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true") as FreshableIntrinsicType;
411-
falseType.flags |= TypeFlags.FreshLiteral;
412-
trueType.flags |= TypeFlags.FreshLiteral;
413411
trueType.regularType = regularTrueType;
412+
trueType.freshType = trueType;
413+
regularTrueType.regularType = regularTrueType;
414414
regularTrueType.freshType = trueType;
415415
falseType.regularType = regularFalseType;
416+
falseType.freshType = falseType;
417+
regularFalseType.regularType = regularFalseType;
416418
regularFalseType.freshType = falseType;
417419
const booleanType = createBooleanType([regularFalseType, regularTrueType]);
418420
// Also mark all combinations of fresh/regular booleans as "Boolean" so they print as `boolean` instead of `true | false`
@@ -8969,7 +8971,7 @@ namespace ts {
89698971
t.flags & TypeFlags.NumberLiteral && includes & TypeFlags.Number ||
89708972
t.flags & TypeFlags.BigIntLiteral && includes & TypeFlags.BigInt ||
89718973
t.flags & TypeFlags.UniqueESSymbol && includes & TypeFlags.ESSymbol ||
8972-
t.flags & TypeFlags.Literal && t.flags & TypeFlags.FreshLiteral && containsType(types, (<LiteralType>t).regularType);
8974+
isFreshLiteralType(t) && containsType(types, (<LiteralType>t).regularType);
89738975
if (remove) {
89748976
orderedRemoveItemAt(types, i);
89758977
}
@@ -10039,10 +10041,11 @@ namespace ts {
1003910041
}
1004010042

1004110043
function getFreshTypeOfLiteralType(type: Type): Type {
10042-
if (type.flags & TypeFlags.Literal && !(type.flags & TypeFlags.FreshLiteral)) {
10043-
if (!(<LiteralType>type).freshType) { // NOTE: Safe because all freshable intrinsics always have fresh types already
10044-
const freshType = createLiteralType(type.flags | TypeFlags.FreshLiteral, (<LiteralType>type).value, (<LiteralType>type).symbol);
10044+
if (type.flags & TypeFlags.Literal) {
10045+
if (!(<LiteralType>type).freshType) {
10046+
const freshType = createLiteralType(type.flags, (<LiteralType>type).value, (<LiteralType>type).symbol);
1004510047
freshType.regularType = <LiteralType>type;
10048+
freshType.freshType = freshType;
1004610049
(<LiteralType>type).freshType = freshType;
1004710050
}
1004810051
return (<LiteralType>type).freshType;
@@ -10051,11 +10054,15 @@ namespace ts {
1005110054
}
1005210055

1005310056
function getRegularTypeOfLiteralType(type: Type): Type {
10054-
return type.flags & TypeFlags.Literal && type.flags & TypeFlags.FreshLiteral ? (<LiteralType>type).regularType :
10057+
return type.flags & TypeFlags.Literal ? (<LiteralType>type).regularType :
1005510058
type.flags & TypeFlags.Union ? getUnionType(sameMap((<UnionType>type).types, getRegularTypeOfLiteralType)) :
1005610059
type;
1005710060
}
1005810061

10062+
function isFreshLiteralType(type: Type) {
10063+
return !!(type.flags & TypeFlags.Literal) && (<LiteralType>type).freshType === type;
10064+
}
10065+
1005910066
function getLiteralType(value: string | number | PseudoBigInt, enumId?: number, symbol?: Symbol) {
1006010067
// We store all literal types in a single map with keys of the form '#NNN' and '@SSS',
1006110068
// where NNN is the text representation of a numeric literal and SSS are the characters
@@ -10069,6 +10076,7 @@ namespace ts {
1006910076
typeof value === "string" ? TypeFlags.StringLiteral : TypeFlags.BigIntLiteral) |
1007010077
(enumId ? TypeFlags.EnumLiteral : 0);
1007110078
literalTypes.set(key, type = createLiteralType(flags, value, symbol));
10079+
type.regularType = type;
1007210080
}
1007310081
return type;
1007410082
}
@@ -11340,10 +11348,10 @@ namespace ts {
1134011348
}
1134111349

1134211350
function isTypeRelatedTo(source: Type, target: Type, relation: Map<RelationComparisonResult>) {
11343-
if (source.flags & TypeFlags.Literal && source.flags & TypeFlags.FreshLiteral) {
11351+
if (isFreshLiteralType(source)) {
1134411352
source = (<FreshableType>source).regularType;
1134511353
}
11346-
if (target.flags & TypeFlags.Literal && target.flags & TypeFlags.FreshLiteral) {
11354+
if (isFreshLiteralType(target)) {
1134711355
target = (<FreshableType>target).regularType;
1134811356
}
1134911357
if (source === target ||
@@ -11498,10 +11506,10 @@ namespace ts {
1149811506
* * Ternary.False if they are not related.
1149911507
*/
1150011508
function isRelatedTo(source: Type, target: Type, reportErrors = false, headMessage?: DiagnosticMessage, isApparentIntersectionConstituent?: boolean): Ternary {
11501-
if (source.flags & TypeFlags.Literal && source.flags & TypeFlags.FreshLiteral) {
11509+
if (isFreshLiteralType(source)) {
1150211510
source = (<FreshableType>source).regularType;
1150311511
}
11504-
if (target.flags & TypeFlags.Literal && target.flags & TypeFlags.FreshLiteral) {
11512+
if (isFreshLiteralType(target)) {
1150511513
target = (<FreshableType>target).regularType;
1150611514
}
1150711515
if (source.flags & TypeFlags.Substitution) {
@@ -13113,11 +13121,11 @@ namespace ts {
1311313121
}
1311413122

1311513123
function getWidenedLiteralType(type: Type): Type {
13116-
return type.flags & TypeFlags.EnumLiteral && type.flags & TypeFlags.FreshLiteral ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
13117-
type.flags & TypeFlags.StringLiteral && type.flags & TypeFlags.FreshLiteral ? stringType :
13118-
type.flags & TypeFlags.NumberLiteral && type.flags & TypeFlags.FreshLiteral ? numberType :
13119-
type.flags & TypeFlags.BigIntLiteral && type.flags & TypeFlags.FreshLiteral ? bigintType :
13120-
type.flags & TypeFlags.BooleanLiteral && type.flags & TypeFlags.FreshLiteral ? booleanType :
13124+
return type.flags & TypeFlags.EnumLiteral && isFreshLiteralType(type) ? getBaseTypeOfEnumLiteralType(<LiteralType>type) :
13125+
type.flags & TypeFlags.StringLiteral && isFreshLiteralType(type) ? stringType :
13126+
type.flags & TypeFlags.NumberLiteral && isFreshLiteralType(type) ? numberType :
13127+
type.flags & TypeFlags.BigIntLiteral && isFreshLiteralType(type) ? bigintType :
13128+
type.flags & TypeFlags.BooleanLiteral && isFreshLiteralType(type) ? booleanType :
1312113129
type.flags & TypeFlags.Union ? getUnionType(sameMap((<UnionType>type).types, getWidenedLiteralType)) :
1312213130
type;
1312313131
}
@@ -14530,7 +14538,7 @@ namespace ts {
1453014538
return assignedType;
1453114539
}
1453214540
let reducedType = filterType(declaredType, t => typeMaybeAssignableTo(assignedType, t));
14533-
if (assignedType.flags & TypeFlags.FreshLiteral && assignedType.flags & TypeFlags.BooleanLiteral) {
14541+
if (assignedType.flags & TypeFlags.BooleanLiteral && isFreshLiteralType(assignedType)) {
1453414542
reducedType = mapType(reducedType, getFreshTypeOfLiteralType); // Ensure that if the assignment is a fresh type, that we narrow to fresh types
1453514543
}
1453614544
// Our crude heuristic produces an invalid result in some cases: see GH#26130.
@@ -28768,8 +28776,7 @@ namespace ts {
2876828776

2876928777
function isLiteralConstDeclaration(node: VariableDeclaration | PropertyDeclaration | PropertySignature | ParameterDeclaration): boolean {
2877028778
if (isDeclarationReadonly(node) || isVariableDeclaration(node) && isVarConst(node)) {
28771-
const type = getTypeOfSymbol(getSymbolOfNode(node));
28772-
return !!(type.flags & TypeFlags.Literal && type.flags & TypeFlags.FreshLiteral);
28779+
return isFreshLiteralType(getTypeOfSymbol(getSymbolOfNode(node)));
2877328780
}
2877428781
return false;
2877528782
}

0 commit comments

Comments
 (0)