]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile/internal/syntax: track column position at function end
authorMatthew Dempsky <mdempsky@google.com>
Thu, 16 Mar 2017 17:43:54 +0000 (10:43 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Thu, 16 Mar 2017 18:28:51 +0000 (18:28 +0000)
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>

src/cmd/compile/internal/gc/noder.go
src/cmd/compile/internal/syntax/nodes.go
src/cmd/compile/internal/syntax/parser.go

index 80edeee710abd3a4af2b885ee735e92be5fe63fa..ada34406221c592c7c0a3a22a9d276c60cbc584d 100644 (file)
@@ -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)
index efcf64717c1f50f57c5271d71e5ab4164fcff105..0f7e8c2f17ab4d9b83c6a43d28a5441e44bc8707 100644 (file)
@@ -100,13 +100,13 @@ type (
        // func Receiver Name Type { Body }
        // func Receiver Name Type
        FuncDecl struct {
-               Attr    map[string]bool // go:attr map
-               Recv    *Field          // nil means regular function
-               Name    *Name
-               Type    *FuncType
-               Body    []Stmt // nil means no body (forward declaration)
-               Pragma  Pragma // TODO(mdempsky): Cleaner solution.
-               EndLine uint   // TODO(mdempsky): Cleaner solution.
+               Attr   map[string]bool // go:attr map
+               Recv   *Field          // nil means regular function
+               Name   *Name
+               Type   *FuncType
+               Body   []Stmt  // nil means no body (forward declaration)
+               Pragma Pragma  // TODO(mdempsky): Cleaner solution.
+               Rbrace src.Pos // TODO(mdempsky): Cleaner solution.
                decl
        }
 )
@@ -146,8 +146,8 @@ type (
        CompositeLit struct {
                Type     Expr // nil means no literal type
                ElemList []Expr
-               NKeys    int  // number of elements with keys
-               EndLine  uint // TODO(mdempsky): Cleaner solution.
+               NKeys    int     // number of elements with keys
+               Rbrace   src.Pos // TODO(mdempsky): Cleaner solution.
                expr
        }
 
@@ -159,9 +159,9 @@ type (
 
        // func Type { Body }
        FuncLit struct {
-               Type    *FuncType
-               Body    []Stmt
-               EndLine uint // TODO(mdempsky): Cleaner solution.
+               Type   *FuncType
+               Body   []Stmt
+               Rbrace src.Pos // TODO(mdempsky): Cleaner solution.
                expr
        }
 
index d57e02bfe058e88688ba2a3f5437b3e9bd0dd4cc..48a02e716f977cfc0e00b54f39ea2a125741770e 100644 (file)
@@ -480,10 +480,13 @@ func (p *parser) funcDecl() *FuncDecl {
 
        f.Name = p.name()
        f.Type = p.funcType()
-       f.Body = p.funcBody()
+       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,18 +1150,14 @@ 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
-       }
+       p.fnest++
+       body := p.stmtList()
+       p.fnest--
 
-       return nil
+       if body == nil {
+               body = []Stmt{new(EmptyStmt)}
+       }
+       return body
 }
 
 // Result = Parameters | Type .