From d0c72119bb3c3f553bdd46ac7a429e1040d64ba3 Mon Sep 17 00:00:00 2001 From: Robert Findley Date: Fri, 19 Nov 2021 12:47:49 -0500 Subject: [PATCH] internal/lsp/cache: fix resolution of the go directive in multi-module workspaces Go versions are not valid semver, so we were always resolving Go 1.12 in the workspace module. This matters with lazy module loading. Fixes golang/go#49668 Updates golang/go#49105 Fixes golang/go#48364 Change-Id: Iae4f5f6e17df4be1f4d6ee9d3f439efa3cf658d3 Reviewed-on: https://go-review.googlesource.com/c/tools/+/365737 Trust: Robert Findley Run-TryBot: Robert Findley gopls-CI: kokoro TryBot-Result: Go Bot Reviewed-by: Heschi Kreinick --- gopls/internal/regtest/workspace/workspace_test.go | 5 ++++- internal/lsp/cache/snapshot.go | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/gopls/internal/regtest/workspace/workspace_test.go b/gopls/internal/regtest/workspace/workspace_test.go index 11ab507708..666f023ace 100644 --- a/gopls/internal/regtest/workspace/workspace_test.go +++ b/gopls/internal/regtest/workspace/workspace_test.go @@ -855,6 +855,7 @@ func TestWorkspaceDirAccess(t *testing.T) { -- moda/a/go.mod -- module a.com +go 1.15 -- moda/a/a.go -- package main @@ -863,6 +864,8 @@ func main() { } -- modb/go.mod -- module b.com + +go 1.16 -- modb/b/b.go -- package main @@ -892,7 +895,7 @@ func main() { t.Fatalf("reading expected workspace modfile: %v", err) } got := string(gotb) - for _, want := range []string{"a.com v1.9999999.0-goplsworkspace", "b.com v1.9999999.0-goplsworkspace"} { + for _, want := range []string{"go 1.16", "a.com v1.9999999.0-goplsworkspace", "b.com v1.9999999.0-goplsworkspace"} { if !strings.Contains(got, want) { // want before got here, since the go.mod is multi-line t.Fatalf("workspace go.mod missing %q. got:\n%s", want, got) diff --git a/internal/lsp/cache/snapshot.go b/internal/lsp/cache/snapshot.go index 486a2287cd..51b00d5b61 100644 --- a/internal/lsp/cache/snapshot.go +++ b/internal/lsp/cache/snapshot.go @@ -2290,7 +2290,8 @@ func buildWorkspaceModFile(ctx context.Context, modFiles map[span.URI]struct{}, if file == nil || parsed.Module == nil { return nil, fmt.Errorf("no module declaration for %s", modURI) } - if parsed.Go != nil && semver.Compare(goVersion, parsed.Go.Version) < 0 { + // Prepend "v" to go versions to make them valid semver. + if parsed.Go != nil && semver.Compare("v"+goVersion, "v"+parsed.Go.Version) < 0 { goVersion = parsed.Go.Version } path := parsed.Module.Mod.Path