go/packages: ignore no packages error from (*snapshot).load in (*session).NewView

Treat it as okay if no packages are found when loading all the packages in a
workspace. Users may open workspaces that don't have any Go files, either because
they are workspaces for other languages, or because no Go files have been created
yet.

Fixes golang/go#35455

Change-Id: I60912472ec8930649996edc150d1d19cd74a0a2e
Reviewed-on: https://go-review.googlesource.com/c/tools/+/206140
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 285f6a0..1675cfc 100644
--- a/internal/lsp/cache/load.go
+++ b/internal/lsp/cache/load.go
@@ -33,6 +33,8 @@
 	config *packages.Config
 }
 
+var errNoPackagesFound = errors.New("no packages found for query")
+
 func (s *snapshot) load(ctx context.Context, scope source.Scope) ([]*metadata, error) {
 	uri := scope.URI()
 	var query string
@@ -62,11 +64,10 @@
 		return nil, errors.Errorf("no metadata for %s: %v", uri, err)
 	}
 	log.Print(ctx, "go/packages.Load", tag.Of("packages", len(pkgs)))
-	if len(pkgs) == 0 {
+	if _, ok := scope.(source.FileURI); len(pkgs) == 0 && ok {
 		if err == nil {
-			err = errors.Errorf("go/packages.Load: no packages found for %s", query)
+			err = errNoPackagesFound
 		}
-		// Return this error as a diagnostic to the user.
 		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 d2b3b13..24e945be 100644
--- a/internal/lsp/cache/session.go
+++ b/internal/lsp/cache/session.go
@@ -126,9 +126,10 @@
 	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))
-	if err != nil {
+	if err != nil && err != errNoPackagesFound {
 		return nil, err
 	}
+
 	// Prepare CheckPackageHandles for every package that's been loaded.
 	// (*snapshot).CheckPackageHandle makes the assumption that every package that's
 	// been loaded has an existing checkPackageHandle.