@@ -38,9 +38,11 @@ type ProjectCollectionBuilder struct {
3838
3939 newSnapshotID uint64
4040 programStructureChanged bool
41- fileDefaultProjects map [tspath.Path ]tspath.Path
42- configuredProjects * dirty.SyncMap [tspath.Path , * Project ]
43- inferredProject * dirty.Box [* Project ]
41+
42+ fileDefaultProjects map [tspath.Path ]tspath.Path
43+ configuredProjects * dirty.SyncMap [tspath.Path , * Project ]
44+ inferredProject * dirty.Box [* Project ]
45+ openedFiles * dirty.Set [tspath.Path ]
4446
4547 apiOpenedProjects map [tspath.Path ]struct {}
4648}
@@ -69,6 +71,7 @@ func newProjectCollectionBuilder(
6971 newSnapshotID : newSnapshotID ,
7072 configuredProjects : dirty .NewSyncMap (oldProjectCollection .configuredProjects , nil ),
7173 inferredProject : dirty .NewBox (oldProjectCollection .inferredProject ),
74+ openedFiles : dirty .NewSet (oldProjectCollection .openedFiles ),
7275 apiOpenedProjects : maps .Clone (oldAPIOpenedProjects ),
7376 }
7477}
@@ -98,6 +101,11 @@ func (b *ProjectCollectionBuilder) Finalize(logger *logging.LogTree) (*ProjectCo
98101 newProjectCollection .inferredProject = newInferredProject
99102 }
100103
104+ if openedFiles , openedFilesChanged := b .openedFiles .Finalize (); openedFilesChanged {
105+ ensureCloned ()
106+ newProjectCollection .openedFiles = openedFiles
107+ }
108+
101109 configFileRegistry := b .configFileRegistryBuilder .Finalize ()
102110 newProjectCollection .configFileRegistry = configFileRegistry
103111 return newProjectCollection , configFileRegistry
@@ -174,6 +182,7 @@ func (b *ProjectCollectionBuilder) DidChangeFiles(summary FileChangeSummary, log
174182 if fh := b .fs .GetFileByPath (fileName , path ); fh == nil || fh .Hash () != hash {
175183 changedFiles = append (changedFiles , path )
176184 }
185+ b .openedFiles .Delete (path )
177186 }
178187 for uri := range summary .Changed .Keys () {
179188 fileName := uri .FileName ()
@@ -242,8 +251,9 @@ func (b *ProjectCollectionBuilder) DidChangeFiles(summary FileChangeSummary, log
242251 if summary .Opened != "" {
243252 fileName := summary .Opened .FileName ()
244253 path := b .toPath (fileName )
254+ b .openedFiles .Add (path )
245255 var toRemoveProjects collections.Set [tspath.Path ]
246- openFileResult := b .ensureConfiguredProjectAndAncestorsForOpenFile (fileName , path , logger )
256+ openFileResult := b .ensureConfiguredProjectAndAncestorsForFile (fileName , path , logger )
247257 b .configuredProjects .Range (func (entry * dirty.SyncMapEntry [tspath.Path , * Project ]) bool {
248258 toRemoveProjects .Add (entry .Value ().configFilePath )
249259 b .updateProgram (entry , logger )
@@ -357,6 +367,23 @@ func (b *ProjectCollectionBuilder) DidRequestProject(projectId tspath.Path, logg
357367 }
358368}
359369
370+ func (b * ProjectCollectionBuilder ) DidRequestEnsureDefaultProject (uri lsproto.DocumentUri , logger * logging.LogTree ) {
371+ fileName := uri .FileName ()
372+ path := b .toPath (fileName )
373+ if b .openedFiles .Has (path ) {
374+ b .DidRequestFile (uri , logger )
375+ return
376+ }
377+
378+ startTime := time .Now ()
379+ b .ensureConfiguredProjectAndAncestorsForFile (fileName , path , logger )
380+
381+ if logger != nil {
382+ elapsed := time .Since (startTime )
383+ logger .Log (fmt .Sprintf ("Completed file request for %s in %v" , fileName , elapsed ))
384+ }
385+ }
386+
360387func (b * ProjectCollectionBuilder ) DidUpdateATAState (ataChanges map [tspath.Path ]* ATAStateChange , logger * logging.LogTree ) {
361388 updateProject := func (project dirty.Value [* Project ], ataChange * ATAStateChange ) {
362389 project .ChangeIf (
@@ -427,7 +454,7 @@ func (b *ProjectCollectionBuilder) markProjectsAffectedByConfigChanges(
427454 var hasChanges bool
428455 for path := range configChangeResult .affectedFiles {
429456 fileName := b .fs .overlays [path ].FileName ()
430- _ = b .ensureConfiguredProjectAndAncestorsForOpenFile (fileName , path , logger )
457+ _ = b .ensureConfiguredProjectAndAncestorsForFile (fileName , path , logger )
431458 hasChanges = true
432459 }
433460
@@ -468,17 +495,17 @@ func (b *ProjectCollectionBuilder) findDefaultConfiguredProject(fileName string,
468495 })
469496
470497 if multipleCandidates {
471- if p := b .findOrCreateDefaultConfiguredProjectForOpenScriptInfo (fileName , path , projectLoadKindFind , nil ).project ; p != nil {
498+ if p := b .findOrCreateDefaultConfiguredProjectForFile (fileName , path , projectLoadKindFind , nil ).project ; p != nil {
472499 return p
473500 }
474501 }
475502
476503 return configuredProjects [project ]
477504}
478505
479- func (b * ProjectCollectionBuilder ) ensureConfiguredProjectAndAncestorsForOpenFile (fileName string , path tspath.Path , logger * logging.LogTree ) searchResult {
480- result := b .findOrCreateDefaultConfiguredProjectForOpenScriptInfo (fileName , path , projectLoadKindCreate , logger )
481- if result .project != nil {
506+ func (b * ProjectCollectionBuilder ) ensureConfiguredProjectAndAncestorsForFile (fileName string , path tspath.Path , logger * logging.LogTree ) searchResult {
507+ result := b .findOrCreateDefaultConfiguredProjectForFile (fileName , path , projectLoadKindCreate , logger )
508+ if result .project != nil && b . openedFiles . Has ( path ) {
482509 // !!! sheetal todo this later
483510 // // Create ancestor tree for findAllRefs (dont load them right away)
484511 // forEachAncestorProjectLoad(
@@ -672,7 +699,7 @@ func (b *ProjectCollectionBuilder) findOrCreateDefaultConfiguredProjectWorker(
672699 return searchResult {retain : retain }
673700}
674701
675- func (b * ProjectCollectionBuilder ) findOrCreateDefaultConfiguredProjectForOpenScriptInfo (
702+ func (b * ProjectCollectionBuilder ) findOrCreateDefaultConfiguredProjectForFile (
676703 fileName string ,
677704 path tspath.Path ,
678705 loadKind projectLoadKind ,
0 commit comments