Skip to content

Commit

Permalink
[dev.typeparams] cmd/compile/internal/syntax: export NewName and use it
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
griesemer committed Dec 14, 2020
1 parent 8ec9e89 commit 3a912f2
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 27 deletions.
7 changes: 7 additions & 0 deletions src/cmd/compile/internal/syntax/nodes.go
Expand Up @@ -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
Expand Down
23 changes: 6 additions & 17 deletions src/cmd/compile/internal/syntax/parser.go
Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
}
Expand Down
2 changes: 1 addition & 1 deletion src/cmd/compile/internal/types2/resolver.go
Expand Up @@ -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)
}
Expand Down
10 changes: 1 addition & 9 deletions src/cmd/compile/internal/types2/stmt.go
Expand Up @@ -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

Expand All @@ -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)
Expand Down

0 comments on commit 3a912f2

Please sign in to comment.