x/tools/gopls: 无法为自动补全选择"正确的"值预算

2ul0zpep  于 6个月前  发布在  Go
关注(0)|答案(2)|浏览(44)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.21.1 linux/arm64
$ go list -m golang.org/x/tools
golang.org/x/tools v0.14.1-0.20231008020826-a3b5082fb05e
$ go list -m golang.org/x/tools/gopls
golang.org/x/tools/gopls v0.0.0-20231008020826-a3b5082fb05e

这个问题在最新的版本中是否重现?
是的
你正在使用什么操作系统和处理器架构( go env )?
go env 输出

$ go env
GO111MODULE='on'
GOARCH='arm64'
GOBIN=''
GOCACHE='/home/myitcv/.cache/go-build'
GOENV='/home/myitcv/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/myitcv/gostuff/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/myitcv/gostuff'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/home/myitcv/gos'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/home/myitcv/gos/pkg/tool/linux_arm64'
GOVCS=''
GOVERSION='go1.21.1'
GCCGO='gccgo'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/home/myitcv/gostuff/src/github.com/myitcv/govim/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 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build3782877243=/tmp/go-build -gno-record-gcc-switches'

你做了什么?
https://gophers.slack.com/archives/CRWSN9NCD/p1696429330059839 开始对话
为了下面的讨论,这里有两个示例补全:

示例1: 一个合格的标识符,未导入的补全:

package main

func main() {
    load.Ins_
}

这应该解析为 cuelang.org/go/cue/load.Instances

示例2: 一个未限定的补全:

package main

func main() {
    str_
}

根据我在Slack上与@findleyr的交流,我对 completionBudget 当前语义的理解如下:

  • completionBudget 需要设置为一个“高”值,以便未导入的补全(形式如示例1)不会超时,尤其是在从冷缓存加载后,但不限于此。一个大模块缓存实际上“迫使”我们在这种情况下设置一个“高”值,因为扫描和搜索模块缓存的成本。
  • completionBudget 需要设置为一个“低”值,以便未限定的补全(形式如示例2)不会花费很长时间。根据@findleyr的说法:

问题在于,这个简单的补全与一个非常不简单的补全捆绑在一起,该补全扫描模块缓存。
问题:如果我选择一个“高”值,那么示例2风格的补全可能需要约200-250ms...这是非常明显和令人讨厌的,尤其是当编辑器请求多个候选项作为补全建议时。如果我选择一个“低”值,那么我无法在所有情况下获得像示例1那样的未导入补全。
因此我无法选择“正确的”值。
你期望看到什么?
能够设置一个既满足案例1又满足案例2的 completionBudget
你看到了什么?
上面的情况。
根据@findleyr在Slack上的评论:
我认为首先我们需要将这两个补全区分开来,这样无论你的补全预算有多短,你总是可以在标识符上下文中获得简单的包名补全。

sirbozc5

sirbozc51#

https://go.dev/cl/560457提到了这个问题:gopls/internal/test/integration/bench: improve completion benchmarks

zdwk9cvp

zdwk9cvp2#

https://go.dev/cl/560458提到了这个问题:internal/imports: cache canonizalization

相关问题