Consider a Go project with main.go
looking like this:
package main
import (
"fmt"
"github.com/google/uuid"
)
func main() {
id := uuid.New()
fmt.Println(id)
}
When I go to definition (F12) of uuid.New()
I end up here:
func New() UUID {
return Must(NewRandom())
}
So far so good.
But when I try to navigate futher to Must
or NewRandom
, I get a popup "No definition found...".
Whereas if I navigate to fmt.Println
, I can navigate further into Fprintln
, doPrintln
, writeByte
, etc.
Why is this difference in behavior between Go SDK packages and imported modules?
Shouldn't I be able to navigate within modules the same way I do in my own code and the Go SDK?
gopls version: v0.15.2
go version: 1.22
The full test project can be found at https://github.com/rustyx/issue-66827
7条答案
按热度按时间2g32fytz1#
我想知道这是否与#53004有关。
6gpjuf902#
cc: @findleyr
2fjabf4q3#
对不起,但这对我来说没有复现,无论是在VS Code还是coc.nvim中。(编辑:澄清一下:我的两个测试客户端都表现得像预期的那样,我可以导航到Must、NewRandom等)
你正在使用哪个LSP客户端?你能也分享一下
gopls -v version
的输出吗?v9tzhpje4#
我拥有最新的
gopls
。gopls -v version
对于造成的困惑,实际上问题是在我将
go/pkg/mod
文件夹添加到当前工作区后才出现的。尝试以下 重现步骤 :
$HOME/go/pkg/mod/
添加到工作区。main.go
,将光标放在uuid.New()
上,按 F12,然后在NewRandom()
上再次按 F12。vcirk6k65#
LSP客户端是VSCode(v1.88.1),运行在Ubuntu Linux 22.04 amd64上。再次为没有提前提及这一点道歉。我认为这个问题仅限于VSCode,并且当前工作区中将go/pkg/modMap为项目。
我当前的LSP会话状态如下:
会话1
来源:缓存1
视图
ID:1
类型:GoModView
根:file:///home/user/src/issue-66827
文件夹:issue-66827:file:///home/user/src/issue-66827
ID:2
类型:AdHocView
根:file:///home/user/go/pkg/mod
文件夹:mod:file:///home/user/go/pkg/mod
ID:4
类型:GoModView
根:file:///home/user/go/pkg/mod/github.com/google/uuid@v1.6.0
文件夹:mod:file:///home/user/go/pkg/mod
覆盖层
file:///home/user/go/pkg/mod/github.com/google/uuid@v1.6.0/version4.go
file:///home/user/src/issue-66827/main.go
dojqjjoe6#
这个问题只有在将$HOME/go/pkg/mod/添加到工作区时才会重复出现。看起来gopls没有处理模块缓存,而且这可能不是导航函数定义的推荐方式。
fnatzsnv7#
确实,我会检查我们是否正确处理了这个问题。由于这不太可能影响大量用户,我将把它移到未来的发布里程碑。