diff --git a/internal/lsp/cache/session.go b/internal/lsp/cache/session.go index bcb799a668..48acf4606b 100644 --- a/internal/lsp/cache/session.go +++ b/internal/lsp/cache/session.go @@ -159,6 +159,11 @@ func (s *Session) Cache() interface{} { func (s *Session) NewView(ctx context.Context, name string, folder, tempWorkspace span.URI, options *source.Options) (source.View, source.Snapshot, func(), error) { s.viewMu.Lock() defer s.viewMu.Unlock() + for _, view := range s.views { + if span.CompareURI(view.folder, folder) == 0 { + return nil, nil, nil, source.ErrViewExists + } + } view, snapshot, release, err := s.createView(ctx, name, folder, tempWorkspace, options, 0) if err != nil { return nil, nil, func() {}, err diff --git a/internal/lsp/general.go b/internal/lsp/general.go index e6991887d0..44715f07e7 100644 --- a/internal/lsp/general.go +++ b/internal/lsp/general.go @@ -232,6 +232,9 @@ func (s *Server) addFolders(ctx context.Context, folders []protocol.WorkspaceFol } work := s.progress.Start(ctx, "Setting up workspace", "Loading packages...", nil, nil) snapshot, release, err := s.addView(ctx, folder.Name, uri) + if err == source.ErrViewExists { + continue + } if err != nil { viewErrors[uri] = err work.End(fmt.Sprintf("Error loading packages: %s", err)) diff --git a/internal/lsp/source/view.go b/internal/lsp/source/view.go index 2dd0dbc1d7..2285e5a3ac 100644 --- a/internal/lsp/source/view.go +++ b/internal/lsp/source/view.go @@ -373,6 +373,8 @@ type Session interface { SetProgressTracker(tracker *progress.Tracker) } +var ErrViewExists = errors.New("view already exists for session") + // Overlay is the type for a file held in memory on a session. type Overlay interface { VersionedFileHandle