Skip to content

Commit f66df9c

Browse files
committed
Workspace symbols to load more projects
1 parent 50ae3c2 commit f66df9c

File tree

5 files changed

+65
-18
lines changed

5 files changed

+65
-18
lines changed

internal/lsp/server.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,11 +1146,10 @@ func (s *Server) handleDocumentOnTypeFormat(ctx context.Context, ls *ls.Language
11461146
}
11471147

11481148
func (s *Server) handleWorkspaceSymbol(ctx context.Context, params *lsproto.WorkspaceSymbolParams, reqMsg *lsproto.RequestMessage) (lsproto.WorkspaceSymbolResponse, error) {
1149-
snapshot, release := s.session.Snapshot()
1150-
defer release()
1149+
snapshot := s.session.GetSnapshotLoadingProjectTree(ctx, nil)
11511150
defer s.recover(reqMsg)
1151+
11521152
programs := core.Map(snapshot.ProjectCollection.Projects(), (*project.Project).GetProgram)
1153-
// !!! sheetal: additional projects that can be loaded but were delayed
11541153
return ls.ProvideWorkspaceSymbols(ctx, programs, snapshot.Converters(), params.Query)
11551154
}
11561155

internal/project/projectcollectionbuilder.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,9 @@ func (b *ProjectCollectionBuilder) DidRequestProjectTrees(projectsReferenced map
442442
// If this project has potential project reference for any of the project we are loading ancestor tree for
443443
// load this project first
444444
if project := entry.Value(); project != nil && project.forEachPotentialProjectReference(func(p tspath.Path) bool {
445+
if projectsReferenced == nil {
446+
return true
447+
}
445448
_, isReferenced := projectsReferenced[p]
446449
return isReferenced
447450
}) {
@@ -491,11 +494,11 @@ func (b *ProjectCollectionBuilder) ensureProjectTree(
491494
}
492495
for _, childConfig := range children {
493496
wg.Queue(func() {
494-
if !program.ForEachResolvedProjectReferenceInChildConfig(
497+
if projectsReferenced != nil && !program.ForEachResolvedProjectReferenceInChildConfig(
495498
childConfig,
496499
func(referencePath tspath.Path, config *tsoptions.ParsedCommandLine, _ *tsoptions.ParsedCommandLine, _ int) bool {
497-
_, ok := projectsReferenced[referencePath]
498-
return ok
500+
_, isReferenced := projectsReferenced[referencePath]
501+
return isReferenced
499502
}) {
500503
return
501504
}

internal/project/session.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -487,21 +487,29 @@ func (s *Session) projectContainsFile(project *Project, uri lsproto.DocumentUri)
487487
return project.containsFile(path)
488488
}
489489

490-
func (s *Session) ForEachProjectLocationLoadingProjectTree(
490+
func (s *Session) GetSnapshotLoadingProjectTree(
491491
ctx context.Context,
492+
// If null, all project trees need to be loaded, otherwise only those that are referenced
492493
requestedProjectTrees map[tspath.Path]struct{},
493-
defaultDefinition *ls.NonLocalDefinition,
494-
canIterateProject func(project *Project) bool,
495-
handleLocation func(*Project, lsproto.DocumentUri, lsproto.Position),
496-
) error {
494+
) *Snapshot {
497495
snapshot := s.getSnapshot(
498496
ctx,
499-
snapshotChangeRequest{requestedProjectTrees: requestedProjectTrees},
497+
snapshotChangeRequest{requestedProjectTrees: &projectTreeRequest{requestedProjectTrees}},
500498
func(snapshot *Snapshot, updatedSnapshot bool) UpdateReason {
501499
return core.IfElse(!updatedSnapshot, UpdateReasonRequestedLoadProjectTree, UpdateReasonUnknown)
502500
},
503501
)
504-
for _, project := range snapshot.ProjectCollection.Projects() {
502+
return snapshot
503+
}
504+
505+
func (s *Session) ForEachProjectLocationLoadingProjectTree(
506+
ctx context.Context,
507+
requestedProjectTrees map[tspath.Path]struct{},
508+
defaultDefinition *ls.NonLocalDefinition,
509+
canIterateProject func(project *Project) bool,
510+
handleLocation func(*Project, lsproto.DocumentUri, lsproto.Position),
511+
) error {
512+
for _, project := range s.GetSnapshotLoadingProjectTree(ctx, requestedProjectTrees).ProjectCollection.Projects() {
505513
if ctx.Err() != nil {
506514
return ctx.Err()
507515
}

internal/project/snapshot.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,11 @@ type APISnapshotRequest struct {
136136
UpdateProjects *collections.Set[tspath.Path]
137137
}
138138

139+
type projectTreeRequest struct {
140+
// If null, all project trees need to be loaded, otherwise only those that are referenced
141+
referencedProjects map[tspath.Path]struct{}
142+
}
143+
139144
type snapshotChangeRequest struct {
140145
// requestedURIs are URIs that were requested by the client.
141146
// The new snapshot should ensure projects for these URIs have loaded programs.
@@ -150,7 +155,7 @@ type snapshotChangeRequest struct {
150155
// Update and ensure project trees that reference the projects
151156
// This is used to compute the solution and project tree so that
152157
// we can find references across all the projects in the solution irrespective of which project is open
153-
requestedProjectTrees map[tspath.Path]struct{}
158+
requestedProjectTrees *projectTreeRequest
154159
}
155160

156161
type SnapshotChange struct {
@@ -213,8 +218,8 @@ func (s *Snapshot) Clone(ctx context.Context, change SnapshotChange, overlays ma
213218
if len(change.ensureDefaultProjectForURIs) != 0 {
214219
details += fmt.Sprintf(" ensureDefaultProjectForURIs: %v", change.ensureDefaultProjectForURIs)
215220
}
216-
if len(change.requestedProjectTrees) != 0 {
217-
details += fmt.Sprintf(" requestedProjectTrees: %v", maps.Keys(change.requestedProjectTrees))
221+
if change.requestedProjectTrees != nil {
222+
details += fmt.Sprintf(" requestedProjectTrees: %v", maps.Keys(change.requestedProjectTrees.referencedProjects))
218223
}
219224
return details
220225
}
@@ -299,8 +304,8 @@ func (s *Snapshot) Clone(ctx context.Context, change SnapshotChange, overlays ma
299304
projectCollectionBuilder.DidRequestEnsureDefaultProject(uri, logger.Fork("DidRequestFile"))
300305
}
301306

302-
if len(change.requestedProjectTrees) != 0 {
303-
projectCollectionBuilder.DidRequestProjectTrees(change.requestedProjectTrees, logger.Fork("DidRequestProjectTrees"))
307+
if change.requestedProjectTrees != nil {
308+
projectCollectionBuilder.DidRequestProjectTrees(change.requestedProjectTrees.referencedProjects, logger.Fork("DidRequestProjectTrees"))
304309
}
305310

306311
projectCollection, configFileRegistry := projectCollectionBuilder.Finalize(logger)

testdata/baselines/reference/lspservertests/declarationMaps/workspace-symbols.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,30 @@ Config File Names::
107107
"query": "fn"
108108
}
109109
}
110+
Projects::
111+
[/home/src/projects/project/a/tsconfig.json] *new*
112+
/home/src/projects/project/a/a.ts
113+
[/home/src/projects/project/b/tsconfig.json] *new*
114+
/home/src/projects/project/b/b.ts
115+
/home/src/projects/project/b/c.ts
116+
[/home/src/projects/project/user/tsconfig.json]
117+
/home/src/projects/project/a/a.ts
118+
/home/src/projects/project/b/b.ts
119+
/home/src/projects/project/user/user.ts
120+
Config::
121+
[/home/src/projects/project/a/tsconfig.json] *modified*
122+
RetainingProjects: *modified*
123+
/home/src/projects/project/a/tsconfig.json *new*
124+
/home/src/projects/project/user/tsconfig.json
125+
[/home/src/projects/project/b/tsconfig.json] *modified*
126+
RetainingProjects: *modified*
127+
/home/src/projects/project/b/tsconfig.json *new*
128+
/home/src/projects/project/user/tsconfig.json
129+
[/home/src/projects/project/user/tsconfig.json]
130+
RetainingProjects:
131+
/home/src/projects/project/user/tsconfig.json
132+
RetainingOpenFiles:
133+
/home/src/projects/project/user/user.ts
110134
// === /home/src/projects/project/a/a.ts ===
111135
// export function [|{| name: fnA, kind: function |}fnA|]() {}
112136
// export interface IfaceA {}
@@ -115,6 +139,9 @@ Config File Names::
115139
// === /home/src/projects/project/b/b.ts ===
116140
// export function [|{| name: fnB, kind: function |}fnB|]() {}
117141

142+
// === /home/src/projects/project/b/c.ts ===
143+
// export function [|{| name: fnC, kind: function |}fnC|]() {}
144+
118145
// === /home/src/projects/project/user/user.ts ===
119146
// import * as a from "../a/a";
120147
// import * as b from "../b/b";
@@ -145,6 +172,11 @@ Open Files::
145172
}
146173
}
147174
Projects::
175+
[/home/src/projects/project/a/tsconfig.json] *deleted*
176+
/home/src/projects/project/a/a.ts
177+
[/home/src/projects/project/b/tsconfig.json] *deleted*
178+
/home/src/projects/project/b/b.ts
179+
/home/src/projects/project/b/c.ts
148180
[/home/src/projects/project/dummy/tsconfig.json] *new*
149181
/home/src/projects/project/dummy/dummy.ts
150182
[/home/src/projects/project/user/tsconfig.json] *deleted*

0 commit comments

Comments
 (0)