提交 09ec7f4a 编写于 作者: chai2010's avatar chai2010

收紧对可选 wago 语法支持

上级 763c584b
......@@ -29,6 +29,8 @@ import (
// The parser structure holds the parser's internal state.
type parser struct {
wagoMode bool // *.wa.go 模式
file *token.File
errors scanner.ErrorList
scanner scanner.Scanner
......@@ -72,6 +74,10 @@ type parser struct {
}
func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode Mode) {
if strings.HasSuffix(filename, ".go") {
p.wagoMode = true
}
p.file = fset.AddFile(filename, -1, len(src))
var m scanner.Mode
if mode&ParseComments != 0 {
......@@ -839,11 +845,15 @@ func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params [
}
}
// 解析可选的 ':'
// Wa 必须加 ':'
var colonPos token.Pos
if p.tok == token.COLON {
colonPos = p.pos
p.next()
if !p.wagoMode {
if p.tok == token.COLON {
colonPos = p.pos
p.next()
} else {
p.expect(token.COLON)
}
}
// analyze case
......@@ -862,9 +872,13 @@ func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params [
p.next()
for p.tok != token.RPAREN && p.tok != token.EOF {
idents := p.parseIdentList()
if p.tok == token.COLON {
colonPos = p.pos
p.next()
if !p.wagoMode {
if p.tok == token.COLON {
colonPos = p.pos
p.next()
} else {
p.expect(token.COLON)
}
}
typ := p.parseVarType(ellipsisOk)
field := &ast.Field{Names: idents, ColonPos: colonPos, Type: typ}
......@@ -938,23 +952,29 @@ func (p *parser) parseSignature(scope *ast.Scope) (params, results *ast.FieldLis
// 无参数和返回值时可省略 `()`
// func main
// func main { ... }
if p.tok == token.LBRACE || p.tok == token.SEMICOLON {
params = new(ast.FieldList)
results = new(ast.FieldList)
return
if !p.wagoMode {
if p.tok == token.LBRACE || p.tok == token.SEMICOLON {
params = new(ast.FieldList)
results = new(ast.FieldList)
return
}
}
// func answer => i32 {}
if p.tok == token.ARROW {
params = new(ast.FieldList)
p.next()
} else {
params = p.parseParameters(scope, true)
if !p.wagoMode {
if p.tok == token.ARROW {
arrowPos = p.pos
params = new(ast.FieldList)
p.next()
} else {
params = p.parseParameters(scope, true)
if p.tok == token.ARROW {
arrowPos = p.pos
p.next()
}
}
} else {
params = p.parseParameters(scope, true)
}
results = p.parseResult(scope)
......@@ -2217,12 +2237,14 @@ func (p *parser) parseImportSpec(doc *ast.CommentGroup, _ token.Token, _ int) as
}
var ident *ast.Ident
switch p.tok {
case token.PERIOD:
ident = &ast.Ident{NamePos: p.pos, Name: "."}
p.next()
case token.IDENT:
ident = p.parseIdent()
if p.wagoMode {
switch p.tok {
case token.PERIOD:
ident = &ast.Ident{NamePos: p.pos, Name: "."}
p.next()
case token.IDENT:
ident = p.parseIdent()
}
}
pos := p.pos
......@@ -2239,18 +2261,20 @@ func (p *parser) parseImportSpec(doc *ast.CommentGroup, _ token.Token, _ int) as
// parse => asname
var arrowPos token.Pos
if ident == nil && p.tok == token.ARROW {
arrowPos = p.pos
p.next() // skip =>
if !p.wagoMode {
if ident == nil && p.tok == token.ARROW {
arrowPos = p.pos
p.next() // skip =>
switch p.tok {
case token.PERIOD:
ident = &ast.Ident{NamePos: p.pos, Name: "."}
p.next()
case token.IDENT:
ident = p.parseIdent()
default:
p.expect(token.IDENT)
switch p.tok {
case token.PERIOD:
ident = &ast.Ident{NamePos: p.pos, Name: "."}
p.next()
case token.IDENT:
ident = p.parseIdent()
default:
p.expect(token.IDENT)
}
}
}
......@@ -2277,9 +2301,13 @@ func (p *parser) parseValueSpec(doc *ast.CommentGroup, keyword token.Token, iota
pos := p.pos
idents := p.parseIdentList()
var colonPos token.Pos
if p.tok == token.COLON {
colonPos = p.pos
p.next()
if !p.wagoMode {
if p.tok == token.COLON {
colonPos = p.pos
p.next()
} else {
p.expect(token.COLON)
}
}
typ := p.tryType()
var values []ast.Expr
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册