diff options
| author | Robert Griesemer <gri@golang.org> | 2022-08-31 12:14:58 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2022-09-02 02:09:04 +0000 |
| commit | a330ca5c541e99e4561420c852b14df63574a065 (patch) | |
| tree | 793e276f2323342d3a0a62a8a4a19c404685a974 /src/cmd/compile/internal/syntax | |
| parent | a31c062c9fbf212b244fbece6295a2a4279459e0 (diff) | |
| download | go-a330ca5c541e99e4561420c852b14df63574a065.tar.xz | |
cmd/compile/internal/syntax: more tolerant parsing of import declarations
Change-Id: I114548640d51bf69833259578609901fa1602510
Reviewed-on: https://go-review.googlesource.com/c/go/+/427156
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Diffstat (limited to 'src/cmd/compile/internal/syntax')
| -rw-r--r-- | src/cmd/compile/internal/syntax/parser.go | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go index e2298852b8..b956028404 100644 --- a/src/cmd/compile/internal/syntax/parser.go +++ b/src/cmd/compile/internal/syntax/parser.go @@ -401,15 +401,20 @@ func (p *parser) fileOrNil() *File { return nil } - // { ImportDecl ";" } - for p.got(_Import) { - f.DeclList = p.appendGroup(f.DeclList, p.importDecl) - p.want(_Semi) - } - - // { TopLevelDecl ";" } + // Accept import declarations anywhere for error tolerance, but complain. + // { ( ImportDecl | TopLevelDecl ) ";" } + prev := _Import for p.tok != _EOF { + if p.tok == _Import && prev != _Import { + p.syntaxError("imports must appear before other declarations") + } + prev = p.tok + switch p.tok { + case _Import: + p.next() + f.DeclList = p.appendGroup(f.DeclList, p.importDecl) + case _Const: p.next() f.DeclList = p.appendGroup(f.DeclList, p.constDecl) @@ -435,7 +440,7 @@ func (p *parser) fileOrNil() *File { } else { p.syntaxError("non-declaration statement outside function body") } - p.advance(_Const, _Type, _Var, _Func) + p.advance(_Import, _Const, _Type, _Var, _Func) continue } @@ -445,7 +450,7 @@ func (p *parser) fileOrNil() *File { if p.tok != _EOF && !p.got(_Semi) { p.syntaxError("after top level declaration") - p.advance(_Const, _Type, _Var, _Func) + p.advance(_Import, _Const, _Type, _Var, _Func) } } // p.tok == _EOF @@ -543,7 +548,7 @@ func (p *parser) importDecl(group *Group) Decl { return d } if !d.Path.Bad && d.Path.Kind != StringLit { - p.syntaxError("import path must be a string") + p.syntaxErrorAt(d.Path.Pos(), "import path must be a string") d.Path.Bad = true } // d.Path.Bad || d.Path.Kind == StringLit |
