Skip to content

go/parser: inconsistent error messages when missing braces after struct/interface in return type #36595

@zikaeroh

Description

@zikaeroh

Please answer these questions before submitting your issue. Thanks!

What did you do?

Three files. 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()
}

Now, remove the {} after struct in ready's return value.

What did you expect to see?

Preferably, recovery from this situation (that might be another issue about how to deal with these parsing issues), and consistent-ish diagnostics with the issue.

What did you see instead?

No recovery, so everything that comes after is broken. But, it's only for that one type, and the diagnostics / hover behavior of things is pretty inconsistent.

A screencast: https://streamable.com/xc1k0

https://gist.github.com/zikaeroh/e752451719bff6020ba8a981678c9184

Build info

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 info

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"

Metadata

Metadata

Assignees

No one assigned

    Labels

    NeedsFixThe path to resolution is known, but the work has not been done.gopls/parsingIssues related to parsing / poor parser recovery.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions