From: Robert Griesemer Date: Fri, 11 Dec 2020 05:16:02 +0000 (-0800) Subject: [dev.typeparams] cmd/compile/internal/syntax: export NewName and use it X-Git-Tag: go1.17beta1~1473^2~155 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3a912f279f;p=gostls13.git [dev.typeparams] cmd/compile/internal/syntax: export NewName and use it Most syntax.Nodes are allocated in one place and there didn't seem a need to provide factory methods - so as a matter of API design, all nodes are "naked", without any constructors. However, Name nodes are frequently used/replaced and also are created as helper nodes in clients (types2). Make an exception and export NewName. Change-Id: I4b5c499d65bba74592dea68b0936c118b3edaca7 Reviewed-on: https://go-review.googlesource.com/c/go/+/277572 Trust: Robert Griesemer Run-TryBot: Robert Griesemer TryBot-Result: Go Bot Reviewed-by: Robert Findley --- diff --git a/src/cmd/compile/internal/syntax/nodes.go b/src/cmd/compile/internal/syntax/nodes.go index 306e695a33..fe8f62c6e6 100644 --- a/src/cmd/compile/internal/syntax/nodes.go +++ b/src/cmd/compile/internal/syntax/nodes.go @@ -122,6 +122,13 @@ type Group struct { // ---------------------------------------------------------------------------- // Expressions +func NewName(pos Pos, value string) *Name { + n := new(Name) + n.pos = pos + n.Value = value + return n +} + type ( Expr interface { Node diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index dbec462ab1..4af7e462ed 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -533,7 +533,7 @@ func (p *parser) importDecl(group *Group) Decl { case _Name: d.LocalPkgName = p.name() case _Dot: - d.LocalPkgName = p.newName(".") + d.LocalPkgName = NewName(p.pos(), ".") p.next() } d.Path = p.oliteral() @@ -1409,9 +1409,7 @@ func (p *parser) interfaceType() *InterfaceType { case _Type: if p.mode&AllowGenerics != 0 { // TODO(gri) factor this better - type_ := new(Name) - type_.pos = p.pos() - type_.Value = "type" // cannot have a method named "type" + type_ := NewName(p.pos(), "type") // cannot have a method named "type" p.next() if p.tok != _Semi && p.tok != _Rbrace { f := new(Field) @@ -1833,9 +1831,7 @@ func (p *parser) paramList(name *Name, close token) (list []*Field) { typ = par.Type if par.Name == nil { pos = typ.Pos() - n := p.newName("_") - n.pos = pos // correct position - par.Name = n + par.Name = NewName(pos, "_") } } else if typ != nil { par.Type = typ @@ -2468,23 +2464,16 @@ func (p *parser) argList() (list []Expr, hasDots bool) { // ---------------------------------------------------------------------------- // Common productions -func (p *parser) newName(value string) *Name { - n := new(Name) - n.pos = p.pos() - n.Value = value - return n -} - func (p *parser) name() *Name { // no tracing to avoid overly verbose output if p.tok == _Name { - n := p.newName(p.lit) + n := NewName(p.pos(), p.lit) p.next() return n } - n := p.newName("_") + n := NewName(p.pos(), "_") p.syntaxError("expecting name") p.advance() return n @@ -2522,7 +2511,7 @@ func (p *parser) qualifiedName(name *Name) Expr { case p.tok == _Name: x = p.name() default: - x = p.newName("_") + x = NewName(p.pos(), "_") p.syntaxError("expecting name") p.advance(_Dot, _Semi, _Rbrace) } diff --git a/src/cmd/compile/internal/types2/resolver.go b/src/cmd/compile/internal/types2/resolver.go index b57b41e2b0..2e90e5781c 100644 --- a/src/cmd/compile/internal/types2/resolver.go +++ b/src/cmd/compile/internal/types2/resolver.go @@ -523,7 +523,7 @@ L: // unpack receiver type check.errorf(arg, "receiver type parameter %s must be an identifier", arg) } if par == nil { - par = newName(arg.Pos(), "_") + par = syntax.NewName(arg.Pos(), "_") } tparams = append(tparams, par) } diff --git a/src/cmd/compile/internal/types2/stmt.go b/src/cmd/compile/internal/types2/stmt.go index f1317fa0a3..477bc58bd0 100644 --- a/src/cmd/compile/internal/types2/stmt.go +++ b/src/cmd/compile/internal/types2/stmt.go @@ -596,14 +596,6 @@ func (check *Checker) stmt(ctxt stmtContext, s syntax.Stmt) { } } -func newName(pos syntax.Pos, value string) *syntax.Name { - n := new(syntax.Name) - // TODO(gri) why does this not work? - //n.pos = pos - n.Value = value - return n -} - func (check *Checker) switchStmt(inner stmtContext, s *syntax.SwitchStmt) { // init statement already handled @@ -624,7 +616,7 @@ func (check *Checker) switchStmt(inner stmtContext, s *syntax.SwitchStmt) { if len(s.Body) > 0 { pos = s.Body[0].Pos() } - x.expr = newName(pos, "true") + x.expr = syntax.NewName(pos, "true") } check.multipleSwitchDefaults(s.Body)