internal/lsp: check ident exists for comment rename

The identifier in a reference is used to check for a doc comment.
Implicits do not have an ident, so do not use that to look for a doc
comment.

Also set the context.Context for the renamer.

Change-Id: I085d9e6c11d919222592dcb6fb30982eeb0fc7cd
Reviewed-on: https://go-review.googlesource.com/c/tools/+/184042
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
diff --git a/internal/lsp/source/rename.go b/internal/lsp/source/rename.go
index f2169e5..59b6171 100644
--- a/internal/lsp/source/rename.go
+++ b/internal/lsp/source/rename.go
@@ -60,6 +60,7 @@
 	}
 
 	r := renamer{
+		ctx:          ctx,
 		fset:         i.File.FileSet(),
 		pkg:          i.pkg,
 		refs:         refs,
@@ -78,11 +79,11 @@
 		return nil, fmt.Errorf(r.errors)
 	}
 
-	return r.update(ctx)
+	return r.update()
 }
 
 // Rename all references to the identifier.
-func (r *renamer) update(ctx context.Context) (map[span.URI][]TextEdit, error) {
+func (r *renamer) update() (map[span.URI][]TextEdit, error) {
 	result := make(map[span.URI][]TextEdit)
 
 	docRegexp, err := regexp.Compile(`\b` + r.from + `\b`)
@@ -99,9 +100,10 @@
 			Span:    refSpan,
 			NewText: r.to,
 		}
+
 		result[refSpan.URI()] = append(result[refSpan.URI()], edit)
 
-		if !ref.isDeclaration { // not a declaration
+		if !ref.isDeclaration || ref.ident == nil { // done if it it is a use or does not have an identifier
 			continue
 		}
 
diff --git a/internal/lsp/testdata/rename/a/random.go.golden b/internal/lsp/testdata/rename/a/random.go.golden
index 806b4d7..bd07e97 100644
--- a/internal/lsp/testdata/rename/a/random.go.golden
+++ b/internal/lsp/testdata/rename/a/random.go.golden
@@ -1,6 +1,8 @@
 -- GetSum-rename --
 package a
 
+import "fmt"
+
 func Random() int {
 	y := 6 + 7
 	return y
@@ -23,9 +25,24 @@
 	_ = p.GetSum() //@rename("Sum", "GetSum")
 }
 
+func sw() {
+	var x interface{}
+
+	switch y := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y) //@rename("y", "y3")
+	}
+}
+
 -- myX-rename --
 package a
 
+import "fmt"
+
 func Random() int {
 	y := 6 + 7
 	return y
@@ -48,9 +65,24 @@
 	_ = p.Sum() //@rename("Sum", "GetSum")
 }
 
+func sw() {
+	var x interface{}
+
+	switch y := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y) //@rename("y", "y3")
+	}
+}
+
 -- pos-rename --
 package a
 
+import "fmt"
+
 func Random() int {
 	y := 6 + 7
 	return y
@@ -73,9 +105,24 @@
 	_ = pos.Sum() //@rename("Sum", "GetSum")
 }
 
+func sw() {
+	var x interface{}
+
+	switch y := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y) //@rename("y", "y3")
+	}
+}
+
 -- z-rename --
 package a
 
+import "fmt"
+
 func Random() int {
 	y := 6 + 7
 	return y
@@ -98,3 +145,216 @@
 	_ = p.Sum() //@rename("Sum", "GetSum")
 }
 
+func sw() {
+	var x interface{}
+
+	switch y := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y) //@rename("y", "y3")
+	}
+}
+
+-- y0-rename --
+package a
+
+import "fmt"
+
+func Random() int {
+	y := 6 + 7
+	return y
+}
+
+func Random2(y int) int { //@rename("y", "z")
+	return y
+}
+
+type Pos struct {
+	x, y int
+}
+
+func (p *Pos) Sum() int {
+	return p.x + p.y //@rename("x", "myX")
+}
+
+func _() {
+	var p Pos   //@rename("p", "pos")
+	_ = p.Sum() //@rename("Sum", "GetSum")
+}
+
+func sw() {
+	var x interface{}
+
+	switch y0 := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y0) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y0) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y0) //@rename("y", "y3")
+	}
+}
+
+-- y1-rename --
+package a
+
+import "fmt"
+
+func Random() int {
+	y := 6 + 7
+	return y
+}
+
+func Random2(y int) int { //@rename("y", "z")
+	return y
+}
+
+type Pos struct {
+	x, y int
+}
+
+func (p *Pos) Sum() int {
+	return p.x + p.y //@rename("x", "myX")
+}
+
+func _() {
+	var p Pos   //@rename("p", "pos")
+	_ = p.Sum() //@rename("Sum", "GetSum")
+}
+
+func sw() {
+	var x interface{}
+
+	switch y1 := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y1) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y1) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y1) //@rename("y", "y3")
+	}
+}
+
+-- y2-rename --
+package a
+
+import "fmt"
+
+func Random() int {
+	y := 6 + 7
+	return y
+}
+
+func Random2(y int) int { //@rename("y", "z")
+	return y
+}
+
+type Pos struct {
+	x, y int
+}
+
+func (p *Pos) Sum() int {
+	return p.x + p.y //@rename("x", "myX")
+}
+
+func _() {
+	var p Pos   //@rename("p", "pos")
+	_ = p.Sum() //@rename("Sum", "GetSum")
+}
+
+func sw() {
+	var x interface{}
+
+	switch y2 := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y2) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y2) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y2) //@rename("y", "y3")
+	}
+}
+
+-- y3-rename --
+package a
+
+import "fmt"
+
+func Random() int {
+	y := 6 + 7
+	return y
+}
+
+func Random2(y int) int { //@rename("y", "z")
+	return y
+}
+
+type Pos struct {
+	x, y int
+}
+
+func (p *Pos) Sum() int {
+	return p.x + p.y //@rename("x", "myX")
+}
+
+func _() {
+	var p Pos   //@rename("p", "pos")
+	_ = p.Sum() //@rename("Sum", "GetSum")
+}
+
+func sw() {
+	var x interface{}
+
+	switch y3 := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y3) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y3) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y3) //@rename("y", "y3")
+	}
+}
+
+-- format-rename --
+package a
+
+import format "fmt"
+
+func Random() int {
+	y := 6 + 7
+	return y
+}
+
+func Random2(y int) int { //@rename("y", "z")
+	return y
+}
+
+type Pos struct {
+	x, y int
+}
+
+func (p *Pos) Sum() int {
+	return p.x + p.y //@rename("x", "myX")
+}
+
+func _() {
+	var p Pos   //@rename("p", "pos")
+	_ = p.Sum() //@rename("Sum", "GetSum")
+}
+
+func sw() {
+	var x interface{}
+
+	switch y := x.(type) { //@rename("y", "y0")
+	case int:
+		format.Printf("%d", y) //@rename("y", "y1")
+	case string:
+		format.Printf("%s", y) //@rename("y", "y2")
+	default:
+		format.Printf("%v", y) //@rename("y", "y3")
+	}
+}
+
diff --git a/internal/lsp/testdata/rename/a/random.go.in b/internal/lsp/testdata/rename/a/random.go.in
index d4347f8..c1c0fc5 100644
--- a/internal/lsp/testdata/rename/a/random.go.in
+++ b/internal/lsp/testdata/rename/a/random.go.in
@@ -1,5 +1,7 @@
 package a
 
+import "fmt"
+
 func Random() int {
 	y := 6 + 7
 	return y
@@ -21,3 +23,16 @@
 	var p Pos   //@rename("p", "pos")
 	_ = p.Sum() //@rename("Sum", "GetSum")
 }
+
+func sw() {
+	var x interface{}
+
+	switch y := x.(type) { //@rename("y", "y0")
+	case int:
+		fmt.Printf("%d", y) //@rename("y", "y1")
+	case string:
+		fmt.Printf("%s", y) //@rename("y", "y2")
+	default:
+		fmt.Printf("%v", y) //@rename("y", "y3")
+	}
+}
diff --git a/internal/lsp/tests/tests.go b/internal/lsp/tests/tests.go
index 34a581b..f0fdb48 100644
--- a/internal/lsp/tests/tests.go
+++ b/internal/lsp/tests/tests.go
@@ -34,7 +34,7 @@
 	ExpectedTypeDefinitionsCount   = 2
 	ExpectedHighlightsCount        = 2
 	ExpectedReferencesCount        = 2
-	ExpectedRenamesCount           = 4
+	ExpectedRenamesCount           = 8
 	ExpectedSymbolsCount           = 1
 	ExpectedSignaturesCount        = 20
 	ExpectedLinksCount             = 2