]> Cypherpunks repositories - gostls13.git/commitdiff
go/parser: don't do method receiver checks at parse-time
authorRobert Griesemer <gri@golang.org>
Thu, 7 Aug 2014 19:45:01 +0000 (12:45 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 7 Aug 2014 19:45:01 +0000 (12:45 -0700)
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

src/pkg/go/parser/parser.go

index 8291f3f42dff36e7f5988a68e5d06460fe49547b..4d6f36258c53fd4533591836437f4ebd41163087 100644 (file)
@@ -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()