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