Skip to content

Commit b9b5d16

Browse files
authored
Add friendly name to intrinsics in debug helpers (#55554)
1 parent 4c34a18 commit b9b5d16

File tree

3 files changed

+32
-19
lines changed

3 files changed

+32
-19
lines changed

src/compiler/checker.ts

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1915,29 +1915,31 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
19151915
// unions such that they are given low type IDs and occur first in the sorted list of union constituents.
19161916
// We can then just examine the first constituent(s) of a union to check for their presence.
19171917

1918+
var seenIntrinsicNames = new Set<string>();
1919+
19181920
var anyType = createIntrinsicType(TypeFlags.Any, "any");
1919-
var autoType = createIntrinsicType(TypeFlags.Any, "any", ObjectFlags.NonInferrableType);
1920-
var wildcardType = createIntrinsicType(TypeFlags.Any, "any");
1921-
var blockedStringType = createIntrinsicType(TypeFlags.Any, "any");
1921+
var autoType = createIntrinsicType(TypeFlags.Any, "any", ObjectFlags.NonInferrableType, "auto");
1922+
var wildcardType = createIntrinsicType(TypeFlags.Any, "any", /*objectFlags*/ undefined, "wildcard");
1923+
var blockedStringType = createIntrinsicType(TypeFlags.Any, "any", /*objectFlags*/ undefined, "blocked string");
19221924
var errorType = createIntrinsicType(TypeFlags.Any, "error");
19231925
var unresolvedType = createIntrinsicType(TypeFlags.Any, "unresolved");
1924-
var nonInferrableAnyType = createIntrinsicType(TypeFlags.Any, "any", ObjectFlags.ContainsWideningType);
1926+
var nonInferrableAnyType = createIntrinsicType(TypeFlags.Any, "any", ObjectFlags.ContainsWideningType, "non-inferrable");
19251927
var intrinsicMarkerType = createIntrinsicType(TypeFlags.Any, "intrinsic");
19261928
var unknownType = createIntrinsicType(TypeFlags.Unknown, "unknown");
1927-
var nonNullUnknownType = createIntrinsicType(TypeFlags.Unknown, "unknown");
1929+
var nonNullUnknownType = createIntrinsicType(TypeFlags.Unknown, "unknown", /*objectFlags*/ undefined, "non-null");
19281930
var undefinedType = createIntrinsicType(TypeFlags.Undefined, "undefined");
1929-
var undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(TypeFlags.Undefined, "undefined", ObjectFlags.ContainsWideningType);
1930-
var missingType = createIntrinsicType(TypeFlags.Undefined, "undefined");
1931+
var undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(TypeFlags.Undefined, "undefined", ObjectFlags.ContainsWideningType, "widening");
1932+
var missingType = createIntrinsicType(TypeFlags.Undefined, "undefined", /*objectFlags*/ undefined, "missing");
19311933
var undefinedOrMissingType = exactOptionalPropertyTypes ? missingType : undefinedType;
1932-
var optionalType = createIntrinsicType(TypeFlags.Undefined, "undefined");
1934+
var optionalType = createIntrinsicType(TypeFlags.Undefined, "undefined", /*objectFlags*/ undefined, "optional");
19331935
var nullType = createIntrinsicType(TypeFlags.Null, "null");
1934-
var nullWideningType = strictNullChecks ? nullType : createIntrinsicType(TypeFlags.Null, "null", ObjectFlags.ContainsWideningType);
1936+
var nullWideningType = strictNullChecks ? nullType : createIntrinsicType(TypeFlags.Null, "null", ObjectFlags.ContainsWideningType, "widening");
19351937
var stringType = createIntrinsicType(TypeFlags.String, "string");
19361938
var numberType = createIntrinsicType(TypeFlags.Number, "number");
19371939
var bigintType = createIntrinsicType(TypeFlags.BigInt, "bigint");
1938-
var falseType = createIntrinsicType(TypeFlags.BooleanLiteral, "false") as FreshableIntrinsicType;
1940+
var falseType = createIntrinsicType(TypeFlags.BooleanLiteral, "false", /*objectFlags*/ undefined, "fresh") as FreshableIntrinsicType;
19391941
var regularFalseType = createIntrinsicType(TypeFlags.BooleanLiteral, "false") as FreshableIntrinsicType;
1940-
var trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true") as FreshableIntrinsicType;
1942+
var trueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true", /*objectFlags*/ undefined, "fresh") as FreshableIntrinsicType;
19411943
var regularTrueType = createIntrinsicType(TypeFlags.BooleanLiteral, "true") as FreshableIntrinsicType;
19421944
trueType.regularType = regularTrueType;
19431945
trueType.freshType = trueType;
@@ -1951,9 +1953,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
19511953
var esSymbolType = createIntrinsicType(TypeFlags.ESSymbol, "symbol");
19521954
var voidType = createIntrinsicType(TypeFlags.Void, "void");
19531955
var neverType = createIntrinsicType(TypeFlags.Never, "never");
1954-
var silentNeverType = createIntrinsicType(TypeFlags.Never, "never", ObjectFlags.NonInferrableType);
1955-
var implicitNeverType = createIntrinsicType(TypeFlags.Never, "never");
1956-
var unreachableNeverType = createIntrinsicType(TypeFlags.Never, "never");
1956+
var silentNeverType = createIntrinsicType(TypeFlags.Never, "never", ObjectFlags.NonInferrableType, "silent");
1957+
var implicitNeverType = createIntrinsicType(TypeFlags.Never, "never", /*objectFlags*/ undefined, "implicit");
1958+
var unreachableNeverType = createIntrinsicType(TypeFlags.Never, "never", /*objectFlags*/ undefined, "unreachable");
19571959
var nonPrimitiveType = createIntrinsicType(TypeFlags.NonPrimitive, "object");
19581960
var stringOrNumberType = getUnionType([stringType, numberType]);
19591961
var stringNumberSymbolType = getUnionType([stringType, numberType, esSymbolType]);
@@ -1964,7 +1966,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
19641966

19651967
var restrictiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? getRestrictiveTypeParameter(t as TypeParameter) : t, () => "(restrictive mapper)");
19661968
var permissiveMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? wildcardType : t, () => "(permissive mapper)");
1967-
var uniqueLiteralType = createIntrinsicType(TypeFlags.Never, "never"); // `uniqueLiteralType` is a special `never` flagged by union reduction to behave as a literal
1969+
var uniqueLiteralType = createIntrinsicType(TypeFlags.Never, "never", /*objectFlags*/ undefined, "unique literal"); // `uniqueLiteralType` is a special `never` flagged by union reduction to behave as a literal
19681970
var uniqueLiteralMapper: TypeMapper = makeFunctionTypeMapper(t => t.flags & TypeFlags.TypeParameter ? uniqueLiteralType : t, () => "(unique literal mapper)"); // replace all type parameters with the unique literal type (disregarding constraints)
19691971
var outofbandVarianceMarkerHandler: ((onlyUnreliable: boolean) => void) | undefined;
19701972
var reportUnreliableMapper = makeFunctionTypeMapper(t => {
@@ -5680,13 +5682,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
56805682
return new Type(checker, flags);
56815683
}
56825684

5683-
function createIntrinsicType(kind: TypeFlags, intrinsicName: string, objectFlags = ObjectFlags.None): IntrinsicType {
5685+
function createIntrinsicType(kind: TypeFlags, intrinsicName: string, objectFlags = ObjectFlags.None, debugIntrinsicName?: string): IntrinsicType {
5686+
checkIntrinsicName(intrinsicName, debugIntrinsicName);
56845687
const type = createType(kind) as IntrinsicType;
56855688
type.intrinsicName = intrinsicName;
5689+
type.debugIntrinsicName = debugIntrinsicName;
56865690
type.objectFlags = objectFlags | ObjectFlags.CouldContainTypeVariablesComputed | ObjectFlags.IsGenericTypeComputed | ObjectFlags.IsUnknownLikeUnionComputed | ObjectFlags.IsNeverIntersectionComputed;
56875691
return type;
56885692
}
56895693

5694+
function checkIntrinsicName(name: string, debug: string | undefined) {
5695+
const key = `${name},${debug ?? ""}`;
5696+
if (seenIntrinsicNames.has(key)) {
5697+
Debug.fail(`Duplicate intrinsic type name ${name}${debug ? ` (${debug})` : ""}; you may need to pass a name to createIntrinsicType.`);
5698+
}
5699+
seenIntrinsicNames.add(key);
5700+
}
5701+
56905702
function createObjectType(objectFlags: ObjectFlags, symbol?: Symbol): ObjectType {
56915703
const type = createTypeWithSymbol(TypeFlags.Object, symbol!) as ObjectType;
56925704
type.objectFlags = objectFlags;
@@ -15660,7 +15672,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1566015672
const id = getAliasId(symbol, typeArguments);
1566115673
let errorType = errorTypes.get(id);
1566215674
if (!errorType) {
15663-
errorType = createIntrinsicType(TypeFlags.Any, "error");
15675+
errorType = createIntrinsicType(TypeFlags.Any, "error", /*objectFlags*/ undefined, `alias ${id}`);
1566415676
errorType.aliasSymbol = symbol;
1566515677
errorType.aliasTypeArguments = typeArguments;
1566615678
errorTypes.set(id, errorType);

src/compiler/debug.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,12 +633,12 @@ export namespace Debug {
633633
// for use with vscode-js-debug's new customDescriptionGenerator in launch.json
634634
__tsDebuggerDisplay: {
635635
value(this: Type) {
636-
const typeHeader = this.flags & TypeFlags.Nullable ? "NullableType" :
636+
const typeHeader = this.flags & TypeFlags.Intrinsic ? `IntrinsicType ${(this as IntrinsicType).intrinsicName}${(this as IntrinsicType).debugIntrinsicName ? ` (${(this as IntrinsicType).debugIntrinsicName})` : ""}` :
637+
this.flags & TypeFlags.Nullable ? "NullableType" :
637638
this.flags & TypeFlags.StringOrNumberLiteral ? `LiteralType ${JSON.stringify((this as LiteralType).value)}` :
638639
this.flags & TypeFlags.BigIntLiteral ? `LiteralType ${(this as BigIntLiteralType).value.negative ? "-" : ""}${(this as BigIntLiteralType).value.base10Value}n` :
639640
this.flags & TypeFlags.UniqueESSymbol ? "UniqueESSymbolType" :
640641
this.flags & TypeFlags.Enum ? "EnumType" :
641-
this.flags & TypeFlags.Intrinsic ? `IntrinsicType ${(this as IntrinsicType).intrinsicName}` :
642642
this.flags & TypeFlags.Union ? "UnionType" :
643643
this.flags & TypeFlags.Intersection ? "IntersectionType" :
644644
this.flags & TypeFlags.Index ? "IndexType" :

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6119,6 +6119,7 @@ export interface Type {
61196119
// Intrinsic types (TypeFlags.Intrinsic)
61206120
export interface IntrinsicType extends Type {
61216121
intrinsicName: string; // Name of intrinsic type
6122+
debugIntrinsicName: string | undefined;
61226123
objectFlags: ObjectFlags;
61236124
}
61246125

0 commit comments

Comments
 (0)