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  }