internal/lsp: get the correct declaration node when finding references

We were returning the AST node for the identifier that the rename was
called from, not the actual declaration, so the doc comments weren't
getting updated.

Fixes golang/go#40463

Change-Id: Id8ba0b0aeb8f42d2aaa561e7a964edcca5202916
Reviewed-on: https://go-review.googlesource.com/c/tools/+/245817
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
diff --git a/internal/lsp/source/references.go b/internal/lsp/source/references.go
index 54d8d09..8f82e64 100644
--- a/internal/lsp/source/references.go
+++ b/internal/lsp/source/references.go
@@ -12,6 +12,7 @@
 
 	"golang.org/x/tools/internal/event"
 	"golang.org/x/tools/internal/lsp/protocol"
+	"golang.org/x/tools/internal/span"
 	"golang.org/x/xerrors"
 )
 
@@ -53,17 +54,21 @@
 
 	// Make sure declaration is the first item in the response.
 	if includeDeclaration {
-		rng, err := objToMappedRange(s.View(), qos[0].pkg, qos[0].obj)
+		filename := s.View().Session().Cache().FileSet().Position(qos[0].obj.Pos()).Filename
+		pgf, err := qos[0].pkg.File(span.URIFromPath(filename))
 		if err != nil {
 			return nil, err
 		}
-		ident, _ := qos[0].node.(*ast.Ident)
+		ident, err := findIdentifier(ctx, s, qos[0].pkg, pgf.File, qos[0].obj.Pos())
+		if err != nil {
+			return nil, err
+		}
 		references = append(references, &ReferenceInfo{
-			mappedRange:   rng,
+			mappedRange:   ident.mappedRange,
 			Name:          qos[0].obj.Name(),
-			ident:         ident,
+			ident:         ident.ident,
 			obj:           qos[0].obj,
-			pkg:           qos[0].pkg,
+			pkg:           ident.pkg,
 			isDeclaration: true,
 		})
 	}
diff --git a/internal/lsp/source/view.go b/internal/lsp/source/view.go
index d3e8eec..62a72f5 100644
--- a/internal/lsp/source/view.go
+++ b/internal/lsp/source/view.go
@@ -201,7 +201,7 @@
 	ParseErrors []Error
 }
 
-// A TidedModule contains the results of running `go mod tidy` on a module.
+// A TidiedModule contains the results of running `go mod tidy` on a module.
 type TidiedModule struct {
 	memoize.NoCopy
 
diff --git a/internal/lsp/testdata/lsp/primarymod/rename/b/b.go.golden b/internal/lsp/testdata/lsp/primarymod/rename/b/b.go.golden
index 3a0e3f1..5c2c158 100644
--- a/internal/lsp/testdata/lsp/primarymod/rename/b/b.go.golden
+++ b/internal/lsp/testdata/lsp/primarymod/rename/b/b.go.golden
@@ -21,6 +21,7 @@
 func Hello() {} //@rename("Hello", "Goodbye")
 
 -- Goodbye-rename --
+b.go:
 package b
 
 var c int //@rename("int", "uint")
@@ -42,6 +43,15 @@
 */
 func Goodbye() {} //@rename("Hello", "Goodbye")
 
+c.go:
+package c
+
+import "golang.org/x/tools/internal/lsp/rename/b"
+
+func _() {
+	b.Goodbye() //@rename("Hello", "Goodbye")
+}
+
 -- error-rename --
 package b
 
diff --git a/internal/lsp/testdata/lsp/primarymod/rename/c/c.go b/internal/lsp/testdata/lsp/primarymod/rename/c/c.go
new file mode 100644
index 0000000..519d2f6
--- /dev/null
+++ b/internal/lsp/testdata/lsp/primarymod/rename/c/c.go
@@ -0,0 +1,7 @@
+package c
+
+import "golang.org/x/tools/internal/lsp/rename/b"
+
+func _() {
+	b.Hello() //@rename("Hello", "Goodbye")
+}
diff --git a/internal/lsp/testdata/lsp/primarymod/rename/c/c.go.golden b/internal/lsp/testdata/lsp/primarymod/rename/c/c.go.golden
new file mode 100644
index 0000000..5693742
--- /dev/null
+++ b/internal/lsp/testdata/lsp/primarymod/rename/c/c.go.golden
@@ -0,0 +1,32 @@
+-- Goodbye-rename --
+b.go:
+package b
+
+var c int //@rename("int", "uint")
+
+func _() {
+	a := 1 //@rename("a", "error")
+	a = 2
+	_ = a
+}
+
+var (
+	// Hello there.
+	// Foo does the thing.
+	Foo int //@rename("Foo", "Bob")
+)
+
+/*
+Goodbye description
+*/
+func Goodbye() {} //@rename("Hello", "Goodbye")
+
+c.go:
+package c
+
+import "golang.org/x/tools/internal/lsp/rename/b"
+
+func _() {
+	b.Goodbye() //@rename("Hello", "Goodbye")
+}
+
diff --git a/internal/lsp/testdata/lsp/summary.txt.golden b/internal/lsp/testdata/lsp/summary.txt.golden
index 205b45d..351c80d 100644
--- a/internal/lsp/testdata/lsp/summary.txt.golden
+++ b/internal/lsp/testdata/lsp/summary.txt.golden
@@ -17,7 +17,7 @@
 TypeDefinitionsCount = 2
 HighlightsCount = 69
 ReferencesCount = 11
-RenamesCount = 28
+RenamesCount = 29
 PrepareRenamesCount = 7
 SymbolsCount = 3
 WorkspaceSymbolsCount = 2