x/tools/gopls:在导入的模块中跳转到定义

tktrz96b  于 6个月前  发布在  Go
关注(0)|答案(7)|浏览(47)

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

2g32fytz

2g32fytz1#

我想知道这是否与#53004有关。

2fjabf4q

2fjabf4q3#

对不起,但这对我来说没有复现,无论是在VS Code还是coc.nvim中。(编辑:澄清一下:我的两个测试客户端都表现得像预期的那样,我可以导航到Must、NewRandom等)

你正在使用哪个LSP客户端?你能也分享一下gopls -v version的输出吗?

v9tzhpje

v9tzhpje4#

我拥有最新的 gopls
gopls -v version

Build info
----------
golang.org/x/tools/gopls v0.15.3
    golang.org/x/tools/gopls@v0.15.3 h1:zbdOidFrPTc8Bx0YrN5QKgJ0zCjyGi0L27sKQ/bDG5o=
    github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
    github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
    golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=
    golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
    golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
    golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=
    golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
    golang.org/x/tools@v0.18.1-0.20240412183611-d92ae0781217 h1:uH9jJYgeLCvblH0S+03kFO0qUDxRkbLRLFiKVVDl7ak=
    golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=
    honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=
    mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=
    mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
go: go1.22.0

对于造成的困惑,实际上问题是在我将 go/pkg/mod 文件夹添加到当前工作区后才出现的。
尝试以下 重现步骤 :

  • 克隆仓库 https://github.com/rustyx/issue-66827
  • 转到 "Workspaces: Add Folder to Workspace..." 并将 $HOME/go/pkg/mod/ 添加到工作区。
  • 打开 main.go ,将光标放在 uuid.New() 上,按 F12,然后在 NewRandom() 上再次按 F12。
vcirk6k6

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

dojqjjoe

dojqjjoe6#

这个问题只有在将$HOME/go/pkg/mod/添加到工作区时才会重复出现。看起来gopls没有处理模块缓存,而且这可能不是导航函数定义的推荐方式。

fnatzsnv

fnatzsnv7#

确实,我会检查我们是否正确处理了这个问题。由于这不太可能影响大量用户,我将把它移到未来的发布里程碑。

相关问题