mirror of
https://github.com/golang/go
synced 2024-11-25 03:27:58 -07:00
go/parser: better error sync. if commas are missing
R=rsc, bradfitz CC=golang-dev https://golang.org/cl/5756045
This commit is contained in:
parent
4f25e4be02
commit
67cbe9431f
@ -362,9 +362,9 @@ func (p *parser) expect(tok token.Token) token.Pos {
|
|||||||
// expectClosing is like expect but provides a better error message
|
// expectClosing is like expect but provides a better error message
|
||||||
// for the common case of a missing comma before a newline.
|
// for the common case of a missing comma before a newline.
|
||||||
//
|
//
|
||||||
func (p *parser) expectClosing(tok token.Token, construct string) token.Pos {
|
func (p *parser) expectClosing(tok token.Token, context string) token.Pos {
|
||||||
if p.tok != tok && p.tok == token.SEMICOLON && p.lit == "\n" {
|
if p.tok != tok && p.tok == token.SEMICOLON && p.lit == "\n" {
|
||||||
p.error(p.pos, "missing ',' before newline in "+construct)
|
p.error(p.pos, "missing ',' before newline in "+context)
|
||||||
p.next()
|
p.next()
|
||||||
}
|
}
|
||||||
return p.expect(tok)
|
return p.expect(tok)
|
||||||
@ -376,6 +376,18 @@ func (p *parser) expectSemi() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *parser) seesComma(context string) bool {
|
||||||
|
if p.tok == token.COMMA {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if p.tok == token.SEMICOLON && p.lit == "\n" {
|
||||||
|
p.error(p.pos, "missing ',' before newline in "+context)
|
||||||
|
return true // "insert" the comma and continue
|
||||||
|
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func assert(cond bool, msg string) {
|
func assert(cond bool, msg string) {
|
||||||
if !cond {
|
if !cond {
|
||||||
panic("go/parser internal error: " + msg)
|
panic("go/parser internal error: " + msg)
|
||||||
@ -647,7 +659,7 @@ func (p *parser) parseVarList(isParam bool) (list []ast.Expr, typ ast.Expr) {
|
|||||||
// accept them all for more robust parsing and complain later
|
// accept them all for more robust parsing and complain later
|
||||||
for typ := p.parseVarType(isParam); typ != nil; {
|
for typ := p.parseVarType(isParam); typ != nil; {
|
||||||
list = append(list, typ)
|
list = append(list, typ)
|
||||||
if p.tok != token.COMMA {
|
if !p.seesComma("variable list") {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
p.next()
|
p.next()
|
||||||
@ -688,7 +700,7 @@ func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params [
|
|||||||
// Go spec: The scope of an identifier denoting a function
|
// Go spec: The scope of an identifier denoting a function
|
||||||
// parameter or result variable is the function body.
|
// parameter or result variable is the function body.
|
||||||
p.declare(field, nil, scope, ast.Var, idents...)
|
p.declare(field, nil, scope, ast.Var, idents...)
|
||||||
if p.tok != token.COMMA {
|
if !p.seesComma("parameter list") {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
p.next()
|
p.next()
|
||||||
@ -1078,7 +1090,7 @@ func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
|
|||||||
ellipsis = p.pos
|
ellipsis = p.pos
|
||||||
p.next()
|
p.next()
|
||||||
}
|
}
|
||||||
if p.tok != token.COMMA {
|
if !p.seesComma("argument list") {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
p.next()
|
p.next()
|
||||||
@ -1118,7 +1130,7 @@ func (p *parser) parseElementList() (list []ast.Expr) {
|
|||||||
|
|
||||||
for p.tok != token.RBRACE && p.tok != token.EOF {
|
for p.tok != token.RBRACE && p.tok != token.EOF {
|
||||||
list = append(list, p.parseElement(true))
|
list = append(list, p.parseElement(true))
|
||||||
if p.tok != token.COMMA {
|
if !p.seesComma("composite literal") {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
p.next()
|
p.next()
|
||||||
|
Loading…
Reference in New Issue
Block a user