Skip to content

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

Closed
@MichaelUrman

Description

@MichaelUrman

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.

Activity

added
ToolsThis label describes issues relating to any tools in the x/tools repository.
goplsIssues related to the Go language server, gopls.
on Jul 28, 2023
added this to the Unreleased milestone on Jul 28, 2023
findleyr

findleyr commented on Jul 28, 2023

@findleyr
Member

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

gopherbot commented on Jul 28, 2023

@gopherbot
Contributor

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

added a commit that references this issue on Feb 16, 2024
1561060
locked and limited conversation to collaborators on Jul 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeToolsThis label describes issues relating to any tools in the x/tools repository.goplsIssues related to the Go language server, gopls.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @MichaelUrman@gopherbot@findleyr

        Issue actions

          x/tools/gopls: type alias rename changes aliased type · Issue #61625 · golang/go