go/parser:在返回类型中缺少结构体/接口后的大括号时,错误信息不一致 ```markdown go/parser: 在返回类型中缺少结构体/接口后的大括号时,错误信息不一致, ```

oewdyzsn  于 8个月前  发布在  Go
关注(0)|答案(2)|浏览(141)

请在提交问题之前回答以下问题。谢谢!

你做了什么?

三个文件。what.go :

  1. package what
  2. func doSomething() {
  3. var s SomeStruct
  4. _ = s.StringAbove()
  5. _ = s.StringBelow()
  6. }
  7. type SomeStruct struct {
  8. readyChan chan struct{}
  9. }
  10. // StringAbove is a function above ready().
  11. func (s *SomeStruct) StringAbove() string {
  12. return "SomeStruct"
  13. }
  14. func (s *SomeStruct) ready() chan struct{} {
  15. return s.readyChan
  16. }
  17. // StringBelow is a function below ready()
  18. func (s *SomeStruct) StringBelow() string {
  19. return "SomeStruct"
  20. }
  21. type OtherType struct {
  22. v string
  23. }
  24. func (o OtherType) String() string {
  25. return o.v
  26. }

what_test.go

  1. package what_test
  2. import (
  3. "testing"
  4. "what"
  5. )
  6. func TestSomething(t *testing.T) {
  7. var s what.SomeStruct
  8. _ = s.StringAbove()
  9. _ = s.StringBelow()
  10. }
  11. func TestOther(t *testing.T) {
  12. var o what.OtherType
  13. _ = o.String()
  14. }

what_test2.go

  1. package what
  2. import (
  3. "testing"
  4. )
  5. func TestSomething2(t *testing.T) {
  6. var s SomeStruct
  7. _ = s.StringAbove()
  8. _ = s.StringBelow()
  9. }
  10. func TestOther2(t *testing.T) {
  11. var o OtherType
  12. _ = o.String()
  13. }

现在,从 ready 的返回值中删除 struct 后的 {}

你期望看到什么?

最好能从这种状况中恢复过来(这可能是另一个关于如何处理这些解析问题的问题),并且与该问题一致的诊断信息。

你看到了什么?

没有恢复,所以之后的所有内容都出了问题。但是,这只对那一种类型有效,而且事物的诊断/悬停行为相当不一致。
屏幕录制:https://streamable.com/xc1k0
https://gist.github.com/zikaeroh/e752451719bff6020ba8a981678c9184

构建信息
  1. golang.org/x/tools/gopls master
  2. golang.org/x/tools/gopls@v0.1.8-0.20200116062425-473961ec044c h1:1TIoDnmETx0ZptB3IkN+lN1z/gkfEtlCEjQmD51vhsM=
  3. github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
  4. github.com/sergi/go-diff@v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
  5. golang.org/x/mod@v0.1.1-0.20191105210325-c90efee705ee h1:WG0RUwxtNT4qqaXX3DPA8zHFNm/D9xaBpxzHt1WcA/E=
  6. golang.org/x/sync@v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
  7. golang.org/x/tools@v0.0.0-20200116062425-473961ec044c h1:D0OxfnjPaEGt7AluXNompYUYGhoY3u6+bValgqfd1vE=
  8. golang.org/x/xerrors@v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
  9. honnef.co/go/tools@v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
  10. mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
Go信息
  1. go version go1.13.6 linux/amd64
  2. GO111MODULE=""
  3. GOARCH="amd64"
  4. GOBIN=""
  5. GOCACHE="/home/jake/.cache/go-build"
  6. GOENV="/home/jake/.config/go/env"
  7. GOEXE=""
  8. GOFLAGS=""
  9. GOHOSTARCH="amd64"
  10. GOHOSTOS="linux"
  11. GONOPROXY=""
  12. GONOSUMDB=""
  13. GOOS="linux"
  14. GOPATH="/home/jake/go"
  15. GOPRIVATE=""
  16. GOPROXY="https://proxy.golang.org,direct"
  17. GOROOT="/usr/lib/go"
  18. GOSUMDB="sum.golang.org"
  19. GOTMPDIR=""
  20. GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
  21. GCCGO="gccgo"
  22. AR="ar"
  23. CC="gcc"
  24. CXX="g++"
  25. CGO_ENABLED="1"
  26. GOMOD="/home/jake/testproj/what/go.mod"
  27. CGO_CFLAGS="-g -O2"
  28. CGO_CPPFLAGS=""
  29. CGO_CXXFLAGS="-g -O2"
  30. CGO_FFLAGS="-g -O2"
  31. CGO_LDFLAGS="-g -O2"
  32. PKG_CONFIG="pkg-config"
  33. GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build340140430=/tmp/go-build -gno-record-gcc-switches"
kpbwa7wx

kpbwa7wx1#

感谢报告。这与go/parser的常见模式相符,即它无法恢复并导致以下断点下方定义的所有符号变为未定义。我不确定解析器中是否会很快修复这个问题,但我会将此问题归类到go/parser下。

gopyfrb3

gopyfrb32#

https://golang.org/cl/259817提到了这个问题:go/parser: Improve error when interface or struct parsing fails

相关问题