Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

x/tools/gopls: publishDiagnostics is unstable #65801

Closed
hyangah opened this issue Feb 20, 2024 · 6 comments
Closed

x/tools/gopls: publishDiagnostics is unstable #65801

hyangah opened this issue Feb 20, 2024 · 6 comments
Assignees
Labels
gopls Issues related to the Go language server, gopls. NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. Tools This label describes issues relating to any tools in the x/tools repository.
Milestone

Comments

@hyangah
Copy link
Contributor

hyangah commented Feb 20, 2024

gopls version

$ gopls -v version
Build info
----------
golang.org/x/tools/gopls (devel)
    golang.org/x/tools/gopls@(devel)
    github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
    github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
    golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=
    golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
    golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
    golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=
    golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
    golang.org/x/tools@v0.17.0 => ../
    golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=
    honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=
    mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=
    mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
go: devel go1.23-daa58db486 Fri Feb 16 11:59:07 2024 +0000

go env

$ go env
GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/Users/hakim/Library/Caches/go-build'
GOENV='/Users/hakim/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/hakim/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='darwin'
GOPATH='/Users/hakim/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/Users/hakim/go_tip/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN=''
GOTOOLDIR='/Users/hakim/go_tip/go/pkg/tool/darwin_amd64'
GOVCS=''
GOVERSION='devel go1.23-b91bad7819 Mon Jan 29 19:39:24 2024 +0000'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/hakim/go_tip/go/src/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch x86_64

What did you do?

  1. Opened VS Code from src dir of the Go project.
  2. Opened src/cmd/go/internal/load/pkg.go in the Go project.
  3. Change one of the exported field name of PackagePublic (but, not update the references). For example,
diff --git a/src/cmd/go/internal/load/pkg.go b/src/cmd/go/internal/load/pkg.go
index 1549800afb..f9cc8f599d 100644
--- a/src/cmd/go/internal/load/pkg.go
+++ b/src/cmd/go/internal/load/pkg.go
@@ -63,7 +63,7 @@ type PackagePublic struct {
        Dir           string                `json:",omitempty"` // directory containing package sources
        ImportPath    string                `json:",omitempty"` // import path of package in dir
        ImportComment string                `json:",omitempty"` // path in import comment on package statement
-       Name          string                `json:",omitempty"` // package name
+       NameX         string                `json:",omitempty"` // package name
        Doc           string                `json:",omitempty"` // package documentation string
        Target        string                `json:",omitempty"` // installed target for this package (may be executable)
        Shlib         string                `json:",omitempty"` // the shared library that contains this package (only set when -linkshared)

What did you see happen?

Expected gopls to detect build breakage ("has no field or method Name" error), across many packages.

What did you expect to see?

Gopls published diagnostics for some files and then soon empty diagnostics for all those files. This empty diagnostic message makes vscode (client) clears all diagnostics immediately.

Editor and settings

"gopls": {},
"go.languageServerFlags": [ "-rpc.trace" ]

Logs

[Info  - 10:07:51 PM] 2024/02/19 22:07:51 go info for /Users/hakim/go_tip/go/src
(view type GoModView)
(root dir /Users/hakim/go_tip/go/src)
(go version go version devel go1.23-b91bad7819 Mon Jan 29 19:39:24 2024 +0000 darwin/amd64)
(build flags: [])
(go env: {GOOS:darwin GOARCH:amd64 GOCACHE:/Users/hakim/Library/Caches/go-build GOMODCACHE:/Users/hakim/go/pkg/mod GOPATH:/Users/hakim/go GOPRIVATE: GOFLAGS: GO111MODULE: GoVersion:23 GoVersionOutput:go version devel go1.23-b91bad7819 Mon Jan 29 19:39:24 2024 +0000 darwin/amd64
 GOWORK: GOPACKAGESDRIVER:})
(env overlay: map[])
...

[Trace - 22:08:00.621 PM] Sending notification 'textDocument/didChange'.
Params: {"textDocument":{"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/pkg.go","version":2},"contentChanges":[{"range":{"start":{"line":65,"character":5},"end":{"line":65,"character":5}},"rangeLength":0,"text":"X"}]}

...

[Trace - 22:08:00.676 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/godebug.go","diagnostics":[{"range":{"start":{"line":59,"character":6},"end":{"line":59,"character":10}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"}]}


[Trace - 22:08:00.676 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/pkg.go","version":2,"diagnostics":[{"range":{"start":{"line":399,"character":3},"end":{"line":399,"character":7}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":817,"character":6},"end":{"line":817,"character":10}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":1693,"character":61},"end":{"line":1693,"character":65}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":1802,"character":16},"end":{"line":1802,"character":20}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":1926,"character":7},"end":{"line":1926,"character":11}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":2034,"character":24},"end":{"line":2034,"character":28}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":2372,"character":7},"end":{"line":2372,"character":11}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":2961,"character":8},"end":{"line":2961,"character":12}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3093,"character":9},"end":{"line":3093,"character":13}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"pkg.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3093,"character":32},"end":{"line":3093,"character":36}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"pkg.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3165,"character":7},"end":{"line":3165,"character":11}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"pkg.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3167,"character":61},"end":{"line":3167,"character":65}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"pkg.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3227,"character":8},"end":{"line":3227,"character":12}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"pkg.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3237,"character":25},"end":{"line":3237,"character":29}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"pkg.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3379,"character":7},"end":{"line":3379,"character":11}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"d.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":3497,"character":22},"end":{"line":3497,"character":26}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"}]}


[Trace - 22:08:00.676 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/test.go","diagnostics":[{"range":{"start":{"line":174,"character":32},"end":{"line":174,"character":36}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":230,"character":4},"end":{"line":230,"character":8}},"severity":1,"code":"MissingLitField","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingLitField"},"source":"compiler","message":"unknown field Name in struct literal of type PackagePublic"},{"range":{"start":{"line":230,"character":18},"end":{"line":230,"character":22}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":273,"character":3},"end":{"line":273,"character":7}},"severity":1,"code":"MissingLitField","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingLitField"},"source":"compiler","message":"unknown field Name in struct literal of type PackagePublic"},{"range":{"start":{"line":500,"character":7},"end":{"line":500,"character":11}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"p.Name undefined (type *Package has no field or method Name)"},{"range":{"start":{"line":684,"character":18},"end":{"line":684,"character":22}},"severity":1,"code":"MissingFieldOrMethod","codeDescription":{"href":"https://pkg.go.dev/golang.org/x/tools/internal/typesinternal#MissingFieldOrMethod"},"source":"compiler","message":"t.Package.Name undefined (type *Package has no field or method Name)"}]}

....

[Trace - 22:08:01.659 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/pkg.go","version":2,"diagnostics":[]}


[Trace - 22:08:01.659 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/godebug.go","diagnostics":[]}


[Trace - 22:08:01.659 PM] Received notification 'textDocument/publishDiagnostics'.
Params: {"uri":"file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/test.go","diagnostics":[]}

And, the session info:

Session 1
From: [Cache 1](http://127.0.0.1:52081/cache/1)
Views
ID: 1
Type: GoModView
Root: file:///Users/hakim/go_tip/go/src
Folder: src:file:///Users/hakim/go_tip/go/src
ID: 2
Type: GoModView
Root: file:///Users/hakim/go_tip/go/src/cmd
Folder: src:file:///Users/hakim/go_tip/go/src
Overlays
[file:///Users/hakim/go_tip/go/src/cmd/go/internal/load/pkg.go](http://127.0.0.1:52081/file/1/099fab280c86b6e134a3bdd7366359e3b3372b5057354446bad0cb2f9c504df2)
@hyangah hyangah added gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository. labels Feb 20, 2024
@gopherbot gopherbot added this to the Unreleased milestone Feb 20, 2024
@hyangah hyangah modified the milestones: Unreleased, gopls/v0.15.0 Feb 20, 2024
@hyangah
Copy link
Contributor Author

hyangah commented Feb 20, 2024

It looks like the problem is observed only on master, not gopls@v0.15.0-pre.3.
Can this be moved to the gopls/v0.16.0 milestone for investigation?
cc @adonovan @findleyr

@findleyr
Copy link
Contributor

@hyangah thanks for reporting...

This does reproduce with v0.15.0-pre.3 for me. Therefore, this is a critical bug that must block the v0.15.0 release.
It only seems to occur in the Go repo, based on a few tests. Investigating.

@findleyr findleyr added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Feb 20, 2024
@findleyr findleyr self-assigned this Feb 20, 2024
@gopherbot
Copy link
Contributor

Change https://go.dev/cl/565475 mentions this issue: gopls/internal/cache: fix two bugs related to workspace packages

@gopherbot
Copy link
Contributor

Change https://go.dev/cl/565457 mentions this issue: [gopls-release-branch.0.15] gopls/internal/cache: fix two bugs related to workspace packages

gopherbot pushed a commit to golang/tools that referenced this issue Feb 20, 2024
…d to workspace packages

Fix two bugs related to workspace packages that contributed to
golang/go#65801.

The first is that we didn't consider packages with open files to be
workspace packages. This was pre-existing behavior, but in the past we
simply relied on diagnoseChangedFiles to provide diagnostics for open
packages, even though we didn't consider them to be part of the
workspace. That led to races and inconsistent behavior: a change in one
file would wipe out diagnostics in another, and so on. It's much simpler
to say that if the package is open, it is part of the workspace. This
leads to consistent behavior, no matter where diagnostics originate.

The second bug is related to loading std and cmd. The new workspace
package heuristics relied on go/packages.Package.Module to determine if
a package is included in the workspace. For std and cmd, this field is
nil (golang/go#65816), apparently due to limitations of `go list`. As a
result, we were finding no workspace packages for std or cmd. Fix this
by falling back to searching for the relevant go.mod file in the
filesystem. Unfortunately this required reinstating the lockedSnapshot
file source.

These bugs revealed a rather large gap in our test coverage for std. Add
a test that verifies that we compute std workspace packages.

Fixes golang/go#65801

Change-Id: Ic454d4a43e34af10e1224755a09d6c94c728c97d
Reviewed-on: https://go-review.googlesource.com/c/tools/+/565475
Reviewed-by: Alan Donovan <adonovan@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit 607b664)
Reviewed-on: https://go-review.googlesource.com/c/tools/+/565457
@gopherbot
Copy link
Contributor

Change https://go.dev/cl/569836 mentions this issue: gopls/internal/cache: fix spurious diagnostics in multi-root workspaces

gopherbot pushed a commit to golang/tools that referenced this issue Mar 8, 2024
In golang/go#66145, users reported spurious import errors in multi-root
workspaces. The problem was related to scenarios where module A had a
local replace of module B, and the user opened a file F in module B that
wasn't in the forward dependencies of module A. In this case, if the
View of module A tried to load F, it would get real packages (not
command-line-arguments), but due to module graph pruning the View of
module A would not have access to the full set of dependencies for
module B, resulting in the potential for import errors. Even this would
not be a problem, as long as the package that module A loaded for F was
not considered a 'workspace' package.

Unfortunately a couple of incorrect heuristics in gopls added along with
the zero-config work of gopls@v0.15.0 allowed us to diagnose these
broken packages:

1. In resolveImportGraph, we called MetadataForFile for each overlay. As
   a result, the import graph optimization caused gopls to attempt
   loading packages for each open file, for each View. It was wrong for
   an optimization to have this side effect.
2. In golang/go#65801, we observed that it was inconsistent to diagnose
   changed packages independent of whether they're workspace packages.
   To fix that, I made all open packages workspace packages. It was
   probably wrong for the set of workspace packages to depend on open
   files. To summarize a rather long philosophical digression: open
   files should determine Views, not packages.

Fixing either one of these incorrect heuristics would have prevented
golang/go#66145. In this CL, we fix (2) by building the import graph
based on existing metadata, without triggering an additional load.

For (1), we check IsWorkspacePackage in diagnoseChangedFiles to enforce
consistency in the set of diagnosed packages. It would be nice to also
remove the heuristic that "all open packages are workspace packages",
but we can't do that yet as it would mean no diagnostics for files
outside the workspace, after e.g. jumping to definition. A TODO is left
to address this another day, when we can be less conservative.

Fixes golang/go#66145

Change-Id: Ic4cf2bbbb515b6ea0df24b8e6e46c725b82b4779
Reviewed-on: https://go-review.googlesource.com/c/tools/+/569836
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
@gopherbot
Copy link
Contributor

Change https://go.dev/cl/569876 mentions this issue: [gopls-release-branch.0.15] gopls/internal/cache: fix spurious diagnostics in multi-root workspaces

gopherbot pushed a commit to golang/tools that referenced this issue Mar 8, 2024
…stics in multi-root workspaces

In golang/go#66145, users reported spurious import errors in multi-root
workspaces. The problem was related to scenarios where module A had a
local replace of module B, and the user opened a file F in module B that
wasn't in the forward dependencies of module A. In this case, if the
View of module A tried to load F, it would get real packages (not
command-line-arguments), but due to module graph pruning the View of
module A would not have access to the full set of dependencies for
module B, resulting in the potential for import errors. Even this would
not be a problem, as long as the package that module A loaded for F was
not considered a 'workspace' package.

Unfortunately a couple of incorrect heuristics in gopls added along with
the zero-config work of gopls@v0.15.0 allowed us to diagnose these
broken packages:

1. In resolveImportGraph, we called MetadataForFile for each overlay. As
   a result, the import graph optimization caused gopls to attempt
   loading packages for each open file, for each View. It was wrong for
   an optimization to have this side effect.
2. In golang/go#65801, we observed that it was inconsistent to diagnose
   changed packages independent of whether they're workspace packages.
   To fix that, I made all open packages workspace packages. It was
   probably wrong for the set of workspace packages to depend on open
   files. To summarize a rather long philosophical digression: open
   files should determine Views, not packages.

Fixing either one of these incorrect heuristics would have prevented
golang/go#66145. In this CL, we fix (2) by building the import graph
based on existing metadata, without triggering an additional load.

For (1), we check IsWorkspacePackage in diagnoseChangedFiles to enforce
consistency in the set of diagnosed packages. It would be nice to also
remove the heuristic that "all open packages are workspace packages",
but we can't do that yet as it would mean no diagnostics for files
outside the workspace, after e.g. jumping to definition. A TODO is left
to address this another day, when we can be less conservative.

Fixes golang/go#66145

Change-Id: Ic4cf2bbbb515b6ea0df24b8e6e46c725b82b4779
Reviewed-on: https://go-review.googlesource.com/c/tools/+/569836
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
(cherry picked from commit 93c0ca5)
Reviewed-on: https://go-review.googlesource.com/c/tools/+/569876
Auto-Submit: Robert Findley <rfindley@google.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
gopls Issues related to the Go language server, gopls. NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. Tools This label describes issues relating to any tools in the x/tools repository.
Projects
None yet
Development

No branches or pull requests

3 participants