internal/lsp: only search for references in reverse dependencies
Updates golang/go#35597
Change-Id: I78e83ad0ee1ae3c59a7452c467b3abd34587a845
Reviewed-on: https://go-review.googlesource.com/c/tools/+/208657
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Cottrell <iancottrell@google.com>
diff --git a/internal/lsp/cache/snapshot.go b/internal/lsp/cache/snapshot.go
index 17d15d3..4ae68bb 100644
--- a/internal/lsp/cache/snapshot.go
+++ b/internal/lsp/cache/snapshot.go
@@ -94,7 +94,7 @@
cphs = results
}
if len(cphs) == 0 {
- return nil, errors.Errorf("no CheckPackageHandles for %s", f)
+ return nil, errors.Errorf("no CheckPackageHandles for %s", f.URI())
}
return cphs, nil
}
diff --git a/internal/lsp/source/references.go b/internal/lsp/source/references.go
index 921a756..88ecf11 100644
--- a/internal/lsp/source/references.go
+++ b/internal/lsp/source/references.go
@@ -10,6 +10,8 @@
"go/types"
"golang.org/x/tools/go/types/objectpath"
+ "golang.org/x/tools/internal/lsp/telemetry"
+ "golang.org/x/tools/internal/telemetry/log"
"golang.org/x/tools/internal/telemetry/trace"
errors "golang.org/x/xerrors"
)
@@ -73,12 +75,22 @@
var searchpkgs []Package
if i.Declaration.obj.Exported() {
// Only search all packages if the identifier is exported.
- // TODO(matloob): This only needs to look into reverse-dependencies.
- // Avoid checking types of other packages.
- searchpkgs = i.Snapshot.KnownPackages(ctx)
- } else {
- searchpkgs = []Package{i.pkg}
+ for _, id := range i.Snapshot.GetReverseDependencies(i.pkg.ID()) {
+ cph, err := i.Snapshot.PackageHandle(ctx, id)
+ if err != nil {
+ log.Error(ctx, "References: no CheckPackageHandle", err, telemetry.Package.Of(id))
+ continue
+ }
+ pkg, err := cph.Check(ctx)
+ if err != nil {
+ log.Error(ctx, "References: no Package", err, telemetry.Package.Of(id))
+ continue
+ }
+ searchpkgs = append(searchpkgs, pkg)
+ }
}
+ // Add the package in which the identifier is declared.
+ searchpkgs = append(searchpkgs, i.pkg)
for _, pkg := range searchpkgs {
for ident, obj := range pkg.GetTypesInfo().Uses {
if obj == nil || !(sameObj(obj, i.Declaration.obj)) {