types.Block = 1
imported_unsafe = false
- p.lineno(p.file.PkgName)
+ p.setlineno(p.file.PkgName)
mkpackage(p.file.PkgName.Value)
xtop = append(xtop, p.decls(p.file.DeclList)...)
var cs constState
for _, decl := range decls {
- p.lineno(decl)
+ p.setlineno(decl)
switch decl := decl.(type) {
case *syntax.ImportDecl:
p.importDecl(decl)
exprs = p.exprList(decl.Values)
}
- p.lineno(decl)
+ p.setlineno(decl)
return variter(names, typ, exprs)
}
}
func (p *noder) declName(name *syntax.Name) *Node {
- return p.setlineno(name, dclname(p.name(name)))
+ n := dclname(p.name(name))
+ n.Pos = p.pos(name)
+ return n
}
func (p *noder) funcDecl(fun *syntax.FuncDecl) *Node {
name = nblank.Sym // filled in by typecheckfunc
}
- f.Func.Nname = p.setlineno(fun.Name, newfuncname(name))
+ f.Func.Nname = newfuncnamel(p.pos(fun.Name), name)
f.Func.Nname.Name.Defn = f
f.Func.Nname.Name.Param.Ntype = t
func (p *noder) params(params []*syntax.Field, dddOk bool) []*Node {
var nodes []*Node
for i, param := range params {
- p.lineno(param)
+ p.setlineno(param)
nodes = append(nodes, p.param(param, dddOk, i+1 == len(params)))
}
return nodes
}
func (p *noder) expr(expr syntax.Expr) *Node {
- p.lineno(expr)
+ p.setlineno(expr)
switch expr := expr.(type) {
case nil, *syntax.BadExpr:
return nil
case *syntax.Name:
return p.mkname(expr)
case *syntax.BasicLit:
- return p.setlineno(expr, nodlit(p.basicLit(expr)))
-
+ return nodlit(p.basicLit(expr))
case *syntax.CompositeLit:
n := p.nod(expr, OCOMPLIT, nil, nil)
if expr.Type != nil {
obj.Name.SetUsed(true)
return oldname(restrictlookup(expr.Sel.Value, obj.Name.Pkg))
}
- return p.setlineno(expr, nodSym(OXDOT, obj, p.name(expr.Sel)))
+ n := nodSym(OXDOT, obj, p.name(expr.Sel))
+ n.Pos = p.pos(expr) // lineno may have been changed by p.expr(expr.X)
+ return n
case *syntax.IndexExpr:
return p.nod(expr, OINDEX, p.expr(expr.X), p.expr(expr.Index))
case *syntax.SliceExpr:
func (p *noder) structType(expr *syntax.StructType) *Node {
var l []*Node
for i, field := range expr.FieldList {
- p.lineno(field)
+ p.setlineno(field)
var n *Node
if field.Name == nil {
n = p.embedded(field.Type)
l = append(l, n)
}
- p.lineno(expr)
+ p.setlineno(expr)
n := p.nod(expr, OTSTRUCT, nil, nil)
n.List.Set(l)
return n
func (p *noder) interfaceType(expr *syntax.InterfaceType) *Node {
var l []*Node
for _, method := range expr.MethodList {
- p.lineno(method)
+ p.setlineno(method)
var n *Node
if method.Name == nil {
n = p.nodSym(method, ODCLFIELD, oldname(p.packname(method.Type)), nil)
}
func (p *noder) stmtFall(stmt syntax.Stmt, fallOK bool) *Node {
- p.lineno(stmt)
+ p.setlineno(stmt)
switch stmt := stmt.(type) {
case *syntax.EmptyStmt:
return nil
newOrErr := false
for i, expr := range exprs {
- p.lineno(expr)
+ p.setlineno(expr)
res[i] = nblank
name, ok := expr.(*syntax.Name)
func (p *noder) caseClauses(clauses []*syntax.CaseClause, tswitch *Node, rbrace syntax.Pos) []*Node {
var nodes []*Node
for i, clause := range clauses {
- p.lineno(clause)
+ p.setlineno(clause)
if i > 0 {
p.closeScope(clause.Pos())
}
func (p *noder) commClauses(clauses []*syntax.CommClause, rbrace syntax.Pos) []*Node {
var nodes []*Node
for i, clause := range clauses {
- p.lineno(clause)
+ p.setlineno(clause)
if i > 0 {
p.closeScope(clause.Pos())
}
}
func (p *noder) nod(orig syntax.Node, op Op, left, right *Node) *Node {
- return p.setlineno(orig, nod(op, left, right))
+ return nodl(p.pos(orig), op, left, right)
}
func (p *noder) nodSym(orig syntax.Node, op Op, left *Node, sym *types.Sym) *Node {
- return p.setlineno(orig, nodSym(op, left, sym))
+ n := nodSym(op, left, sym)
+ n.Pos = p.pos(orig)
+ return n
}
-func (p *noder) setlineno(src_ syntax.Node, dst *Node) *Node {
- pos := src_.Pos()
- if !pos.IsKnown() {
- // TODO(mdempsky): Shouldn't happen. Fix package syntax.
- return dst
+func (p *noder) pos(n syntax.Node) src.XPos {
+ // TODO(gri): orig.Pos() should always be known - fix package syntax
+ xpos := lineno
+ if pos := n.Pos(); pos.IsKnown() {
+ xpos = p.makeXPos(pos)
}
- dst.Pos = p.makeXPos(pos)
- return dst
+ return xpos
}
-func (p *noder) lineno(n syntax.Node) {
- if n == nil {
- return
- }
- pos := n.Pos()
- if !pos.IsKnown() {
- // TODO(mdempsky): Shouldn't happen. Fix package syntax.
- return
+func (p *noder) setlineno(n syntax.Node) {
+ if n != nil {
+ lineno = p.pos(n)
}
- lineno = p.makeXPos(pos)
}
// error is called concurrently if files are parsed concurrently.