internal/lsp/cache: handle a few possible panics in PackageStats

Change-Id: I50dbe8bf7d801e7325bdbe413368e85779511d85
Reviewed-on: https://go-review.googlesource.com/c/tools/+/240183
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
diff --git a/internal/lsp/cache/cache.go b/internal/lsp/cache/cache.go
index 9ae3295..3c8b477 100644
--- a/internal/lsp/cache/cache.go
+++ b/internal/lsp/cache/cache.go
@@ -176,11 +176,21 @@
 		switch k.(type) {
 		case packageHandleKey:
 			v := v.(*packageData)
+			if v.pkg == nil {
+				break
+			}
+			var typsCost, typInfoCost int64
+			if v.pkg.types != nil {
+				typsCost = typesCost(v.pkg.types.Scope())
+			}
+			if v.pkg.typesInfo != nil {
+				typInfoCost = typesInfoCost(v.pkg.typesInfo)
+			}
 			stat := packageStat{
 				id:        v.pkg.id,
 				mode:      v.pkg.mode,
-				types:     typesCost(v.pkg.types.Scope()),
-				typesInfo: typesInfoCost(v.pkg.typesInfo),
+				types:     typsCost,
+				typesInfo: typInfoCost,
 			}
 			for _, f := range v.pkg.compiledGoFiles {
 				fvi := f.handle.Cached()