aboutsummaryrefslogtreecommitdiff
path: root/internal/lsp/references.go
diff options
context:
space:
mode:
authorSuzy Mueller <suzmue@golang.org>2019-06-07 10:04:22 -0400
committerSuzy Mueller <suzmue@golang.org>2019-06-10 19:06:22 +0000
commitbca362e842d497814cb616549d97b5481101b10d (patch)
tree963354a6fb3c2362a67a8e71ed4992b4f6b2637f /internal/lsp/references.go
parent5ae6a9745e44f90b85d14baaf7e4bd6419db11ab (diff)
downloadgolang-x-tools-bca362e842d497814cb616549d97b5481101b10d.tar.gz
internal/lsp: add find all references
This change implements the find all references feature by finding all of the uses and definitions of the identifier within the current package. Testing for references is done using "refs" in the testdata files and marking the references in the package. Change-Id: Ieb44b68608e940df5f65c3052eb9ec974f6fae6c Reviewed-on: https://go-review.googlesource.com/c/tools/+/181122 Run-TryBot: Suzy Mueller <suzmue@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Diffstat (limited to 'internal/lsp/references.go')
-rw-r--r--internal/lsp/references.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/internal/lsp/references.go b/internal/lsp/references.go
new file mode 100644
index 000000000..27862441e
--- /dev/null
+++ b/internal/lsp/references.go
@@ -0,0 +1,56 @@
+package lsp
+
+import (
+ "context"
+
+ "golang.org/x/tools/internal/lsp/protocol"
+ "golang.org/x/tools/internal/lsp/source"
+ "golang.org/x/tools/internal/span"
+)
+
+func (s *Server) references(ctx context.Context, params *protocol.ReferenceParams) ([]protocol.Location, error) {
+ uri := span.NewURI(params.TextDocument.URI)
+ view := s.session.ViewOf(uri)
+ f, m, err := getGoFile(ctx, view, uri)
+ if err != nil {
+ return nil, err
+ }
+ spn, err := m.PointSpan(params.Position)
+ if err != nil {
+ return nil, err
+ }
+ rng, err := spn.Range(m.Converter)
+ if err != nil {
+ return nil, err
+ }
+
+ // Find all references to the identifier at the position.
+ ident, err := source.Identifier(ctx, view, f, rng.Start)
+ if err != nil {
+ return nil, err
+ }
+ references, err := ident.References(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ // Get the location of each reference to return as the result.
+ locations := make([]protocol.Location, 0, len(references))
+ for _, ref := range references {
+ refSpan, err := ref.Range.Span()
+ if err != nil {
+ return nil, err
+ }
+ _, refM, err := getSourceFile(ctx, view, refSpan.URI())
+ if err != nil {
+ return nil, err
+ }
+ loc, err := refM.Location(refSpan)
+ if err != nil {
+ return nil, err
+ }
+
+ locations = append(locations, loc)
+ }
+ return locations, nil
+}