@@ -1254,20 +1254,26 @@ type DenoCrossProjectOrchestrator struct {
12541254 ctx context.Context
12551255 defaultProgramEntry * DenoProgramEntry
12561256 defaultHost * DenoLanguageServiceHost
1257+ initialUri lsproto.DocumentUri
12571258}
12581259
12591260func (o * DenoCrossProjectOrchestrator ) GetDefaultProject () ls.Project {
12601261 return DenoLanguageServiceProject {programEntry : o .defaultProgramEntry }
12611262}
12621263
12631264func (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
15701585func (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