diff --git a/internal/parser/parser.go b/internal/parser/parser.go index 5f5234bef27864e4f996f9dcd01cfffe6e1d7a29..891ae51efc7503b61ca188b661820a15b89076e5 100644 --- a/internal/parser/parser.go +++ b/internal/parser/parser.go @@ -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