Skip to content

Commit 5abd5b3

Browse files
committed
Refactor type resolution logic in getTypeOfSymbol for improved clarity and performance
1 parent 9f70c92 commit 5abd5b3

1 file changed

Lines changed: 12 additions & 21 deletions

File tree

src/compiler/checker.ts

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12282,32 +12282,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1228212282
}
1228312283

1228412284
function getTypeOfSymbol(symbol: Symbol): Type {
12285-
// Retrieve the check flags for the given symbol
1228612285
const checkFlags = getCheckFlags(symbol);
1228712286

12288-
// Define a mapping of flag checks to their respective type resolver functions
12289-
const typeResolvers: [number, (sym: Symbol) => Type][] = [
12290-
// Check for deferred type symbols
12291-
[CheckFlags.DeferredType, getTypeOfSymbolWithDeferredType], // Check for instantiated symbols
12292-
[CheckFlags.Instantiated, getTypeOfInstantiatedSymbol], // Check for mapped symbols (cast to MappedSymbol)
12293-
[CheckFlags.Mapped, sym => getTypeOfMappedSymbol(sym as MappedSymbol)], // Check for reverse-mapped symbols (cast to ReverseMappedSymbol)
12294-
[CheckFlags.ReverseMapped, sym => getTypeOfReverseMappedSymbol(sym as ReverseMappedSymbol)], // Check for variables and properties
12295-
[SymbolFlags.Variable | SymbolFlags.Property, getTypeOfVariableOrParameterOrProperty], // Check for functions, methods, classes, enums, and value modules
12296-
[SymbolFlags.Function | SymbolFlags.Method | SymbolFlags.Class | SymbolFlags.Enum | SymbolFlags.ValueModule, getTypeOfFuncClassEnumModule], // Check for enum members
12297-
[SymbolFlags.EnumMember, getTypeOfEnumMember], // Check for accessor symbols
12298-
[SymbolFlags.Accessor, getTypeOfAccessors], // Check for alias symbols
12299-
[SymbolFlags.Alias, getTypeOfAlias],
12287+
const typeResolvers: { flag: number; resolver: (sym: Symbol) => Type; }[] = [
12288+
{ flag: CheckFlags.DeferredType, resolver: getTypeOfSymbolWithDeferredType },
12289+
{ flag: CheckFlags.Instantiated, resolver: getTypeOfInstantiatedSymbol },
12290+
{ flag: CheckFlags.Mapped, resolver: sym => getTypeOfMappedSymbol(sym as MappedSymbol) },
12291+
{ flag: CheckFlags.ReverseMapped, resolver: sym => getTypeOfReverseMappedSymbol(sym as ReverseMappedSymbol) },
12292+
{ flag: SymbolFlags.Variable | SymbolFlags.Property, resolver: getTypeOfVariableOrParameterOrProperty },
12293+
{ flag: SymbolFlags.Function | SymbolFlags.Method | SymbolFlags.Class | SymbolFlags.Enum | SymbolFlags.ValueModule, resolver: getTypeOfFuncClassEnumModule },
12294+
{ flag: SymbolFlags.EnumMember, resolver: getTypeOfEnumMember },
12295+
{ flag: SymbolFlags.Accessor, resolver: getTypeOfAccessors },
12296+
{ flag: SymbolFlags.Alias, resolver: getTypeOfAlias },
1230012297
];
1230112298

12302-
// Iterate through the mapping and return the corresponding type if a flag matches
12303-
for (const [flag, resolver] of typeResolvers) {
12304-
if ((checkFlags & flag) || (symbol.flags & flag)) {
12305-
return resolver(symbol);
12306-
}
12307-
}
12299+
const matchedResolver = typeResolvers.find(({ flag }) => (checkFlags & flag) !== 0 || (symbol.flags & flag) !== 0);
1230812300

12309-
// Return the error type if no conditions match
12310-
return errorType;
12301+
return matchedResolver ? matchedResolver.resolver(symbol) : errorType;
1231112302
}
1231212303

1231312304
function getNonMissingTypeOfSymbol(symbol: Symbol) {

0 commit comments

Comments
 (0)