]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile/internal/syntax: export NewName and use it
authorRobert Griesemer <gri@golang.org>
Fri, 11 Dec 2020 05:16:02 +0000 (21:16 -0800)
committerRobert Griesemer <gri@golang.org>
Mon, 14 Dec 2020 21:41:25 +0000 (21:41 +0000)
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 <gri@golang.org>
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/syntax/nodes.go
src/cmd/compile/internal/syntax/parser.go
src/cmd/compile/internal/types2/resolver.go
src/cmd/compile/internal/types2/stmt.go

index 306e695a33b28ed440404f83738108bfe367fccd..fe8f62c6e6b54ba60ada92601f385eee4c68986b 100644 (file)
@@ -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
index dbec462ab15803120906f3c3bd730917b44793eb..4af7e462ede5f80d2da119f067280aafa348e50e 100644 (file)
@@ -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)
        }
index b57b41e2b098df5b0e16af35eee39cae0af8d4d0..2e90e5781cc83c3b0e88d1ce36f62639285c54d7 100644 (file)
@@ -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)
                        }
index f1317fa0a31e09c5b0a177e0952b33f0369c5527..477bc58bd034f57d0338594bbab45e26f7555ed9 100644 (file)
@@ -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)