Skip to content

Commit 9f5c057

Browse files
authored
fix(lsp): use unique ids for program entries (#27)
1 parent 1ee1272 commit 9f5c057

1 file changed

Lines changed: 34 additions & 12 deletions

File tree

internal/lsp/server.go

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,20 +1254,26 @@ type DenoCrossProjectOrchestrator struct {
12541254
ctx context.Context
12551255
defaultProgramEntry *DenoProgramEntry
12561256
defaultHost *DenoLanguageServiceHost
1257+
initialUri lsproto.DocumentUri
12571258
}
12581259

12591260
func (o *DenoCrossProjectOrchestrator) GetDefaultProject() ls.Project {
12601261
return DenoLanguageServiceProject{programEntry: o.defaultProgramEntry}
12611262
}
12621263

12631264
func (o *DenoCrossProjectOrchestrator) GetAllProjectsForInitialRequest() []ls.Project {
1265+
fileName := o.initialUri.FileName()
12641266
entries := o.server.deno.programEntries
1265-
projects := make([]ls.Project, 0, len(entries.byCompilerOptionsKey)+len(entries.byNotebookUri))
1267+
var projects []ls.Project
12661268
for _, pe := range entries.byCompilerOptionsKey {
1267-
projects = append(projects, DenoLanguageServiceProject{programEntry: pe})
1269+
if (DenoLanguageServiceProject{programEntry: pe}).HasFile(fileName) {
1270+
projects = append(projects, DenoLanguageServiceProject{programEntry: pe})
1271+
}
12681272
}
12691273
for _, pe := range entries.byNotebookUri {
1270-
projects = append(projects, DenoLanguageServiceProject{programEntry: pe})
1274+
if (DenoLanguageServiceProject{programEntry: pe}).HasFile(fileName) {
1275+
projects = append(projects, DenoLanguageServiceProject{programEntry: pe})
1276+
}
12711277
}
12721278
return projects
12731279
}
@@ -1397,7 +1403,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
13971403
}
13981404
if params.Request.LanguageServiceMethod != nil {
13991405
req := params.Request.LanguageServiceMethod
1400-
_, languageService, orchestrator, err := s.getDenoLanguageService(ctx, req.CompilerOptionsKey, req.NotebookUri)
1406+
pe, languageService, err := s.getDenoLanguageService(req.CompilerOptionsKey, req.NotebookUri)
14011407
if err != nil {
14021408
return nil, err
14031409
}
@@ -1413,6 +1419,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
14131419
case "ProvideReferences":
14141420
var p0 lsproto.ReferenceParams
14151421
unmarshalArg(req.Args[0], &p0)
1422+
orchestrator := s.getDenoCrossProjectOrchestrator(ctx, pe, p0.TextDocument.Uri)
14161423
return languageService.ProvideReferences(ctx, &p0, orchestrator)
14171424
case "ProvideCodeLenses":
14181425
var p0 lsproto.DocumentUri
@@ -1465,6 +1472,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
14651472
case "ProvideImplementations":
14661473
var p0 lsproto.ImplementationParams
14671474
unmarshalArg(req.Args[0], &p0)
1475+
orchestrator := s.getDenoCrossProjectOrchestrator(ctx, pe, p0.TextDocument.Uri)
14681476
return languageService.ProvideImplementations(ctx, &p0, orchestrator)
14691477
case "ProvideFoldingRange":
14701478
var p0 lsproto.DocumentUri
@@ -1473,6 +1481,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
14731481
case "ProvideCallHierarchyIncomingCalls":
14741482
var p0 lsproto.CallHierarchyItem
14751483
unmarshalArg(req.Args[0], &p0)
1484+
orchestrator := s.getDenoCrossProjectOrchestrator(ctx, pe, p0.Uri)
14761485
return languageService.ProvideCallHierarchyIncomingCalls(ctx, &p0, orchestrator)
14771486
case "ProvideCallHierarchyOutgoingCalls":
14781487
var p0 lsproto.CallHierarchyItem
@@ -1487,6 +1496,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
14871496
case "ProvideRename":
14881497
var p0 lsproto.RenameParams
14891498
unmarshalArg(req.Args[0], &p0)
1499+
orchestrator := s.getDenoCrossProjectOrchestrator(ctx, pe, p0.TextDocument.Uri)
14901500
return languageService.ProvideRename(ctx, &p0, orchestrator)
14911501
case "ProvideSelectionRanges":
14921502
var p0 lsproto.SelectionRangeParams
@@ -1509,7 +1519,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
15091519
}
15101520
} else if params.Request.GetAmbientModules != nil {
15111521
req := params.Request.GetAmbientModules
1512-
pe, _, _, err := s.getDenoLanguageService(ctx, req.CompilerOptionsKey, req.NotebookUri)
1522+
pe, _, err := s.getDenoLanguageService(req.CompilerOptionsKey, req.NotebookUri)
15131523
if err != nil {
15141524
return nil, err
15151525
}
@@ -1541,7 +1551,7 @@ func (s *Server) handleDenoRequest(ctx context.Context, params *lsproto.DenoRequ
15411551
return nil, nil
15421552
}
15431553

1544-
func (s *Server) getDenoLanguageService(ctx context.Context, compilerOptionsKey string, notebookUri *string) (*DenoProgramEntry, *ls.LanguageService, *DenoCrossProjectOrchestrator, error) {
1554+
func (s *Server) getDenoLanguageService(compilerOptionsKey string, notebookUri *string) (*DenoProgramEntry, *ls.LanguageService, error) {
15451555
var pe *DenoProgramEntry
15461556
if notebookUri != nil {
15471557
pe = s.deno.programEntries.byNotebookUri[*notebookUri]
@@ -1551,20 +1561,25 @@ func (s *Server) getDenoLanguageService(ctx context.Context, compilerOptionsKey
15511561
}
15521562
if pe == nil {
15531563
if notebookUri != nil {
1554-
return nil, nil, nil, fmt.Errorf("Couldn't find program entry for key: %s and notebook %s", compilerOptionsKey, *notebookUri)
1564+
return nil, nil, fmt.Errorf("Couldn't find program entry for key: %s and notebook %s", compilerOptionsKey, *notebookUri)
15551565
}
1556-
return nil, nil, nil, fmt.Errorf("Couldn't find program entry for key: %s", compilerOptionsKey)
1566+
return nil, nil, fmt.Errorf("Couldn't find program entry for key: %s", compilerOptionsKey)
15571567
}
15581568

15591569
host := NewDenoLanguageServiceHost(pe.vfs, pe.userPreferences, pe.formatOptions, pe.autoImportRegistry)
1560-
orchestrator := &DenoCrossProjectOrchestrator{
1570+
languageService := ls.NewLanguageService(pe.projectPath, pe.program, host)
1571+
return pe, languageService, nil
1572+
}
1573+
1574+
func (s *Server) getDenoCrossProjectOrchestrator(ctx context.Context, pe *DenoProgramEntry, initialUri lsproto.DocumentUri) *DenoCrossProjectOrchestrator {
1575+
host := NewDenoLanguageServiceHost(pe.vfs, pe.userPreferences, pe.formatOptions, pe.autoImportRegistry)
1576+
return &DenoCrossProjectOrchestrator{
15611577
server: s,
15621578
ctx: ctx,
15631579
defaultProgramEntry: pe,
15641580
defaultHost: host,
1581+
initialUri: initialUri,
15651582
}
1566-
languageService := ls.NewLanguageService(pe.projectPath, pe.program, host)
1567-
return pe, languageService, orchestrator, nil
15681583
}
15691584

15701585
func (s *Server) createDenoProgramEntry(ctx context.Context, compilerOptionsKey string, notebookUri *string, projectConfig *lsproto.DenoProjectConfig) (*DenoProgramEntry, error) {
@@ -1603,7 +1618,14 @@ func (s *Server) createDenoProgramEntry(ctx context.Context, compilerOptionsKey
16031618
return project.DenoNewCheckerPool(4, p, func(msg string) {})
16041619
},
16051620
})
1606-
projectPath := tspath.ToPath(s.cwd, "", denoVFS.UseCaseSensitiveFileNames())
1621+
1622+
// This is not used as an actual path, just a unique id.
1623+
var projectPath tspath.Path
1624+
if notebookUri != nil {
1625+
projectPath = tspath.Path(*notebookUri)
1626+
} else {
1627+
projectPath = tspath.Path(compilerOptionsKey)
1628+
}
16071629

16081630
toPath := func(fileName string) tspath.Path {
16091631
return tspath.ToPath(fileName, s.cwd, denoVFS.UseCaseSensitiveFileNames())

0 commit comments

Comments
 (0)