internal/lsp/cache: have NewView create view even if load all packages fails

Even if the packages.Load of the directory the NewView is being created for
fails, create and add the view. But also return the error from NewView, just
after the new view has been added.

Fixes golang/go#35468

Change-Id: I76c2d3cbe1a508ad0794a6fcd3bc67cd48c97e22
Reviewed-on: https://go-review.googlesource.com/c/tools/+/206497
Run-TryBot: Michael Matloob <matloob@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/cache/load.go b/internal/lsp/cache/load.go
index 1675cfc..52b04da 100644
--- a/internal/lsp/cache/load.go
+++ b/internal/lsp/cache/load.go
@@ -64,10 +64,12 @@
 		return nil, errors.Errorf("no metadata for %s: %v", uri, err)
 	}
 	log.Print(ctx, "go/packages.Load", tag.Of("packages", len(pkgs)))
-	if _, ok := scope.(source.FileURI); len(pkgs) == 0 && ok {
+	if len(pkgs) == 0 {
 		if err == nil {
 			err = errNoPackagesFound
 		}
+	}
+	if err != nil {
 		return nil, err
 	}
 	m, prevMissingImports, err := s.updateMetadata(ctx, scope, pkgs, cfg)
diff --git a/internal/lsp/cache/session.go b/internal/lsp/cache/session.go
index 24e945be..573ebc8 100644
--- a/internal/lsp/cache/session.go
+++ b/internal/lsp/cache/session.go
@@ -6,6 +6,7 @@
 
 import (
 	"context"
+	"fmt"
 	"path/filepath"
 	"sort"
 	"strconv"
@@ -126,8 +127,9 @@
 	v.snapshotMu.Lock()
 	defer v.snapshotMu.Unlock() // The code after the snapshot is used isn't expensive.
 	m, err := v.snapshot.load(ctx, source.DirectoryURI(folder))
+	var loadErr error
 	if err != nil && err != errNoPackagesFound {
-		return nil, err
+		loadErr = fmt.Errorf("Error loading packages: %v", err)
 	}
 
 	// Prepare CheckPackageHandles for every package that's been loaded.
@@ -144,7 +146,7 @@
 	// we always need to drop the view map
 	s.viewMap = make(map[span.URI]source.View)
 	debug.AddView(debugView{v})
-	return v, nil
+	return v, loadErr
 }
 
 // View returns the view by name.