diff options
| author | Robert Griesemer <gri@golang.org> | 2014-08-07 12:45:01 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2014-08-07 12:45:01 -0700 |
| commit | a3c0ca54b01284af40e684422a739d41b4cb9cfe (patch) | |
| tree | 0b97f4dde4b8a55eee0956529c1ca389f44bfae7 /src/pkg | |
| parent | 7fdb0292a5e322c302b5ab685d8ee2623a69608a (diff) | |
| download | go-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.go | 32 |
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() |
