-
Notifications
You must be signed in to change notification settings - Fork 18k
x/tools/gopls: GOPACKAGESDRIVER calls happen at intervals that make the results incorrect #59625
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
Comments
Can you share which Is it possible to make your gopackagesdriver recognize the overlay info? @golang/tools-team I think we need documentation on gopackagesdriver #34341 |
We use the rules_go one. I'll have a look at overlay info and see how to support it in the rules_go driver |
We discussed this a bit more in our team meeting, and decided it would probably be very difficult to support this in the bazel driver (based on our understanding of bazel). So we'll leave this open: it would be nice to fix, but unlikely to get prioritized any time soon. The work to implement this would be approximately:
...but this will be very tricky to implement, and even after implemented may have to a subtly confusing UX. |
@findleyr Hello, What is the status of this support programme? |
@li-jin-gou I think this issue may have been superseded by #68002. I plan to implement #68002 this year. It is currently targetting the v0.17.0 release, which is tentatively planned for October. |
I have a similar problem to him. After my local dependencies using gopackagesdriver are changed, I hope gopls can get the latest data in time. Is there any gopls command that can achieve this? Or is there any other better way? |
Thanks, until then we can move forward with the programme of trying to restart gopls. @findleyr |
FWIW at Uber we did 2 things to fix this:
|
thanks |
sorry sir. In our case, the content of *packages.DriverResponse is unchanged, but the content of the file it maps to has changed. {
"ID": "service1/hello",
"Name": "hello",
"PkgPath": "rgo/service1/kitex_gen/hello",
"GoFiles": [
"/root/cache/service1/hello/hello.go"
],
"CompiledGoFiles": [
"/root/cache/service1/hello/hello.go"
],
"Imports": {
"context": "context",
"fmt": "fmt"
}
}, In fact it really doesn't describe whether or not the specifics of the file change. Have you ever had this problem? @JamyDev |
Dependencies may have been added or the original dependency code may have changed. |
I'm able to reproduce this. We use Bazel as our build system and this has been one of the more annoying bits. I've recorded what this looks like, and how you can get around it by deleting another import, saving, and then putting it back. That triggers Video is too big to upload to GitHub: https://share.cleanshot.com/YSjRRv3D |
I delved into this, and made some minor adjustments to gopls in order to have it reload the "state of the world" whenever a Bazel-related file was being touched. It's quite brute-force & dumb, but it seemingly works for us: https://github.com/devzero-inc/tools |
@ellie-idb thanks for looking into this. If it works, I'd be totally fine with configuration that customizes the set of 'workspace file' patterns, with the default value of // (in gopls/internal/settings.BuildOptions)
// BuildFiles configures the set of regular expressions that match files defining the logical build of the current workspace.
// Any on-disk change to a file matching these expressions causes the workspace to be reloaded.
//
// This setting need only be customized in environments that set GOPACKAGESDRIVER.
BuildFiles []string One of our major concerns with extending explicit support for bazel is the lack of test coverage (and we have ~zero budget to add such coverage). If your proposed configuration allows us to address this issue without adding any explicit logic for bazel, that largely mitigates this concern. I can help you land this in gopls. To start, could you update your patchset with proposed changes that avoid bazel-specific logic? Then I can help you with testing; we have extremely limited coverage for GOPACKAGESDRIVER, but should be able to exercise this logic using the fake driver that actually calls |
@findleyr One note is that I didn't want to introduce any new dependencies as part of this work, so I implemented the file matching using the
. Let me know what you think! Happy to hop on a call or something to get this landed. |
Sounds good, I was actually undecided between those names. Are you able to send your patch as a CL in Gerrit, so that we can continue discussion in CL comments? (see https://go.dev/doc/contribute if you are new to contributing). |
Change https://go.dev/cl/640076 mentions this issue: |
WorkspaceFiles allows an end-user to specify a set of files which, when modified, will trigger a full reload of any views currently open in a session. This is especially important for users who use custom GOPACKAGESDRIVERS, as previously, you were forced to restart the language server in order to get up-to-date diagnostics in some certain instances. For golang/go#59625 Change-Id: Iba7a6137cb0b88a59318217a9a28d079100192a4 Reviewed-on: https://go-review.googlesource.com/c/tools/+/640076 Auto-Submit: Robert Findley <[email protected]> Reviewed-by: Alan Donovan <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Robert Findley <[email protected]>
Change https://go.dev/cl/647295 mentions this issue: |
Add release notes for the new workspaceFiles option. Also, clean up existing release notes a bit. Updates golang/go#59625 Change-Id: I8969a48b2fddd9c60a77c038deb9090bd2e9eb98 Reviewed-on: https://go-review.googlesource.com/c/tools/+/647295 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Alan Donovan <[email protected]> Auto-Submit: Robert Findley <[email protected]>
hey folks -- it looks like my fix for this change has made it out in v0.18.0 (see: https://github.com/golang/tools/releases/tag/gopls%2Fv0.18.0). to enable, you'll need to modify your LSP settings to add the following lines: https://github.com/ellie-idb/bazel-go-starter-repo/blob/533cf015072f75a1369981aec21675fdd9b7b29a/.vscode/settings.json#L20-L26. please let me know if you still have issues with out of date metadata after this! |
What version of Go are you using (
go version
)?Does this issue reproduce with the latest release?
Yes
What operating system and processor architecture are you using (
go env
)?go env
OutputWhat did you do?
With
GOPACKAGESDRIVER
enabled, adding an import (whether by inline writing code and accepting an import suggestion; or manually adding it to the imports section) will trigger a query to the packages driver. However, this trigger will happen prior to the file being saved, yet the packagesdriver will only get a filename to load packages for.This triggers a bit of a race condition in build systems like Bazel:
file.go
area, b, c
d
$ pkgdrvr file=file.go
)a, b, c
and thus only return info for those 3d
as bad.What did you expect to see?
Since the packagesdriver works with files on disk (in the general case) we should not query the packagesdriver until the IDE has committed the changes on disk.
Alternatively we can extend the packages driver call to query directly for the information of the imported package, rather than indirectly querying for the file the import is added to.
What did you see instead?
Package import resolution fails until language server restart.
I will try to get a project where we can repro this situation in.
The text was updated successfully, but these errors were encountered: