diff options
| author | Matthew Dempsky <mdempsky@google.com> | 2017-03-16 10:43:54 -0700 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2017-03-16 18:28:51 +0000 |
| commit | f37ee0f33ba461dbaa58645c3ebdf148a43911a5 (patch) | |
| tree | afb5d7d079218f69b21fcc83444dcbec5079e47a /src/cmd/compile/internal/syntax | |
| parent | c8f38b339875e020f50bedbdb8cfd8a7a1ef12b1 (diff) | |
| download | go-f37ee0f33ba461dbaa58645c3ebdf148a43911a5.tar.xz | |
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>
Diffstat (limited to 'src/cmd/compile/internal/syntax')
| -rw-r--r-- | src/cmd/compile/internal/syntax/nodes.go | 24 | ||||
| -rw-r--r-- | src/cmd/compile/internal/syntax/parser.go | 34 |
2 files changed, 28 insertions, 30 deletions
diff --git a/src/cmd/compile/internal/syntax/nodes.go b/src/cmd/compile/internal/syntax/nodes.go index efcf64717c..0f7e8c2f17 100644 --- a/src/cmd/compile/internal/syntax/nodes.go +++ b/src/cmd/compile/internal/syntax/nodes.go @@ -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 } diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index d57e02bfe0..48a02e716f 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -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 . |
