收紧对可选 wago 语法支持
This commit is contained in:
parent
763c584b8f
commit
09ec7f4a53
|
|
@ -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()
|
||||
if !p.wagoMode {
|
||||
if p.tok == token.ARROW {
|
||||
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)
|
||||
|
||||
if p.tok == token.ARROW {
|
||||
arrowPos = p.pos
|
||||
p.next()
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
|||
Loading…
Reference in New Issue