From b7525f439611adb23d8864047ccdbad0cfef3e5e Mon Sep 17 00:00:00 2001 From: Suzy Mueller Date: Thu, 24 Feb 2022 10:09:43 -0700 Subject: [PATCH] internal/lsp: hash go version into package key The go directive affects type checking errors so it should be included in the package key. I manually tested that this fixes the issue in golang/go#51325 Fixes golang/go#51325 Change-Id: I109859ae65e7e4d5fdefc63a0a7a838117ee02cf Reviewed-on: https://go-review.googlesource.com/c/tools/+/387914 Trust: Suzy Mueller Run-TryBot: Suzy Mueller TryBot-Result: Gopher Robot Reviewed-by: Robert Findley --- internal/lsp/cache/check.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/lsp/cache/check.go b/internal/lsp/cache/check.go index 616381653a..f166863540 100644 --- a/internal/lsp/cache/check.go +++ b/internal/lsp/cache/check.go @@ -194,7 +194,7 @@ func (s *snapshot) buildKey(ctx context.Context, id PackageID, mode source.Parse depKeys = append(depKeys, depHandle.key) } experimentalKey := s.View().Options().ExperimentalPackageCacheKey - ph.key = checkPackageKey(ph.m.ID, compiledGoFiles, m.Config, depKeys, mode, experimentalKey) + ph.key = checkPackageKey(ph.m.ID, compiledGoFiles, m, depKeys, mode, experimentalKey) return ph, deps, nil } @@ -214,15 +214,18 @@ func (s *snapshot) workspaceParseMode(id PackageID) source.ParseMode { return source.ParseExported } -func checkPackageKey(id PackageID, pghs []*parseGoHandle, cfg *packages.Config, deps []packageHandleKey, mode source.ParseMode, experimentalKey bool) packageHandleKey { +func checkPackageKey(id PackageID, pghs []*parseGoHandle, m *KnownMetadata, deps []packageHandleKey, mode source.ParseMode, experimentalKey bool) packageHandleKey { b := bytes.NewBuffer(nil) b.WriteString(string(id)) + if m.Module != nil { + b.WriteString(m.Module.GoVersion) // go version affects type check errors. + } if !experimentalKey { // cfg was used to produce the other hashed inputs (package ID, parsed Go // files, and deps). It should not otherwise affect the inputs to the type // checker, so this experiment omits it. This should increase cache hits on // the daemon as cfg contains the environment and working directory. - b.WriteString(hashConfig(cfg)) + b.WriteString(hashConfig(m.Config)) } b.WriteByte(byte(mode)) for _, dep := range deps {