x/tools/gopls: 在某些情况下,自动补全功能无法正常工作,

3hvapo4f  于 6个月前  发布在  Go
关注(0)|答案(6)|浏览(58)

gopls版本

v0.14.2

go环境

set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\worlpaker\AppData\Local\go-build
set GOENV=C:\Users\worlpaker\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\worlpaker\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\worlpaker\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLCHAIN=auto
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.21.6
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set GOWORK=
set CGO_CFLAGS=-O2 -g
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-O2 -g
set CGO_FFLAGS=-O2 -g
set CGO_LDFLAGS=-O2 -g
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=C:\Users\worlpaker\AppData\Local\Temp\go-build2689359370=/tmp/go-build -gno-record-gcc-switches

你做了什么?

在某些情况下,自动补全功能无法正常工作。

逗号后的变量补全:

package main

func main(){
	minimum, maximum := 0, 0
	minimum, max
}

演示

test.mp4

你看到了什么?

max 的补全变成了 maxmaximum

你期望看到什么?

max 的补全应该是 maximum

编辑器和设置

  • 无响应*

日志

  • 无响应*
v1l68za4

v1l68za41#

当源代码存在语法错误时,也会出现这种情况:括号内缺少逗号或意外地在括号内放置了逗号。

缺少逗号:

package main

import "fmt"

func main() {
	value := 0
	fmt.Println("value:" val)
}

val 的补全将是 valvalue

意外地放置逗号:

#58833 中也有类似的问题

package main

import (
	"fmt"
	"math"
)

func main() {
	math.Sqrt(,0)
	math.ab
}

math.ab 的补全将是 math.abmath.Abs()

bfnvny8b

bfnvny8b2#

https://go.dev/cl/561417提到了这个问题:gopls/internal/golang/completion: fix completion behavior when the source has syntax errors

w6mmgewl

w6mmgewl3#

谢谢。这看起来像是#58833的重复,对吗?
感谢深入研究这个问题并着手修复!正如在CL上所评论的,解释如何处理语法错误的理论会很有帮助。

rpppsulh

rpppsulh4#

是的,尽管第一个场景(max<>)在逻辑上没有语法错误。

bkhjykvo

bkhjykvo5#

谢谢。值得注意的是,第一个场景确实存在语法错误(例如https://go.dev/play/p/lVxgY6Dczjf指出了一个语法错误)。

e1xvtsh3

e1xvtsh36#

我会查看修复。我们可以保持这个问题开放,因为另一个问题是关于go/parser的。

相关问题