Commit 59dc2573 authored by Robert Griesemer's avatar Robert Griesemer

cmd/compile: cleanup in parser (3)

Factored out functionality of dotname (was inlined in 3 places).

Change-Id: Ica782737c8decbb757465830b25ba87faa9115a4
Reviewed-on: https://go-review.googlesource.com/16897
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarChris Manghane <cmang@golang.org>
parent 8d733eca
...@@ -98,6 +98,10 @@ func (p *parser) want(tok int32) { ...@@ -98,6 +98,10 @@ func (p *parser) want(tok int32) {
// Syntax error handling // Syntax error handling
func (p *parser) syntax_error(msg string) { func (p *parser) syntax_error(msg string) {
if trace && Debug['x'] != 0 {
defer p.trace("syntax_error (" + msg + ")")()
}
if p.tok == EOF && nerrors > 0 { if p.tok == EOF && nerrors > 0 {
return // avoid meaningless follow-up errors return // avoid meaningless follow-up errors
} }
...@@ -1421,14 +1425,7 @@ loop: ...@@ -1421,14 +1425,7 @@ loop:
switch p.tok { switch p.tok {
case LNAME, '@', '?': case LNAME, '@', '?':
// pexpr '.' sym // pexpr '.' sym
sel := p.sym() x = p.new_dotname(x)
if x.Op == OPACK {
s := restrictlookup(sel.Name, x.Name.Pkg)
x.Used = true
x = oldname(s)
break
}
x = Nod(OXDOT, x, newname(sel))
case '(': case '(':
p.next() p.next()
...@@ -1837,6 +1834,22 @@ func (p *parser) fnret_type() *Node { ...@@ -1837,6 +1834,22 @@ func (p *parser) fnret_type() *Node {
} }
} }
// go.y:dotname (partial)
func (p *parser) new_dotname(pkg *Node) *Node {
if trace && Debug['x'] != 0 {
defer p.trace("new_dotname")()
}
sel := p.sym()
if pkg.Op == OPACK {
s := restrictlookup(sel.Name, pkg.Name.Pkg)
pkg.Used = true
return oldname(s)
}
return Nod(OXDOT, pkg, newname(sel))
}
// go.y:dotname // go.y:dotname
func (p *parser) dotname() *Node { func (p *parser) dotname() *Node {
if trace && Debug['x'] != 0 { if trace && Debug['x'] != 0 {
...@@ -1844,21 +1857,10 @@ func (p *parser) dotname() *Node { ...@@ -1844,21 +1857,10 @@ func (p *parser) dotname() *Node {
} }
name := p.name() name := p.name()
if p.got('.') {
switch p.tok { return p.new_dotname(name)
default:
return name
case '.':
p.next()
sel := p.sym()
if name.Op == OPACK {
s := restrictlookup(sel.Name, name.Name.Pkg)
name.Used = true
return oldname(s)
}
return Nod(OXDOT, name, newname(sel))
} }
return name
} }
// go.y:structtype // go.y:structtype
...@@ -2443,13 +2445,7 @@ func (p *parser) arg_type() *Node { ...@@ -2443,13 +2445,7 @@ func (p *parser) arg_type() *Node {
name := mkname(name) name := mkname(name)
// from dotname // from dotname
if p.got('.') { if p.got('.') {
sel := p.sym() return p.new_dotname(name)
if name.Op == OPACK {
s := restrictlookup(sel.Name, name.Name.Pkg)
name.Used = true
return oldname(s)
}
return Nod(OXDOT, name, newname(sel))
} }
return name return name
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment