mirror of
https://github.com/golang/go
synced 2024-11-18 04:04:49 -07:00
cmd/compile/internal/syntax: track column position at function end
Fixes #19576. Change-Id: I11034fb08e989f6eb7d54bde873b92804223598d Reviewed-on: https://go-review.googlesource.com/38291 Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
c8f38b3398
commit
f37ee0f33b
@ -325,7 +325,7 @@ func (p *noder) funcDecl(fun *syntax.FuncDecl) *Node {
|
||||
yyerror("go:nosplit and go:systemstack cannot be combined")
|
||||
}
|
||||
f.Func.Pragma = pragma
|
||||
lineno = makePos(fun.Pos().Base(), fun.EndLine, 0)
|
||||
lineno = Ctxt.PosTable.XPos(fun.Rbrace)
|
||||
f.Func.Endlineno = lineno
|
||||
|
||||
funcbody(f)
|
||||
@ -451,14 +451,14 @@ func (p *noder) expr(expr syntax.Expr) *Node {
|
||||
l[i] = p.wrapname(expr.ElemList[i], e)
|
||||
}
|
||||
n.List.Set(l)
|
||||
lineno = makePos(expr.Pos().Base(), expr.EndLine, 0)
|
||||
lineno = Ctxt.PosTable.XPos(expr.Rbrace)
|
||||
return n
|
||||
case *syntax.KeyValueExpr:
|
||||
return p.nod(expr, OKEY, p.expr(expr.Key), p.wrapname(expr.Value, p.expr(expr.Value)))
|
||||
case *syntax.FuncLit:
|
||||
closurehdr(p.typeExpr(expr.Type))
|
||||
body := p.stmts(expr.Body)
|
||||
lineno = makePos(expr.Pos().Base(), expr.EndLine, 0)
|
||||
lineno = Ctxt.PosTable.XPos(expr.Rbrace)
|
||||
return p.setlineno(expr, closurebody(body))
|
||||
case *syntax.ParenExpr:
|
||||
return p.nod(expr, OPAREN, p.expr(expr.X), nil)
|
||||
|
@ -106,7 +106,7 @@ type (
|
||||
Type *FuncType
|
||||
Body []Stmt // nil means no body (forward declaration)
|
||||
Pragma Pragma // TODO(mdempsky): Cleaner solution.
|
||||
EndLine uint // TODO(mdempsky): Cleaner solution.
|
||||
Rbrace src.Pos // TODO(mdempsky): Cleaner solution.
|
||||
decl
|
||||
}
|
||||
)
|
||||
@ -147,7 +147,7 @@ type (
|
||||
Type Expr // nil means no literal type
|
||||
ElemList []Expr
|
||||
NKeys int // number of elements with keys
|
||||
EndLine uint // TODO(mdempsky): Cleaner solution.
|
||||
Rbrace src.Pos // TODO(mdempsky): Cleaner solution.
|
||||
expr
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ type (
|
||||
FuncLit struct {
|
||||
Type *FuncType
|
||||
Body []Stmt
|
||||
EndLine uint // TODO(mdempsky): Cleaner solution.
|
||||
Rbrace src.Pos // TODO(mdempsky): Cleaner solution.
|
||||
expr
|
||||
}
|
||||
|
||||
|
@ -480,10 +480,13 @@ func (p *parser) funcDecl() *FuncDecl {
|
||||
|
||||
f.Name = p.name()
|
||||
f.Type = p.funcType()
|
||||
if p.got(_Lbrace) {
|
||||
f.Body = p.funcBody()
|
||||
f.Rbrace = p.pos()
|
||||
p.want(_Rbrace)
|
||||
}
|
||||
|
||||
f.Pragma = p.pragma
|
||||
f.EndLine = p.line
|
||||
|
||||
// TODO(gri) deal with function properties
|
||||
// if noescape && body != nil {
|
||||
@ -700,18 +703,17 @@ func (p *parser) operand(keep_parens bool) Expr {
|
||||
pos := p.pos()
|
||||
p.next()
|
||||
t := p.funcType()
|
||||
if p.tok == _Lbrace {
|
||||
p.fnest++
|
||||
if p.got(_Lbrace) {
|
||||
p.xnest++
|
||||
|
||||
f := new(FuncLit)
|
||||
f.pos = pos
|
||||
f.Type = t
|
||||
f.Body = p.funcBody()
|
||||
f.EndLine = p.line
|
||||
f.Rbrace = p.pos()
|
||||
p.want(_Rbrace)
|
||||
|
||||
p.xnest--
|
||||
p.fnest--
|
||||
return f
|
||||
}
|
||||
return t
|
||||
@ -920,7 +922,7 @@ func (p *parser) complitexpr() *CompositeLit {
|
||||
}
|
||||
}
|
||||
|
||||
x.EndLine = p.line
|
||||
x.Rbrace = p.pos()
|
||||
p.xnest--
|
||||
p.want(_Rbrace)
|
||||
|
||||
@ -1148,20 +1150,16 @@ func (p *parser) funcBody() []Stmt {
|
||||
defer p.trace("funcBody")()
|
||||
}
|
||||
|
||||
if p.got(_Lbrace) {
|
||||
p.fnest++
|
||||
body := p.stmtList()
|
||||
p.fnest--
|
||||
p.want(_Rbrace)
|
||||
|
||||
if body == nil {
|
||||
body = []Stmt{new(EmptyStmt)}
|
||||
}
|
||||
return body
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Result = Parameters | Type .
|
||||
func (p *parser) funcResult() []*Field {
|
||||
if trace {
|
||||
|
Loading…
Reference in New Issue
Block a user