@@ -487,6 +487,8 @@ type Checker struct {
487487 host CompilerHost
488488 compilerOptions *core.CompilerOptions
489489 files []*ast.SourceFile
490+ fileIndexMap map[*ast.SourceFile]int
491+ compareSymbols func(*ast.Symbol, *ast.Symbol) int
490492 typeCount uint32
491493 symbolCount uint32
492494 totalInstantiationCount uint32
@@ -733,6 +735,8 @@ func NewChecker(program *Program) *Checker {
733735 c.host = program.host
734736 c.compilerOptions = program.compilerOptions
735737 c.files = program.files
738+ c.fileIndexMap = createFileIndexMap(c.files)
739+ c.compareSymbols = c.compareSymbolsWorker // Closure optimization
736740 c.languageVersion = c.compilerOptions.GetEmitScriptTarget()
737741 c.moduleKind = c.compilerOptions.GetEmitModuleKind()
738742 c.legacyDecorators = c.compilerOptions.ExperimentalDecorators == core.TSTrue
@@ -863,7 +867,7 @@ func NewChecker(program *Program) *Checker {
863867 c.emptyStringType = c.getStringLiteralType("")
864868 c.zeroType = c.getNumberLiteralType(0)
865869 c.zeroBigIntType = c.getBigIntLiteralType(PseudoBigInt{negative: false, base10Value: "0"})
866- c.typeofType = c.getUnionType(core.Map(slices.Collect (maps.Keys(typeofNEFacts)), c.getStringLiteralType))
870+ c.typeofType = c.getUnionType(core.Map(slices.Sorted (maps.Keys(typeofNEFacts)), c.getStringLiteralType))
867871 c.flowLoopCache = make(map[FlowLoopKey]*Type)
868872 c.flowNodeReachable = make(map[*ast.FlowNode]bool)
869873 c.flowNodePostSuper = make(map[*ast.FlowNode]bool)
@@ -904,6 +908,14 @@ func NewChecker(program *Program) *Checker {
904908 return c
905909}
906910
911+ func createFileIndexMap(files []*ast.SourceFile) map[*ast.SourceFile]int {
912+ result := make(map[*ast.SourceFile]int, len(files))
913+ for i, file := range files {
914+ result[file] = i
915+ }
916+ return result
917+ }
918+
907919func (c *Checker) reportUnreliableWorker(t *Type) *Type {
908920 if c.outofbandVarianceMarkerHandler != nil && (t == c.markerSuperType || t == c.markerSubType || t == c.markerOtherType) {
909921 c.outofbandVarianceMarkerHandler(true /*onlyUnreliable*/)
@@ -15110,7 +15122,7 @@ func (c *Checker) getNamedMembers(members ast.SymbolTable) []*ast.Symbol {
1511015122 result = append(result, symbol)
1511115123 }
1511215124 }
15113- sortSymbols(result)
15125+ c. sortSymbols(result)
1511415126 return result
1511515127}
1511615128
@@ -17862,6 +17874,7 @@ func (c *Checker) newType(flags TypeFlags, objectFlags ObjectFlags, data TypeDat
1786217874 t.flags = flags
1786317875 t.objectFlags = objectFlags &^ (ObjectFlagsCouldContainTypeVariablesComputed | ObjectFlagsCouldContainTypeVariables | ObjectFlagsMembersResolved)
1786417876 t.id = TypeId(c.typeCount)
17877+ t.checker = c
1786517878 t.data = data
1786617879 return t
1786717880}
@@ -18602,14 +18615,7 @@ func (c *Checker) addTypeToUnion(typeSet []*Type, includes TypeFlags, t *Type) (
1860218615 includes |= TypeFlagsIncludesNonWideningType
1860318616 }
1860418617 } else {
18605- var index int
18606- var ok bool
18607- if len(typeSet) != 0 && t.id > typeSet[len(typeSet)-1].id {
18608- index = len(typeSet)
18609- } else {
18610- index, ok = slices.BinarySearchFunc(typeSet, t, compareTypeIds)
18611- }
18612- if !ok {
18618+ if index, ok := slices.BinarySearchFunc(typeSet, t, compareTypes); !ok {
1861318619 typeSet = slices.Insert(typeSet, index, t)
1861418620 }
1861518621 }
@@ -19351,12 +19357,12 @@ func (c *Checker) removeType(t *Type, targetType *Type) *Type {
1935119357}
1935219358
1935319359func containsType(types []*Type, t *Type) bool {
19354- _, ok := slices.BinarySearchFunc(types, t, compareTypeIds )
19360+ _, ok := slices.BinarySearchFunc(types, t, compareTypes )
1935519361 return ok
1935619362}
1935719363
1935819364func insertType(types []*Type, t *Type) ([]*Type, bool) {
19359- if i, ok := slices.BinarySearchFunc(types, t, compareTypeIds ); !ok {
19365+ if i, ok := slices.BinarySearchFunc(types, t, compareTypes ); !ok {
1936019366 return slices.Insert(types, i, t), true
1936119367 }
1936219368 return types, false
0 commit comments