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

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

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

你做了什么?

三个文件。what.go :

package what

func doSomething() {
	var s SomeStruct
	_ = s.StringAbove()
	_ = s.StringBelow()
}

type SomeStruct struct {
	readyChan chan struct{}
}

// StringAbove is a function above ready().
func (s *SomeStruct) StringAbove() string {
	return "SomeStruct"
}

func (s *SomeStruct) ready() chan struct{} {
	return s.readyChan
}

// StringBelow is a function below ready()
func (s *SomeStruct) StringBelow() string {
	return "SomeStruct"
}

type OtherType struct {
	v string
}

func (o OtherType) String() string {
	return o.v
}

what_test.go

package what_test

import (
	"testing"
	"what"
)

func TestSomething(t *testing.T) {
	var s what.SomeStruct
	_ = s.StringAbove()
	_ = s.StringBelow()
}

func TestOther(t *testing.T) {
	var o what.OtherType
	_ = o.String()
}

what_test2.go

package what

import (
	"testing"
)

func TestSomething2(t *testing.T) {
	var s SomeStruct
	_ = s.StringAbove()
	_ = s.StringBelow()
}

func TestOther2(t *testing.T) {
	var o OtherType
	_ = o.String()
}

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

你期望看到什么?

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

你看到了什么?

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

构建信息
golang.org/x/tools/gopls master
    golang.org/x/tools/gopls@v0.1.8-0.20200116062425-473961ec044c h1:1TIoDnmETx0ZptB3IkN+lN1z/gkfEtlCEjQmD51vhsM=
    github.com/BurntSushi/toml@v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
    github.com/sergi/go-diff@v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
    golang.org/x/mod@v0.1.1-0.20191105210325-c90efee705ee h1:WG0RUwxtNT4qqaXX3DPA8zHFNm/D9xaBpxzHt1WcA/E=
    golang.org/x/sync@v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU=
    golang.org/x/tools@v0.0.0-20200116062425-473961ec044c h1:D0OxfnjPaEGt7AluXNompYUYGhoY3u6+bValgqfd1vE=
    golang.org/x/xerrors@v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA=
    honnef.co/go/tools@v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
    mvdan.cc/xurls/v2@v2.1.0 h1:KaMb5GLhlcSX+e+qhbRJODnUUBvlw01jt4yrjFIHAuA=
Go信息
go version go1.13.6 linux/amd64

GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/jake/.cache/go-build"
GOENV="/home/jake/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/jake/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/jake/testproj/what/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
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

相关问题