@@ -309,8 +309,8 @@ namespace ts {
309
309
let flowLoopCount = 0;
310
310
let visitedFlowCount = 0;
311
311
312
- const emptyStringType = getLiteralTypeForText(TypeFlags.StringLiteral, "");
313
- const zeroType = getLiteralTypeForText(TypeFlags.NumberLiteral, "0" );
312
+ const emptyStringType = getLiteralType( "");
313
+ const zeroType = getLiteralType(0 );
314
314
315
315
const resolutionTargets: TypeSystemEntity[] = [];
316
316
const resolutionResults: boolean[] = [];
@@ -1869,7 +1869,7 @@ namespace ts {
1869
1869
}
1870
1870
1871
1871
function createTypeofType() {
1872
- return getUnionType(convertToArray(typeofEQFacts.keys(), s => getLiteralTypeForText(TypeFlags.StringLiteral, s) ));
1872
+ return getUnionType(convertToArray(typeofEQFacts.keys(), getLiteralType ));
1873
1873
}
1874
1874
1875
1875
// A reserved member name starts with two underscores, but the third character cannot be an underscore
@@ -2320,11 +2320,8 @@ namespace ts {
2320
2320
const name = symbolToName(type.symbol, /*expectsIdentifier*/ false);
2321
2321
return createTypeReferenceNode(name, /*typeArguments*/ undefined);
2322
2322
}
2323
- if (type.flags & (TypeFlags.StringLiteral)) {
2324
- return createLiteralTypeNode((createLiteral((<LiteralType>type).text)));
2325
- }
2326
- if (type.flags & (TypeFlags.NumberLiteral)) {
2327
- return createLiteralTypeNode((createNumericLiteral((<LiteralType>type).text)));
2323
+ if (type.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral)) {
2324
+ return createLiteralTypeNode(createLiteral((<LiteralType>type).value));
2328
2325
}
2329
2326
if (type.flags & TypeFlags.BooleanLiteral) {
2330
2327
return (<IntrinsicType>type).intrinsicName === "true" ? createTrue() : createFalse();
@@ -2891,7 +2888,7 @@ namespace ts {
2891
2888
}
2892
2889
2893
2890
function literalTypeToString(type: LiteralType) {
2894
- return type.flags & TypeFlags.StringLiteral ? `"${escapeString((<LiteralType >type).text )}"` : (<LiteralType >type).text ;
2891
+ return type.flags & TypeFlags.StringLiteral ? `"${escapeString((<StringLiteralType >type).value )}"` : "" + (<NumberLiteralType >type).value ;
2895
2892
}
2896
2893
2897
2894
function getNameOfSymbol(symbol: Symbol): string {
@@ -4933,11 +4930,11 @@ namespace ts {
4933
4930
return true;
4934
4931
}
4935
4932
4936
- function createEnumLiteralType(symbol: Symbol, baseType: EnumType, text: string ) {
4933
+ function createEnumLiteralType(symbol: Symbol, baseType: EnumType, value: number ) {
4937
4934
const type = <EnumLiteralType>createType(TypeFlags.EnumLiteral);
4938
4935
type.symbol = symbol;
4939
4936
type.baseType = <EnumType & UnionType>baseType;
4940
- type.text = text ;
4937
+ type.value = value ;
4941
4938
return type;
4942
4939
}
4943
4940
@@ -4956,7 +4953,7 @@ namespace ts {
4956
4953
const memberSymbol = getSymbolOfNode(member);
4957
4954
const value = getEnumMemberValue(member);
4958
4955
if (!memberTypes[value]) {
4959
- const memberType = memberTypes[value] = createEnumLiteralType(memberSymbol, enumType, "" + value);
4956
+ const memberType = memberTypes[value] = createEnumLiteralType(memberSymbol, enumType, value);
4960
4957
memberTypeList.push(memberType);
4961
4958
}
4962
4959
}
@@ -5510,7 +5507,7 @@ namespace ts {
5510
5507
// If the current iteration type constituent is a string literal type, create a property.
5511
5508
// Otherwise, for type string create a string index signature.
5512
5509
if (t.flags & TypeFlags.StringLiteral) {
5513
- const propName = (<LiteralType >t).text ;
5510
+ const propName = (<StringLiteralType >t).value ;
5514
5511
const modifiersProp = getPropertyOfType(modifiersType, propName);
5515
5512
const isOptional = templateOptional || !!(modifiersProp && modifiersProp.flags & SymbolFlags.Optional);
5516
5513
const prop = createSymbol(SymbolFlags.Property | (isOptional ? SymbolFlags.Optional : 0), propName);
@@ -7216,7 +7213,7 @@ namespace ts {
7216
7213
function getLiteralTypeFromPropertyName(prop: Symbol) {
7217
7214
return getDeclarationModifierFlagsFromSymbol(prop) & ModifierFlags.NonPublicAccessibilityModifier || startsWith(prop.name, "__@") ?
7218
7215
neverType :
7219
- getLiteralTypeForText(TypeFlags.StringLiteral, unescapeIdentifier(prop.name));
7216
+ getLiteralType( unescapeIdentifier(prop.name));
7220
7217
}
7221
7218
7222
7219
function getLiteralTypeFromPropertyNames(type: Type) {
@@ -7253,7 +7250,7 @@ namespace ts {
7253
7250
function getPropertyTypeForIndexType(objectType: Type, indexType: Type, accessNode: ElementAccessExpression | IndexedAccessTypeNode, cacheSymbol: boolean) {
7254
7251
const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? <ElementAccessExpression>accessNode : undefined;
7255
7252
const propName = indexType.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral | TypeFlags.EnumLiteral) ?
7256
- (<LiteralType>indexType).text :
7253
+ "" + (<LiteralType>indexType).value :
7257
7254
accessExpression && checkThatExpressionIsProperSymbolReference(accessExpression.argumentExpression, indexType, /*reportError*/ false) ?
7258
7255
getPropertyNameForKnownSymbolName((<Identifier>(<PropertyAccessExpression>accessExpression.argumentExpression).name).text) :
7259
7256
undefined;
@@ -7301,7 +7298,7 @@ namespace ts {
7301
7298
if (accessNode) {
7302
7299
const indexNode = accessNode.kind === SyntaxKind.ElementAccessExpression ? (<ElementAccessExpression>accessNode).argumentExpression : (<IndexedAccessTypeNode>accessNode).indexType;
7303
7300
if (indexType.flags & (TypeFlags.StringLiteral | TypeFlags.NumberLiteral)) {
7304
- error(indexNode, Diagnostics.Property_0_does_not_exist_on_type_1, (<LiteralType>indexType).text , typeToString(objectType));
7301
+ error(indexNode, Diagnostics.Property_0_does_not_exist_on_type_1, "" + (<LiteralType>indexType).value , typeToString(objectType));
7305
7302
}
7306
7303
else if (indexType.flags & (TypeFlags.String | TypeFlags.Number)) {
7307
7304
error(indexNode, Diagnostics.Type_0_has_no_matching_index_signature_for_type_1, typeToString(objectType), typeToString(indexType));
@@ -7512,16 +7509,16 @@ namespace ts {
7512
7509
return prop.flags & SymbolFlags.Method && find(prop.declarations, decl => isClassLike(decl.parent));
7513
7510
}
7514
7511
7515
- function createLiteralType(flags: TypeFlags, text : string) {
7512
+ function createLiteralType(flags: TypeFlags, value : string | number ) {
7516
7513
const type = <LiteralType>createType(flags);
7517
- type.text = text ;
7514
+ type.value = value ;
7518
7515
return type;
7519
7516
}
7520
7517
7521
7518
function getFreshTypeOfLiteralType(type: Type) {
7522
7519
if (type.flags & TypeFlags.StringOrNumberLiteral && !(type.flags & TypeFlags.FreshLiteral)) {
7523
7520
if (!(<LiteralType>type).freshType) {
7524
- const freshType = <LiteralType>createLiteralType(type.flags | TypeFlags.FreshLiteral, (<LiteralType>type).text );
7521
+ const freshType = <LiteralType>createLiteralType(type.flags | TypeFlags.FreshLiteral, (<LiteralType>type).value );
7525
7522
freshType.regularType = <LiteralType>type;
7526
7523
(<LiteralType>type).freshType = freshType;
7527
7524
}
@@ -7534,11 +7531,12 @@ namespace ts {
7534
7531
return type.flags & TypeFlags.StringOrNumberLiteral && type.flags & TypeFlags.FreshLiteral ? (<LiteralType>type).regularType : type;
7535
7532
}
7536
7533
7537
- function getLiteralTypeForText(flags: TypeFlags, text: string) {
7538
- const map = flags & TypeFlags.StringLiteral ? stringLiteralTypes : numericLiteralTypes;
7534
+ function getLiteralType(value: string | number) {
7535
+ const map = typeof value === "number" ? numericLiteralTypes : stringLiteralTypes;
7536
+ const text = "" + value;
7539
7537
let type = map.get(text);
7540
7538
if (!type) {
7541
- map.set(text, type = createLiteralType(flags, text ));
7539
+ map.set(text, type = createLiteralType(typeof value === "number" ? TypeFlags.NumberLiteral : TypeFlags.StringLiteral, value ));
7542
7540
}
7543
7541
return type;
7544
7542
}
@@ -8434,7 +8432,7 @@ namespace ts {
8434
8432
if ((source.flags & TypeFlags.Number | source.flags & TypeFlags.NumberLiteral) && target.flags & TypeFlags.EnumLike) return true;
8435
8433
if (source.flags & TypeFlags.EnumLiteral &&
8436
8434
target.flags & TypeFlags.EnumLiteral &&
8437
- (<EnumLiteralType>source).text === (<EnumLiteralType>target).text &&
8435
+ (<EnumLiteralType>source).value === (<EnumLiteralType>target).value &&
8438
8436
isEnumTypeRelatedTo((<EnumLiteralType>source).baseType, (<EnumLiteralType>target).baseType, errorReporter)) {
8439
8437
return true;
8440
8438
}
@@ -9713,8 +9711,8 @@ namespace ts {
9713
9711
// no flags for all other types (including non-falsy literal types).
9714
9712
function getFalsyFlags(type: Type): TypeFlags {
9715
9713
return type.flags & TypeFlags.Union ? getFalsyFlagsOfTypes((<UnionType>type).types) :
9716
- type.flags & TypeFlags.StringLiteral ? (<LiteralType>type).text === "" ? TypeFlags.StringLiteral : 0 :
9717
- type.flags & TypeFlags.NumberLiteral ? (<LiteralType>type).text === "0" ? TypeFlags.NumberLiteral : 0 :
9714
+ type.flags & TypeFlags.StringLiteral ? (<LiteralType>type).value === "" ? TypeFlags.StringLiteral : 0 :
9715
+ type.flags & TypeFlags.NumberLiteral ? (<LiteralType>type).value === 0 ? TypeFlags.NumberLiteral : 0 :
9718
9716
type.flags & TypeFlags.BooleanLiteral ? type === falseType ? TypeFlags.BooleanLiteral : 0 :
9719
9717
type.flags & TypeFlags.PossiblyFalsy;
9720
9718
}
@@ -10595,14 +10593,14 @@ namespace ts {
10595
10593
}
10596
10594
if (flags & TypeFlags.StringLiteral) {
10597
10595
return strictNullChecks ?
10598
- (<LiteralType>type).text === "" ? TypeFacts.EmptyStringStrictFacts : TypeFacts.NonEmptyStringStrictFacts :
10599
- (<LiteralType>type).text === "" ? TypeFacts.EmptyStringFacts : TypeFacts.NonEmptyStringFacts;
10596
+ (<LiteralType>type).value === "" ? TypeFacts.EmptyStringStrictFacts : TypeFacts.NonEmptyStringStrictFacts :
10597
+ (<LiteralType>type).value === "" ? TypeFacts.EmptyStringFacts : TypeFacts.NonEmptyStringFacts;
10600
10598
}
10601
10599
if (flags & (TypeFlags.Number | TypeFlags.Enum)) {
10602
10600
return strictNullChecks ? TypeFacts.NumberStrictFacts : TypeFacts.NumberFacts;
10603
10601
}
10604
10602
if (flags & (TypeFlags.NumberLiteral | TypeFlags.EnumLiteral)) {
10605
- const isZero = (<LiteralType>type).text === "0" ;
10603
+ const isZero = (<LiteralType>type).value === 0 ;
10606
10604
return strictNullChecks ?
10607
10605
isZero ? TypeFacts.ZeroStrictFacts : TypeFacts.NonZeroStrictFacts :
10608
10606
isZero ? TypeFacts.ZeroFacts : TypeFacts.NonZeroFacts;
@@ -13616,7 +13614,7 @@ namespace ts {
13616
13614
// <CustomTag> Hello World </CustomTag>
13617
13615
const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements);
13618
13616
if (intrinsicElementsType !== unknownType) {
13619
- const stringLiteralTypeName = (<LiteralType >elementType).text ;
13617
+ const stringLiteralTypeName = (<StringLiteralType >elementType).value ;
13620
13618
const intrinsicProp = getPropertyOfType(intrinsicElementsType, stringLiteralTypeName);
13621
13619
if (intrinsicProp) {
13622
13620
return getTypeOfSymbol(intrinsicProp);
@@ -14861,7 +14859,7 @@ namespace ts {
14861
14859
case SyntaxKind.Identifier:
14862
14860
case SyntaxKind.NumericLiteral:
14863
14861
case SyntaxKind.StringLiteral:
14864
- return getLiteralTypeForText(TypeFlags.StringLiteral, (<Identifier | LiteralExpression>element.name).text);
14862
+ return getLiteralType( (<Identifier | LiteralExpression>element.name).text);
14865
14863
14866
14864
case SyntaxKind.ComputedPropertyName:
14867
14865
const nameType = checkComputedPropertyName(<ComputedPropertyName>element.name);
@@ -16345,7 +16343,7 @@ namespace ts {
16345
16343
return silentNeverType;
16346
16344
}
16347
16345
if (node.operator === SyntaxKind.MinusToken && node.operand.kind === SyntaxKind.NumericLiteral) {
16348
- return getFreshTypeOfLiteralType(getLiteralTypeForText(TypeFlags.NumberLiteral, "" + -(<LiteralExpression>node.operand).text));
16346
+ return getFreshTypeOfLiteralType(getLiteralType( -(<LiteralExpression>node.operand).text));
16349
16347
}
16350
16348
switch (node.operator) {
16351
16349
case SyntaxKind.PlusToken:
@@ -17021,9 +17019,9 @@ namespace ts {
17021
17019
}
17022
17020
switch (node.kind) {
17023
17021
case SyntaxKind.StringLiteral:
17024
- return getFreshTypeOfLiteralType(getLiteralTypeForText(TypeFlags.StringLiteral, (<LiteralExpression>node).text));
17022
+ return getFreshTypeOfLiteralType(getLiteralType( (<LiteralExpression>node).text));
17025
17023
case SyntaxKind.NumericLiteral:
17026
- return getFreshTypeOfLiteralType(getLiteralTypeForText(TypeFlags.NumberLiteral, (<LiteralExpression>node).text));
17024
+ return getFreshTypeOfLiteralType(getLiteralType(+ (<LiteralExpression>node).text));
17027
17025
case SyntaxKind.TrueKeyword:
17028
17026
return trueType;
17029
17027
case SyntaxKind.FalseKeyword:
0 commit comments