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
日志
- 无响应*
7条答案
按热度按时间gpnt7bae1#
这是有趣的。我们可以完全匹配这个参考,我认为这会很有用。我们应该尝试这样做。暂时将v0.17.0里程碑放进去,因为v0.16正在填满。
CC @adonovan
kmbjn2e32#
FWIW,内嵌提示显示字段名称,因此信息已经以某种方式连接到其他地方。
mbskvtky3#
通过设计,gopls的引用算法报告了引用给定符号的标识符的位置,而在您的示例中没有字段标识符。因此,该操作按预期工作。
该算法并未报告其他地方出现的许多隐式引用类型,除了您的示例之外,还包括以下引用:
我们已经讨论过并请求了不同类型的“引用”查询,这些查询不是通过通常的LSP“引用”操作调用的。例如:显示所有访问此结构字段或切片元素的地方,即使是隐式的。很容易将查询定义为代码操作(在VS Code中的“源操作...”);主要挑战是缺乏一种方法来向客户端传达此操作的结果是一个带有注解的源位置列表,应该使用与真正的引用查询几乎相同的UI元素进行显示。我认为我们应该游说将此类功能包含到LSP中。
sgtfey8w4#
感谢您的详尽回复。
我理解您的观点,并同意大多数例子,但不同意将“标识符是拼写的”应该是一个硬性规则,认为每个案例都值得从“这是否为用户带来价值”和“这种价值是否值得付出工作/复杂度”的Angular 进行审查。
也许预期的使用场景可以激励一些规则的弯曲?它正在寻找所有分配给一个字段的任务,而ATM无法轻松完成,因为您需要检查所有字段引用+所有结构体引用。而且在我看来,进行第二次搜索并不直观。
我认为我们应该游说将这样的功能纳入LSP。
我同意,拥有多种类型的符号搜索肯定会很有用。
dpiehjr45#
我理解你的观点,并同意大多数例子,但不同意将“标识符是拼写的”视为硬性规则,我认为每个案例都值得从“这是否为用户带来价值”和“这种价值是否值得付出工作/复杂度”的Angular 进行审查。
如果用户要求查看关于“foo”的引用,而结果中包含一行不包含foo的文本,那么许多用户可能会感到惊讶。为了这个功能的更好用户体验,一个更好的查询报告应该在注解位置添加一条评论,例如“隐式选择字段foo”。但同样,这需要LSP的更改。
cclgggtu6#
至少在这种情况下,你得到了一些信息,所以你需要问自己一个问题。当前的情况并没有让你面对任何事情,你很可能会错过一些你正在寻找的示例。
编辑:另外,内嵌提示也让它变得非常明显。
无论如何,如果你不打算实现我最初打开的问题,请随意关闭或重新调整到其他内容。
kx7yvsdv7#
我已经为通用引用查询的LSP支持提交了microsoft/language-server-protocol#1911上游请求。