From 429edcff1049899cef4e3c5cb4b473e13a31d85c Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Fri, 4 Nov 2016 16:27:31 -0700 Subject: [PATCH] Revert "cmd/compile/internal/syntax: support for alias declarations" This reverts commit 32db3f2756324616b7c856ac9501deccc2491239. Reason: Decision to back out current alias implementation. For #16339. Change-Id: Ib05e3d96041d8347e49cae292f66bec791a1fdc8 Reviewed-on: https://go-review.googlesource.com/32825 Reviewed-by: Matthew Dempsky --- src/cmd/compile/internal/syntax/nodes.go | 31 ------ src/cmd/compile/internal/syntax/parser.go | 98 ++++++------------- src/cmd/compile/internal/syntax/printer.go | 14 +-- src/cmd/compile/internal/syntax/scanner.go | 9 +- .../compile/internal/syntax/scanner_test.go | 3 +- src/cmd/compile/internal/syntax/tokens.go | 12 +-- 6 files changed, 38 insertions(+), 129 deletions(-) diff --git a/src/cmd/compile/internal/syntax/nodes.go b/src/cmd/compile/internal/syntax/nodes.go index b88d16e113..bb56df33b1 100644 --- a/src/cmd/compile/internal/syntax/nodes.go +++ b/src/cmd/compile/internal/syntax/nodes.go @@ -25,21 +25,14 @@ func (n *node) Line() uint32 { return n.line } -// TODO(gri) clean up init/initFrom once we have a good file pos story func (n *node) init(p *parser) { n.pos = uint32(p.pos) n.line = uint32(p.line) } -func (n *node) initFrom(a *node) { - n.pos = a.pos - n.line = a.line -} - // ---------------------------------------------------------------------------- // Files -// package PkgName; DeclList[0], DeclList[1], ... type File struct { PkgName *Name DeclList []Decl @@ -56,8 +49,6 @@ type ( aDecl() } - // Path - // LocalPkgName Path ImportDecl struct { LocalPkgName *Name // including "."; nil means no rename present Path *BasicLit @@ -65,18 +56,6 @@ type ( decl } - // Name => Orig - AliasDecl struct { - Tok token // Const, Type, Var, or Func - Name *Name - Orig Expr - Group *Group // nil means not part of a group - decl - } - - // NameList - // NameList = Values - // NameList Type = Values ConstDecl struct { NameList []*Name Type Expr // nil means no type @@ -85,7 +64,6 @@ type ( decl } - // Name Type TypeDecl struct { Name *Name Type Expr @@ -94,9 +72,6 @@ type ( decl } - // NameList Type - // NameList Type = Values - // NameList = Values VarDecl struct { NameList []*Name Type Expr // nil means no type @@ -105,10 +80,6 @@ type ( decl } - // func Name Type { Body } - // func Name Type - // func Receiver Name Type { Body } - // func Receiver Name Type FuncDecl struct { Attr map[string]bool // go:attr map Recv *Field // nil means regular function @@ -448,8 +419,6 @@ func (simpleStmt) aSimpleStmt() {} // ---------------------------------------------------------------------------- // Comments -// TODO(gri) Consider renaming to CommentPos, CommentPlacement, etc. -// Kind = Above doesn't make much sense. type CommentKind uint const ( diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index 1ed20651b1..a959c6cd25 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -317,38 +317,16 @@ func (p *parser) importDecl(group *Group) Decl { return d } -// AliasSpec = identifier "=>" [ PackageName "." ] identifier . -func (p *parser) aliasDecl(tok token, name *Name, group *Group) Decl { - // no tracing since this is already called from a const/type/var/funcDecl - - d := new(AliasDecl) - d.initFrom(&name.node) - - // lhs identifier and "=>" have been consumed already - - d.Tok = tok - d.Name = name - d.Orig = p.dotname(p.name()) - d.Group = group - - return d -} - -// ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] | AliasSpec . +// ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] . func (p *parser) constDecl(group *Group) Decl { if trace { defer p.trace("constDecl")() } - name := p.name() - if p.got(_Rarrow) { - return p.aliasDecl(Const, name, group) - } - d := new(ConstDecl) - d.initFrom(&name.node) + d.init(p) - d.NameList = p.nameList(name) + d.NameList = p.nameList(p.name()) if p.tok != _EOF && p.tok != _Semi && p.tok != _Rparen { d.Type = p.tryType() if p.got(_Assign) { @@ -360,21 +338,16 @@ func (p *parser) constDecl(group *Group) Decl { return d } -// TypeSpec = identifier Type | AliasSpec . +// TypeSpec = identifier Type . func (p *parser) typeDecl(group *Group) Decl { if trace { defer p.trace("typeDecl")() } - name := p.name() - if p.got(_Rarrow) { - return p.aliasDecl(Type, name, group) - } - d := new(TypeDecl) - d.initFrom(&name.node) + d.init(p) - d.Name = name + d.Name = p.name() d.Type = p.tryType() if d.Type == nil { p.syntax_error("in type declaration") @@ -386,21 +359,16 @@ func (p *parser) typeDecl(group *Group) Decl { return d } -// VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) | AliasSpec . +// VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) . func (p *parser) varDecl(group *Group) Decl { if trace { defer p.trace("varDecl")() } - name := p.name() - if p.got(_Rarrow) { - return p.aliasDecl(Var, name, group) - } - d := new(VarDecl) - d.initFrom(&name.node) + d.init(p) - d.NameList = p.nameList(name) + d.NameList = p.nameList(p.name()) if p.got(_Assign) { d.Values = p.exprList() } else { @@ -417,28 +385,31 @@ func (p *parser) varDecl(group *Group) Decl { return d } -var badRecv = new(Field) // to signal invalid receiver in funcDecl - -// FunctionDecl = "func" FunctionName ( Function | Signature ) | "func" AliasSpec . +// FunctionDecl = "func" FunctionName ( Function | Signature ) . // FunctionName = identifier . // Function = Signature FunctionBody . // MethodDecl = "func" Receiver MethodName ( Function | Signature ) . // Receiver = Parameters . -func (p *parser) funcDecl() Decl { +func (p *parser) funcDecl() *FuncDecl { if trace { defer p.trace("funcDecl")() } - var recv *Field + f := new(FuncDecl) + f.init(p) + + badRecv := false if p.tok == _Lparen { - recv = badRecv - switch list := p.paramList(); len(list) { + rcvr := p.paramList() + switch len(rcvr) { case 0: p.error("method has no receiver") + badRecv = true case 1: - recv = list[0] + f.Recv = rcvr[0] default: p.error("method has multiple receivers") + badRecv = true } } @@ -448,11 +419,6 @@ func (p *parser) funcDecl() Decl { return nil } - name := p.name() - if recv == nil && p.got(_Rarrow) { - return p.aliasDecl(Func, name, nil) - } - // TODO(gri) check for regular functions only // if name.Sym.Name == "init" { // name = renameinit() @@ -467,11 +433,7 @@ func (p *parser) funcDecl() Decl { // } // } - f := new(FuncDecl) - f.initFrom(&name.node) // TODO(gri) is this the correct position for methods? - - f.Recv = recv - f.Name = name + f.Name = p.name() f.Type = p.funcType() if gcCompat { f.node = f.Type.node @@ -486,7 +448,7 @@ func (p *parser) funcDecl() Decl { // p.error("can only use //go:noescape with external func implementations") // } - if recv == badRecv { + if badRecv { return nil // TODO(gri) better solution } return f @@ -555,7 +517,7 @@ func (p *parser) unaryExpr() Expr { return x } - case _Larrow: + case _Arrow: // receive op (<-x) or receive-only channel (<-chan E) p.next() @@ -969,7 +931,7 @@ func (p *parser) tryType() Expr { p.next() return indirect(p.type_()) - case _Larrow: + case _Arrow: // recvchantype p.next() p.want(_Chan) @@ -1015,7 +977,7 @@ func (p *parser) tryType() Expr { p.next() t := new(ChanType) t.init(p) - if p.got(_Larrow) { + if p.got(_Arrow) { t.Dir = SendOnly } t.Elem = p.chanElem() @@ -1358,7 +1320,7 @@ func (p *parser) paramDecl() *Field { case _Name: f.Name = p.name() switch p.tok { - case _Name, _Star, _Larrow, _Func, _Lbrack, _Chan, _Map, _Struct, _Interface, _Lparen: + case _Name, _Star, _Arrow, _Func, _Lbrack, _Chan, _Map, _Struct, _Interface, _Lparen: // sym name_or_type f.Type = p.type_() @@ -1373,7 +1335,7 @@ func (p *parser) paramDecl() *Field { f.Name = nil } - case _Larrow, _Star, _Func, _Lbrack, _Chan, _Map, _Struct, _Interface, _Lparen: + case _Arrow, _Star, _Func, _Lbrack, _Chan, _Map, _Struct, _Interface, _Lparen: // name_or_type f.Type = p.type_() @@ -1507,7 +1469,7 @@ func (p *parser) simpleStmt(lhs Expr, rangeOk bool) SimpleStmt { p.next() return p.newAssignStmt(op, lhs, ImplicitOne) - case _Larrow: + case _Arrow: // lhs <- rhs p.next() s := new(SendStmt) @@ -1860,7 +1822,7 @@ func (p *parser) commClause() *CommClause { p.next() lhs := p.exprList() - if _, ok := lhs.(*ListExpr); !ok && p.tok == _Larrow { + if _, ok := lhs.(*ListExpr); !ok && p.tok == _Arrow { // lhs <- x } else { // lhs @@ -1940,7 +1902,7 @@ func (p *parser) stmt() Stmt { case _Literal, _Func, _Lparen, // operands _Lbrack, _Struct, _Map, _Chan, _Interface, // composite types - _Larrow: // receive operator + _Arrow: // receive operator return p.simpleStmt(nil, false) case _For: diff --git a/src/cmd/compile/internal/syntax/printer.go b/src/cmd/compile/internal/syntax/printer.go index 8f12707304..0cacf1e5d4 100644 --- a/src/cmd/compile/internal/syntax/printer.go +++ b/src/cmd/compile/internal/syntax/printer.go @@ -473,11 +473,11 @@ func (p *printer) printRawNode(n Node) { case *ChanType: if n.Dir == RecvOnly { - p.print(_Larrow) + p.print(_Arrow) } p.print(_Chan) if n.Dir == SendOnly { - p.print(_Larrow) + p.print(_Arrow) } p.print(blank, n.Elem) @@ -495,7 +495,7 @@ func (p *printer) printRawNode(n Node) { p.print(n.X) case *SendStmt: - p.print(n.Chan, blank, _Larrow, blank, n.Value) + p.print(n.Chan, blank, _Arrow, blank, n.Value) case *AssignStmt: p.print(n.Lhs) @@ -603,12 +603,6 @@ func (p *printer) printRawNode(n Node) { } p.print(n.Path) - case *AliasDecl: - if n.Group == nil { - p.print(n.Tok, blank) - } - p.print(n.Name, blank, _Rarrow, blank, n.Orig) - case *ConstDecl: if n.Group == nil { p.print(_Const, blank) @@ -763,8 +757,6 @@ func groupFor(d Decl) (token, *Group) { switch d := d.(type) { case *ImportDecl: return _Import, d.Group - case *AliasDecl: - return d.Tok, d.Group case *ConstDecl: return _Const, d.Group case *TypeDecl: diff --git a/src/cmd/compile/internal/syntax/scanner.go b/src/cmd/compile/internal/syntax/scanner.go index bd38943c30..b84fcc5fd1 100644 --- a/src/cmd/compile/internal/syntax/scanner.go +++ b/src/cmd/compile/internal/syntax/scanner.go @@ -229,7 +229,7 @@ redo: goto assignop } if c == '-' { - s.tok = _Larrow + s.tok = _Arrow break } s.ungetr() @@ -253,16 +253,11 @@ redo: s.tok = _Operator case '=': - c = s.getr() - if c == '=' { + if s.getr() == '=' { s.op, s.prec = Eql, precCmp s.tok = _Operator break } - if c == '>' { - s.tok = _Rarrow - break - } s.ungetr() s.tok = _Assign diff --git a/src/cmd/compile/internal/syntax/scanner_test.go b/src/cmd/compile/internal/syntax/scanner_test.go index 0e0ff1b172..38a7e0da4c 100644 --- a/src/cmd/compile/internal/syntax/scanner_test.go +++ b/src/cmd/compile/internal/syntax/scanner_test.go @@ -210,8 +210,7 @@ var sampleTokens = [...]struct { {_IncOp, "--", Sub, precAdd}, {_Assign, "=", 0, 0}, {_Define, ":=", 0, 0}, - {_Larrow, "<-", 0, 0}, - {_Rarrow, "=>", 0, 0}, + {_Arrow, "<-", 0, 0}, // delimiters {_Lparen, "(", 0, 0}, diff --git a/src/cmd/compile/internal/syntax/tokens.go b/src/cmd/compile/internal/syntax/tokens.go index 4a02c0ce3b..bd0118a141 100644 --- a/src/cmd/compile/internal/syntax/tokens.go +++ b/src/cmd/compile/internal/syntax/tokens.go @@ -22,8 +22,7 @@ const ( _IncOp _Assign _Define - _Larrow - _Rarrow + _Arrow _Star // delimitors @@ -70,12 +69,6 @@ const ( ) const ( - // for AliasDecl - Const = _Const - Type = _Type - Var = _Var - Func = _Func - // for BranchStmt Break = _Break Continue = _Continue @@ -101,8 +94,7 @@ var tokstrings = [...]string{ _IncOp: "opop", _Assign: "=", _Define: ":=", - _Larrow: "<-", - _Rarrow: "=>", + _Arrow: "<-", _Star: "*", // delimitors