diff options
author | Jake Leahy <jake@leahy.dev> | 2023-12-17 19:01:00 +1100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-17 09:01:00 +0100 |
commit | 0bd4d802383518cfbb43fa02375602abdfb6114f (patch) | |
tree | a36c99cfc70ee1208f8264ddc82fee045c3725a2 | |
parent | 9648d97a8dab053067e2c50b2f5b0d7c3650d5e3 (diff) | |
download | Nim-0bd4d802383518cfbb43fa02375602abdfb6114f.tar.gz |
Allow `parseAll` to parse statements separated by semicolons (#23088)
Fixes the second issue listed in #9918. Fixed by replacing the logic used in `parseAll` with just a continious loop to `complexOrSimpleStmt` like what the [normal parser does](https://github.com/nim-lang/Nim/blob/devel/compiler/passes.nim#L143-L146). `complexOrSimpleStmt` [guarantees progress](https://github.com/nim-lang/Nim/blob/devel/compiler/parser.nim#L2541) so we don't need to check progress ourselves. Also allows `nimpretty` to parse more valid Nim code such as ```nim proc foo(); # Would complain about indention here # ... proc foo() = # ... ```
-rw-r--r-- | compiler/parser.nim | 26 | ||||
-rw-r--r-- | tests/macros/ttryparseexpr.nim | 4 |
2 files changed, 14 insertions, 16 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim index 1017759a9..024807a8a 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -2514,22 +2514,6 @@ proc parseStmt(p: var Parser): PNode = if err and p.tok.tokType == tkEof: break setEndInfo() -proc parseAll*(p: var Parser): PNode = - ## Parses the rest of the input stream held by the parser into a PNode. - result = newNodeP(nkStmtList, p) - while p.tok.tokType != tkEof: - p.hasProgress = false - var a = complexOrSimpleStmt(p) - if a.kind != nkEmpty and p.hasProgress: - result.add(a) - else: - parMessage(p, errExprExpected, p.tok) - # bugfix: consume a token here to prevent an endless loop: - getTok(p) - if p.tok.indent != 0: - parMessage(p, errInvalidIndentation) - setEndInfo() - proc checkFirstLineIndentation*(p: var Parser) = if p.tok.indent != 0 and tsLeading in p.tok.spacing: parMessage(p, errInvalidIndentation) @@ -2564,6 +2548,16 @@ proc parseTopLevelStmt*(p: var Parser): PNode = break setEndInfo() +proc parseAll*(p: var Parser): PNode = + ## Parses the rest of the input stream held by the parser into a PNode. + result = newNodeP(nkStmtList, p) + while true: + let nextStmt = p.parseTopLevelStmt() + if nextStmt.kind == nkEmpty: + break + result &= nextStmt + setEndInfo() + proc parseString*(s: string; cache: IdentCache; config: ConfigRef; filename: string = ""; line: int = 0; errorHandler: ErrorHandler = nil): PNode = diff --git a/tests/macros/ttryparseexpr.nim b/tests/macros/ttryparseexpr.nim index fc0ee61d0..e6e9e9880 100644 --- a/tests/macros/ttryparseexpr.nim +++ b/tests/macros/ttryparseexpr.nim @@ -18,3 +18,7 @@ const c = test("\"") # bug #2504 echo a, " ", b + +static: + # Issue #9918 + discard parseStmt("echo(1+1);") |