aboutsummaryrefslogtreecommitdiff
path: root/src/pkg
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2014-08-07 12:45:01 -0700
committerRobert Griesemer <gri@golang.org>2014-08-07 12:45:01 -0700
commita3c0ca54b01284af40e684422a739d41b4cb9cfe (patch)
tree0b97f4dde4b8a55eee0956529c1ca389f44bfae7 /src/pkg
parent7fdb0292a5e322c302b5ab685d8ee2623a69608a (diff)
downloadgo-a3c0ca54b01284af40e684422a739d41b4cb9cfe.tar.xz
go/parser: don't do method receiver checks at parse-time
The ast and printer don't care, and go/types can provide a better error message. This change requires an update to the tests for go/types (go.tools repo). CL forthcoming. Fixes #8493. LGTM=adonovan R=rsc, adonovan CC=golang-codereviews https://golang.org/cl/123010044
Diffstat (limited to 'src/pkg')
-rw-r--r--src/pkg/go/parser/parser.go32
1 files changed, 1 insertions, 31 deletions
diff --git a/src/pkg/go/parser/parser.go b/src/pkg/go/parser/parser.go
index 8291f3f42d..4d6f36258c 100644
--- a/src/pkg/go/parser/parser.go
+++ b/src/pkg/go/parser/parser.go
@@ -2307,36 +2307,6 @@ func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.Gen
}
}
-func (p *parser) parseReceiver(scope *ast.Scope) *ast.FieldList {
- if p.trace {
- defer un(trace(p, "Receiver"))
- }
-
- par := p.parseParameters(scope, false)
-
- // must have exactly one receiver
- if par.NumFields() != 1 {
- p.errorExpected(par.Opening, "exactly one receiver")
- par.List = []*ast.Field{{Type: &ast.BadExpr{From: par.Opening, To: par.Closing + 1}}}
- return par
- }
-
- // recv type must be of the form ["*"] identifier, possibly using parentheses
- recv := par.List[0]
- base := unparen(deref(unparen(recv.Type)))
- if _, isIdent := base.(*ast.Ident); !isIdent {
- if _, isBad := base.(*ast.BadExpr); !isBad {
- // only report error if it's a new one
- p.errorExpected(base.Pos(), "(unqualified) identifier")
- }
- par.List = []*ast.Field{
- {Type: &ast.BadExpr{From: recv.Pos(), To: p.safePos(recv.End())}},
- }
- }
-
- return par
-}
-
func (p *parser) parseFuncDecl() *ast.FuncDecl {
if p.trace {
defer un(trace(p, "FunctionDecl"))
@@ -2348,7 +2318,7 @@ func (p *parser) parseFuncDecl() *ast.FuncDecl {
var recv *ast.FieldList
if p.tok == token.LPAREN {
- recv = p.parseReceiver(scope)
+ recv = p.parseParameters(scope, false)
}
ident := p.parseIdent()