mirror of
https://github.com/golang/go
synced 2024-11-18 16:24:42 -07:00
internal/lsp: avoid invalid state due to context cancelation
In shouldRunGopackages we would reset a goFile's metadata and pkgs in advance of re-running go/packages. However, if we did not end up running go/packages for whatever reason (read: we got canceled), the goFile gets stuck in the unfortunate state of not belonging to any packages because "pkgs" is empty. I think this leads to "no CheckPackageHandle" errors, at least in relation to GetCachedPackage() calls. Fix by deferring the reset of goFile's metadata and pkgs until after the go/packages call has succeeded. Change-Id: I95aace85c026e1232b42cadee9e7772951c817d0 Reviewed-on: https://go-review.googlesource.com/c/tools/+/193601 Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
parent
4f238b926e
commit
59228eac51
24
internal/lsp/cache/load.go
vendored
24
internal/lsp/cache/load.go
vendored
@ -122,6 +122,17 @@ func (v *view) checkMetadata(ctx context.Context, f *goFile, fh source.FileHandl
|
|||||||
// Track missing imports as we look at the package's errors.
|
// Track missing imports as we look at the package's errors.
|
||||||
missingImports := make(map[packagePath]struct{})
|
missingImports := make(map[packagePath]struct{})
|
||||||
|
|
||||||
|
// Clear metadata since we are re-running go/packages.
|
||||||
|
// Reset the file's metadata and type information if we are re-running `go list`.
|
||||||
|
f.mu.Lock()
|
||||||
|
for k := range f.meta {
|
||||||
|
delete(f.meta, k)
|
||||||
|
}
|
||||||
|
for k := range f.pkgs {
|
||||||
|
delete(f.pkgs, k)
|
||||||
|
}
|
||||||
|
f.mu.Unlock()
|
||||||
|
|
||||||
log.Print(ctx, "go/packages.Load", tag.Of("packages", len(pkgs)))
|
log.Print(ctx, "go/packages.Load", tag.Of("packages", len(pkgs)))
|
||||||
for _, pkg := range pkgs {
|
for _, pkg := range pkgs {
|
||||||
log.Print(ctx, "go/packages.Load", tag.Of("package", pkg.PkgPath), tag.Of("files", pkg.CompiledGoFiles))
|
log.Print(ctx, "go/packages.Load", tag.Of("package", pkg.PkgPath), tag.Of("files", pkg.CompiledGoFiles))
|
||||||
@ -179,19 +190,6 @@ func sameSet(x, y map[packagePath]struct{}) bool {
|
|||||||
// determine if they have changed.
|
// determine if they have changed.
|
||||||
// It assumes that the caller holds the lock on the f.mu lock.
|
// It assumes that the caller holds the lock on the f.mu lock.
|
||||||
func (v *view) shouldRunGopackages(ctx context.Context, f *goFile, fh source.FileHandle) (result bool) {
|
func (v *view) shouldRunGopackages(ctx context.Context, f *goFile, fh source.FileHandle) (result bool) {
|
||||||
defer func() {
|
|
||||||
// Clear metadata if we are intending to re-run go/packages.
|
|
||||||
if result {
|
|
||||||
// Reset the file's metadata and type information if we are re-running `go list`.
|
|
||||||
for k := range f.meta {
|
|
||||||
delete(f.meta, k)
|
|
||||||
}
|
|
||||||
for k := range f.pkgs {
|
|
||||||
delete(f.pkgs, k)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
if len(f.meta) == 0 || len(f.missingImports) > 0 {
|
if len(f.meta) == 0 || len(f.missingImports) > 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user