cuelang.org/go@v0.10.1/internal/golangorgx/gopls/server/workspace.go (about) 1 // Copyright 2019 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package server 6 7 import ( 8 "context" 9 "fmt" 10 "sync" 11 12 "cuelang.org/go/internal/golangorgx/gopls/cache" 13 "cuelang.org/go/internal/golangorgx/gopls/protocol" 14 "cuelang.org/go/internal/golangorgx/tools/event" 15 ) 16 17 func (s *server) DidChangeWorkspaceFolders(ctx context.Context, params *protocol.DidChangeWorkspaceFoldersParams) error { 18 for _, folder := range params.Event.Removed { 19 dir, err := protocol.ParseDocumentURI(folder.URI) 20 if err != nil { 21 return fmt.Errorf("invalid folder %q: %v", folder.URI, err) 22 } 23 if !s.session.RemoveView(dir) { 24 return fmt.Errorf("view %q for %v not found", folder.Name, folder.URI) 25 } 26 } 27 s.addFolders(ctx, params.Event.Added) 28 return nil 29 } 30 31 // addView returns a Snapshot and a release function that must be 32 // called when it is no longer needed. 33 func (s *server) addView(ctx context.Context, name string, dir protocol.DocumentURI) (*cache.Snapshot, func(), error) { 34 s.stateMu.Lock() 35 state := s.state 36 s.stateMu.Unlock() 37 if state < serverInitialized { 38 return nil, nil, fmt.Errorf("addView called before server initialized") 39 } 40 folder, err := s.newFolder(ctx, dir, name) 41 if err != nil { 42 return nil, nil, err 43 } 44 _, snapshot, release, err := s.session.NewView(ctx, folder) 45 return snapshot, release, err 46 } 47 48 func (s *server) DidChangeConfiguration(ctx context.Context, _ *protocol.DidChangeConfigurationParams) error { 49 ctx, done := event.Start(ctx, "lsp.Server.didChangeConfiguration") 50 defer done() 51 52 var wg sync.WaitGroup 53 wg.Add(1) 54 defer wg.Done() 55 if s.Options().VerboseWorkDoneProgress { 56 work := s.progress.Start(ctx, DiagnosticWorkTitle(FromDidChangeConfiguration), "Calculating diagnostics...", nil, nil) 57 go func() { 58 wg.Wait() 59 work.End(ctx, "Done.") 60 }() 61 } 62 63 // Apply any changes to the session-level settings. 64 options, err := s.fetchFolderOptions(ctx, "") 65 if err != nil { 66 return err 67 } 68 s.SetOptions(options) 69 70 // Collect options for all workspace folders. 71 seen := make(map[protocol.DocumentURI]bool) 72 var newFolders []*cache.Folder 73 for _, view := range s.session.Views() { 74 folder := view.Folder() 75 if seen[folder.Dir] { 76 continue 77 } 78 seen[folder.Dir] = true 79 newFolder, err := s.newFolder(ctx, folder.Dir, folder.Name) 80 if err != nil { 81 return err 82 } 83 newFolders = append(newFolders, newFolder) 84 } 85 s.session.UpdateFolders(ctx, newFolders) 86 87 // The view set may have been updated above. 88 viewsToDiagnose := make(map[*cache.View][]protocol.DocumentURI) 89 for _, view := range s.session.Views() { 90 viewsToDiagnose[view] = nil 91 } 92 93 modCtx, modID := s.needsDiagnosis(ctx, viewsToDiagnose) 94 wg.Add(1) 95 go func() { 96 s.diagnoseChangedViews(modCtx, modID, viewsToDiagnose, FromDidChangeConfiguration) 97 wg.Done() 98 }() 99 100 // An options change may have affected the detected Go version. 101 s.checkViewGoVersions() 102 103 return nil 104 }