Description
gopls version
`gopls -v version` -> v0.12.4
Build info ---------- golang.org/x/tools/gopls v0.12.4 golang.org/x/tools/gopls@v0.12.4 h1:nce5etAamR46d9oNGxop1aRK5rDQ0NqcY/SHIcyfEKY= github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/google/go-cmp@v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= golang.org/x/exp@v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y= golang.org/x/mod@v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= golang.org/x/sync@v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys@v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/text@v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= golang.org/x/tools@v0.10.1-0.20230622221742-0622ad2359a7 h1:5PWemM67wMSPpO0Y3lOPlyvgO3z56YkZRxPFcdd300g= golang.org/x/vuln@v0.0.0-20230110180137-6ad3e3d07815 h1:A9kONVi4+AnuOr1dopsibH6hLi1Huy54cbeJxnq4vmU= honnef.co/go/tools@v0.4.2 h1:6qXr+R5w+ktL5UkwEbPp+fEvfyoMPche6GkOpGHZcLc= mvdan.cc/gofumpt@v0.4.0 h1:JVf4NN1mIpHogBj7ABpgOyZc65/UUOkKQFkoURsz4MM= mvdan.cc/xurls/v2@v2.4.0 h1:tzxjVAj+wSBmDcF6zBB7/myTy3gX9xvi8Tyr28AuQgc= go: go1.20.6Behavior is unchanged by golang.org/x/tools/gopls@v0.13.0-pre.3
go env
`go env` -> go1.20.6
GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/murman/.cache/go-build" GOENV="/home/murman/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/murman/go/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/murman/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/home/murman/sdk/go1.20.6" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/home/murman/sdk/go1.20.6/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.20.6" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/home/murman/allium/renamefail/go.mod" GOWORK="" CGO_CFLAGS="-O2 -g" CGO_CPPFLAGS="" CGO_CXXFLAGS="-O2 -g" CGO_FFLAGS="-O2 -g" CGO_LDFLAGS="-O2 -g" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2239966941=/tmp/go-build -gno-record-gcc-switches"What did you do?
With my cursor on type alias A
, attempt to rename it to B
. (VSCode F2; B; Enter)
package renamefail
type LongNameHere struct{}
type A = LongNameHere
func Foo() A
This is reduced from my original reduction (below). This tries to hint at the motivation: the generic type parameter couldn't be inferred, and (in the real case) I needed it multiple times, so I aliased it. Then I changed my mind about the name.
package renamefail
type LongNameHere struct{}
type Fooey struct {}
func(b *Fooey) Foo(*LongNameHere) error
func example(foo *Fooey) {
type A = LongNameHere
generic[A](foo)
}
func generic[T any](t interface{ Foo(*T) error }) {
t.Foo(nil)
}
What did you expect to see?
I expected all instances of A to be replaced with B:
package renamefail
type LongNameHere struct{}
type B = LongNameHere
func Foo() B
What did you see instead?
I saw all instances of LongNameHere turned into B:
package renamefail
type B struct{}
type A = B
func Foo() A
or in the longer version:
package renamefail
type B struct{}
type Fooey struct {}
func(b *Fooey) Foo(*B) error
func example(foo *Fooey) {
type A = B
generic[A](foo)
}
func generic[T any](t interface{ Foo(*T) error }) {
t.Foo(nil)
}
In the real case this affected multiple files in a manner consistent with a rename of the aliased type instead of the type alias.
Editor and settings
I was able to reproduce this while commenting out all my VSCode go settings, so am omitting settings for now. Ping me if I'm wrong here.
Logs
Ditto.
Activity
findleyr commentedon Jul 28, 2023
Thanks for the report. This is a bug, and we'll prioritize it for the next gopls release (v0.13.1, as v0.13.0 is going out Monday).
gopherbot commentedon Jul 28, 2023
Change https://go.dev/cl/513917 mentions this issue:
gopls/internal/lsp/source: fix incorrect 'origin' logic for named types
gopls/internal/lsp/source: fix incorrect 'origin' logic for named types