diff --git a/internal/lsp/cache/analysis.go b/internal/lsp/cache/analysis.go
index 2adc23f..0649937 100644
--- a/internal/lsp/cache/analysis.go
+++ b/internal/lsp/cache/analysis.go
@@ -148,6 +148,9 @@
 	if !ok {
 		return nil, nil, errors.Errorf("unexpected type for %s:%s", act.pkg.ID(), act.analyzer.Name)
 	}
+	if data == nil {
+		return nil, nil, errors.Errorf("unexpected nil analysis for %s:%s", act.pkg.ID(), act.analyzer.Name)
+	}
 	return data.diagnostics, data.result, data.err
 }
 
@@ -160,6 +163,9 @@
 	if !ok {
 		return nil, nil, errors.Errorf("unexpected type for %s:%s", act.pkg.ID(), act.analyzer.Name)
 	}
+	if data == nil {
+		return nil, nil, errors.Errorf("unexpected nil cached analysis for %s:%s", act.pkg.ID(), act.analyzer.Name)
+	}
 	return data.diagnostics, data.result, data.err
 }
 
@@ -213,8 +219,6 @@
 	// Plumb the output values of the dependencies
 	// into the inputs of this action.  Also facts.
 	inputs := make(map[*analysis.Analyzer]interface{})
-	objectFacts := make(map[objectFactKey]analysis.Fact)
-	packageFacts := make(map[packageFactKey]analysis.Fact)
 
 	for depHandle, depData := range deps {
 		if depHandle.pkg == pkg {
@@ -233,14 +237,14 @@
 				if !exportedFrom(key.obj, depHandle.pkg.types) {
 					continue
 				}
-				objectFacts[key] = fact
+				data.objectFacts[key] = fact
 			}
 			for key, fact := range depData.packageFacts {
 				// TODO: filter out facts that belong to
 				// packages not mentioned in the export data
 				// to prevent side channels.
 
-				packageFacts[key] = fact
+				data.packageFacts[key] = fact
 			}
 		}
 	}
@@ -271,7 +275,7 @@
 			}
 			key := objectFactKey{obj, factType(ptr)}
 
-			if v, ok := objectFacts[key]; ok {
+			if v, ok := data.objectFacts[key]; ok {
 				reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())
 				return true
 			}
@@ -283,14 +287,14 @@
 					analyzer, pkg.ID(), obj, fact))
 			}
 			key := objectFactKey{obj, factType(fact)}
-			objectFacts[key] = fact // clobber any existing entry
+			data.objectFacts[key] = fact // clobber any existing entry
 		},
 		ImportPackageFact: func(pkg *types.Package, ptr analysis.Fact) bool {
 			if pkg == nil {
 				panic("nil package")
 			}
 			key := packageFactKey{pkg, factType(ptr)}
-			if v, ok := packageFacts[key]; ok {
+			if v, ok := data.packageFacts[key]; ok {
 				reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())
 				return true
 			}
@@ -298,19 +302,19 @@
 		},
 		ExportPackageFact: func(fact analysis.Fact) {
 			key := packageFactKey{pkg.types, factType(fact)}
-			packageFacts[key] = fact // clobber any existing entry
+			data.packageFacts[key] = fact // clobber any existing entry
 		},
 		AllObjectFacts: func() []analysis.ObjectFact {
-			facts := make([]analysis.ObjectFact, 0, len(objectFacts))
-			for k := range objectFacts {
-				facts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: objectFacts[k]})
+			facts := make([]analysis.ObjectFact, 0, len(data.objectFacts))
+			for k := range data.objectFacts {
+				facts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: data.objectFacts[k]})
 			}
 			return facts
 		},
 		AllPackageFacts: func() []analysis.PackageFact {
-			facts := make([]analysis.PackageFact, 0, len(packageFacts))
-			for k := range packageFacts {
-				facts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: packageFacts[k]})
+			facts := make([]analysis.PackageFact, 0, len(data.packageFacts))
+			for k := range data.packageFacts {
+				facts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: data.packageFacts[k]})
 			}
 			return facts
 		},
@@ -341,7 +345,8 @@
 	for _, diag := range diagnostics {
 		srcErr, err := sourceError(ctx, fset, pkg, diag)
 		if err != nil {
-			return nil
+			data.err = err
+			return data
 		}
 		data.diagnostics = append(data.diagnostics, srcErr)
 	}
