x/tools/gopls: 一次内联多个已弃用的函数调用

vojdkbi0  于 4个月前  发布在  Go
关注(0)|答案(2)|浏览(36)

gopls版本

golang.org/x/tools/gopls v0.15.2

go环境

GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/stapelberg/.cache/go-build'
GOENV='/home/stapelberg/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/stapelberg/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/stapelberg/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/lib/go-1.21'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/lib/go-1.21/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.21.6'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/dev/null'
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 -ffile-prefix-map=/tmp/go-build1079342930=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

当时的情况是我有一个函数,它调用了许多已弃用的函数,比如ioutil.ReadFile:

package main

import "io/ioutil"

func main() {
	_, _ = ioutil.ReadFile("/tmp/foo")
	_, _ = ioutil.ReadFile("/tmp/bar")
}

你看到了什么?

当我将我的Emacs光标放在ioutil.ReadFile上并运行M-x eglot-code-actions时,我确实看到了预期的代码操作作为唯一的补全选项:

但是当我选择多个ioutil.ReadFile调用并运行M-x eglot-code-actions时,我只得到了“提取函数”作为唯一的补全选项:

你期望看到什么?

你是否知道在LSP中一次内联多个函数是不是不可能的?或者在LSP中是可能的,但在Emacs的eglot中不可能?在我的情况下,我不得不使用字符串替换,因为它更快。理想情况下,内联器应该更快一些 :)

编辑器和设置

Emacs 29,内置eglot

日志

  • 无响应*
643ylb08

643ylb081#

你好,Michael,这是一个很好的问题。
LSP在这里并没有一个明确的观点:它的“代码操作”RPC请求所选区域的可用命令集。如果客户端调用其中一个命令,它会产生一个副作用,即使服务器向客户端发送一个“应用编辑”下行调用。因此,没有什么阻止服务器在所选区域内为每个函数调用提供一个“内联”代码操作,但如果代码操作菜单有数百个可能的替代“内联”操作,那么对用户来说会很困惑。这就是为什么我们只在选择位于函数调用内部时提供一个内联代码操作的原因。
但是我认为你在寻求一种方法,可以在区域内对特定函数的所有调用中“应用所有”内联命令,这似乎是一个合理的操作。只是对我来说,如何最好地暴露它并不明显。我们可以检测在同一源文件中有多个ReadFile调用,如果是这样的话,就提供“内联”和“内联所有ReadFile调用”。但是为什么要止步于文件呢?包或模块呢?
或者工作区:我们有一个打开的feature request用于执行“内联操作”,该操作将内联通过'引用'查询找到的每个ReadFile调用。我想知道那是否是你真正想要的功能。
还有一个混淆的因素,那就是复杂的内联并不总是组合在一起,但我怀疑在实践中像ReadFile这样的简单情况下,编辑都是非冲突的。

ovfsdjhp

ovfsdjhp2#

啊!是的,确实,对我来说,内联所有引用效果很好。
inline-all-in-region 仍然具有一定的价值(因为它可以逐步迁移),
但 inline-all-references 可能是一个更重要的功能,值得关注 :)
谢谢

相关问题