Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

x/tools/gopls: type alias rename changes aliased type #61625

Closed
MichaelUrman opened this issue Jul 28, 2023 · 2 comments
Closed

x/tools/gopls: type alias rename changes aliased type #61625

MichaelUrman opened this issue Jul 28, 2023 · 2 comments
Labels
gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository.
Milestone

Comments

@MichaelUrman
Copy link

MichaelUrman commented Jul 28, 2023

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.6

Behavior 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.

@gopherbot gopherbot added Tools This label describes issues relating to any tools in the x/tools repository. gopls Issues related to the Go language server, gopls. labels Jul 28, 2023
@gopherbot gopherbot added this to the Unreleased milestone Jul 28, 2023
@findleyr
Copy link
Contributor

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).

@findleyr findleyr modified the milestones: Unreleased, gopls/v0.13.1 Jul 28, 2023
@gopherbot
Copy link

Change https://go.dev/cl/513917 mentions this issue: gopls/internal/lsp/source: fix incorrect 'origin' logic for named types

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository.
Projects
None yet
Development

No branches or pull requests

3 participants