aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/syntax
diff options
context:
space:
mode:
authorMatthew Dempsky <mdempsky@google.com>2017-03-16 10:43:54 -0700
committerMatthew Dempsky <mdempsky@google.com>2017-03-16 18:28:51 +0000
commitf37ee0f33ba461dbaa58645c3ebdf148a43911a5 (patch)
treeafb5d7d079218f69b21fcc83444dcbec5079e47a /src/cmd/compile/internal/syntax
parentc8f38b339875e020f50bedbdb8cfd8a7a1ef12b1 (diff)
downloadgo-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.go24
-rw-r--r--src/cmd/compile/internal/syntax/parser.go34
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 .