`x/tools/gopls:重命名失败,当旧标识符缺少声明时,会显示“未找到对象”\`

jxct1oxe  于 7个月前  发布在  Go
关注(0)|答案(1)|浏览(52)

你正在使用哪个版本?

~$ go version -m $(which gopls)
/usr/local/google/home/bcmills/bin/gopls: devel +186f0220d0 Mon Oct 5 11:12:24 2020 -0400
        path    golang.org/x/tools/gopls
        mod     golang.org/x/tools/gopls        v0.5.1  h1:AF3Uh7HF08SZpKFfgJO6zfF3bbxyDXWqdkK4kMXiQ1o=
        dep     github.com/BurntSushi/toml      v0.3.1  h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
        dep     github.com/google/go-cmp        v0.5.1  h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
        dep     github.com/sergi/go-diff        v1.1.0  h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
        dep     golang.org/x/mod        v0.3.0  h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
        dep     golang.org/x/sync       v0.0.0-20200625203802-6e8e738ad208      h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
        dep     golang.org/x/tools      v0.0.0-20200930165741-f1523d29dbb9      h1:1R38tQp22dcHpTKJPjgVa16FhlDy/kHEaCM/ndi/FIc=
        dep     golang.org/x/xerrors    v0.0.0-20200804184101-5ec99f83aff1      h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
        dep     honnef.co/go/tools      v0.0.1-2020.1.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k=
        dep     mvdan.cc/gofumpt        v0.0.0-20200802201014-ab5a8192947d      h1:t8TAw9WgTLghti7RYkpPmqk4JtQ3+wcP5GgZqgWeWLQ=
        dep     mvdan.cc/xurls/v2       v2.2.0  h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A=

这个问题在最新版本中是否会重现?

是的

你做了什么?

( https://play.golang.org/p/OSPW1IIzNCs )

  1. 使用 emacsgopls 通过 eglot ,从一个在多个地方使用但未声明的现有标识符开始。
    (对于这个例子, errNo 。)
  2. 在局部范围内为新标识符添加一个声明,但为其选择一个更好的名称( errno )。
  3. 请记住,您还需要重命名该标识符的所有现有使用。
  4. 将光标放在旧标识符的出现处并执行 M-x eglot-rename
  5. 输入步骤(2)中的标识符名称。

你期望看到什么?

引用到(现在未声明的)变量的地方应该被重命名,使它们现在指向步骤(2)中的标识符。

你看到了什么?

gopls 返回了一个 no object found 错误。
M-x eglot-events-buffer 报告的:

[client-request] (id:9) Wed Oct  7 14:42:34 2020:
(:jsonrpc "2.0" :id 9 :method "textDocument/rename" :params
					(:textDocument
					 (:uri "file:///tmp/tmp.Ih8P4GysfM/example.com/main.go")
					 :position
					 (:line 13 :character 23)
					 :newName "errno"))
[server-reply] (id:9) ERROR Wed Oct  7 14:42:34 2020:
(:jsonrpc "2.0" :error
					(:code 0 :message "no object found for \"errNo\": no object found")
					:id 9)
kwvwclae

kwvwclae1#

在没有完整类型信息的情况下重命名总是会有些棘手,因为我们无法确定用户从一个无效程序开始的意图。将未声明的标识符重命名为已声明的名称可能是例外,但我不确定。考虑这个人为的例子:

func _() {
  oldName = "hi"
  {
    var newName int
    {
      oldName = "hello"
    }
    {
      oldName = 123
    }
}

在这种情况下,尝试重命名其中的任何旧名称是否有意义?

相关问题