x/tools/gopls:功能:替代“引用”查询,报告隐含的对结构字段(等)的引用,

rbpvctlc  于 7个月前  发布在  Go
关注(0)|答案(7)|浏览(56)

gopls版本

gopls 0.14.2 来自nixpkgs: /nix/store/1spk3fici3mrggasy75w31y0yvqlrk08-gopls-0.14.2/bin/gopls

$ gopls -v version
Build info
----------
golang.org/x/tools/gopls (devel)
    golang.org/x/tools/gopls@(devel)
    github.com/BurntSushi/toml@v1.2.1
    github.com/google/go-cmp@v0.5.9
    github.com/sergi/go-diff@v1.1.0
    golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338
    golang.org/x/mod@v0.14.0
    golang.org/x/sync@v0.4.0
    golang.org/x/sys@v0.14.0
    golang.org/x/telemetry@v0.0.0-20231114163143-69313e640400
    golang.org/x/text@v0.13.0
    golang.org/x/tools@v0.14.1-0.20231114185516-c9d3e7de13fd
    golang.org/x/vuln@v1.0.1
    honnef.co/go/tools@v0.4.5
    mvdan.cc/gofumpt@v0.4.0
    mvdan.cc/xurls/v2@v2.4.0
go: go1.21.6

go环境

GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/home/me/.cache/go-build'
GOENV='/home/me/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='linux'
GOINSECURE=''
GOMODCACHE='/home/me/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='linux'
GOPATH='/home/me/go'
GOPRIVATE=''
GOPROXY='direct'
GOROOT='/nix/store/cw9dqybf9w6wp7827h23pb3ym8gs8h47-go-1.21.6/share/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/nix/store/cw9dqybf9w6wp7827h23pb3ym8gs8h47-go-1.21.6/share/go/pkg/tool/linux_amd64'
GOVCS=''
GOVERSION='go1.21.6'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/home/me/Code/blocky/go.mod'
GOWORK='/home/me/Code/blocky/go.work'
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=/run/user/1000/go-build2624082058=/tmp/go-build -gno-record-gcc-switches'

你做了什么?

package main

type T struct{ field int }

func main() {
	_ = T{0}
}

你看到了什么?

搜索field的引用时,没有检测到T字面量。

你期望看到什么?

包含该字面量的列表。

编辑器和设置

N/A

日志

  • 无响应*
gpnt7bae

gpnt7bae1#

这是有趣的。我们可以完全匹配这个参考,我认为这会很有用。我们应该尝试这样做。暂时将v0.17.0里程碑放进去,因为v0.16正在填满。
CC @adonovan

kmbjn2e3

kmbjn2e32#

FWIW,内嵌提示显示字段名称,因此信息已经以某种方式连接到其他地方。

mbskvtky

mbskvtky3#

通过设计,gopls的引用算法报告了引用给定符号的标识符的位置,而在您的示例中没有字段标识符。因此,该操作按预期工作。

该算法并未报告其他地方出现的许多隐式引用类型,除了您的示例之外,还包括以下引用:

  • 指向匿名字段,在x.f是x.a.b.c.f的简写形式的选择中;
  • 指向参数,当在函数调用中传递参数值时;
  • 指向命名结果值,在空返回语句中;
  • 指向类型,在涉及隐式转换x = T(y)的赋值x = y中;

我们已经讨论过并请求了不同类型的“引用”查询,这些查询不是通过通常的LSP“引用”操作调用的。例如:显示所有访问此结构字段或切片元素的地方,即使是隐式的。很容易将查询定义为代码操作(在VS Code中的“源操作...”);主要挑战是缺乏一种方法来向客户端传达此操作的结果是一个带有注解的源位置列表,应该使用与真正的引用查询几乎相同的UI元素进行显示。我认为我们应该游说将此类功能包含到LSP中。

sgtfey8w

sgtfey8w4#

感谢您的详尽回复。
我理解您的观点,并同意大多数例子,但不同意将“标识符是拼写的”应该是一个硬性规则,认为每个案例都值得从“这是否为用户带来价值”和“这种价值是否值得付出工作/复杂度”的Angular 进行审查。
也许预期的使用场景可以激励一些规则的弯曲?它正在寻找所有分配给一个字段的任务,而ATM无法轻松完成,因为您需要检查所有字段引用+所有结构体引用。而且在我看来,进行第二次搜索并不直观。
我认为我们应该游说将这样的功能纳入LSP。
我同意,拥有多种类型的符号搜索肯定会很有用。

dpiehjr4

dpiehjr45#

我理解你的观点,并同意大多数例子,但不同意将“标识符是拼写的”视为硬性规则,我认为每个案例都值得从“这是否为用户带来价值”和“这种价值是否值得付出工作/复杂度”的Angular 进行审查。
如果用户要求查看关于“foo”的引用,而结果中包含一行不包含foo的文本,那么许多用户可能会感到惊讶。为了这个功能的更好用户体验,一个更好的查询报告应该在注解位置添加一条评论,例如“隐式选择字段foo”。但同样,这需要LSP的更改。

cclgggtu

cclgggtu6#

至少在这种情况下,你得到了一些信息,所以你需要问自己一个问题。当前的情况并没有让你面对任何事情,你很可能会错过一些你正在寻找的示例。
编辑:另外,内嵌提示也让它变得非常明显。
无论如何,如果你不打算实现我最初打开的问题,请随意关闭或重新调整到其他内容。

kx7yvsdv

kx7yvsdv7#

我已经为通用引用查询的LSP支持提交了microsoft/language-server-protocol#1911上游请求。

相关问题