fix a parsing regression (calls with do inside param lists)
This treatment is applied only when "do" is used, because the code foo(x: bar) is recognized as object construction.
This commit is contained in:
parent
9ffaee3f88
commit
e7eb01ed48
2 changed files with 24 additions and 2 deletions
|
|
@ -67,6 +67,7 @@ proc parseTry(p: var TParser; isExpr: bool): PNode
|
||||||
proc parseCase(p: var TParser): PNode
|
proc parseCase(p: var TParser): PNode
|
||||||
proc parseStmtPragma(p: var TParser): PNode
|
proc parseStmtPragma(p: var TParser): PNode
|
||||||
proc parsePragma(p: var TParser): PNode
|
proc parsePragma(p: var TParser): PNode
|
||||||
|
proc postExprBlocks(p: var TParser, x: PNode): PNode
|
||||||
# implementation
|
# implementation
|
||||||
|
|
||||||
proc getTok(p: var TParser) =
|
proc getTok(p: var TParser) =
|
||||||
|
|
@ -364,6 +365,9 @@ proc colonOrEquals(p: var TParser, a: PNode): PNode =
|
||||||
proc exprColonEqExpr(p: var TParser): PNode =
|
proc exprColonEqExpr(p: var TParser): PNode =
|
||||||
#| exprColonEqExpr = expr (':'|'=' expr)?
|
#| exprColonEqExpr = expr (':'|'=' expr)?
|
||||||
var a = parseExpr(p)
|
var a = parseExpr(p)
|
||||||
|
if p.tok.tokType == tkDo:
|
||||||
|
result = postExprBlocks(p, a)
|
||||||
|
else:
|
||||||
result = colonOrEquals(p, a)
|
result = colonOrEquals(p, a)
|
||||||
|
|
||||||
proc exprList(p: var TParser, endTok: TTokType, result: PNode) =
|
proc exprList(p: var TParser, endTok: TTokType, result: PNode) =
|
||||||
|
|
@ -668,7 +672,6 @@ proc namedParams(p: var TParser, callee: PNode,
|
||||||
# progress guaranteed
|
# progress guaranteed
|
||||||
exprColonEqExprListAux(p, endTok, result)
|
exprColonEqExprListAux(p, endTok, result)
|
||||||
|
|
||||||
proc postExprBlocks(p: var TParser, x: PNode): PNode
|
|
||||||
proc primarySuffix(p: var TParser, r: PNode, baseIndent: int): PNode =
|
proc primarySuffix(p: var TParser, r: PNode, baseIndent: int): PNode =
|
||||||
#| primarySuffix = '(' (exprColonEqExpr comma?)* ')' doBlocks?
|
#| primarySuffix = '(' (exprColonEqExpr comma?)* ')' doBlocks?
|
||||||
#| | doBlocks
|
#| | doBlocks
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,18 @@ StmtList
|
||||||
StmtList
|
StmtList
|
||||||
DiscardStmt
|
DiscardStmt
|
||||||
Empty
|
Empty
|
||||||
|
Call
|
||||||
|
Ident !"foo"
|
||||||
|
Ident !"x"
|
||||||
|
Call
|
||||||
|
Ident !"bar"
|
||||||
|
StmtList
|
||||||
|
DiscardStmt
|
||||||
|
Empty
|
||||||
|
Else
|
||||||
|
StmtList
|
||||||
|
DiscardStmt
|
||||||
|
Empty
|
||||||
VarSection
|
VarSection
|
||||||
IdentDefs
|
IdentDefs
|
||||||
Ident !"a"
|
Ident !"a"
|
||||||
|
|
@ -432,6 +444,13 @@ dumpTree:
|
||||||
else:
|
else:
|
||||||
discard
|
discard
|
||||||
|
|
||||||
|
# call with blocks as a param
|
||||||
|
foo(x, bar do:
|
||||||
|
discard
|
||||||
|
else:
|
||||||
|
discard
|
||||||
|
)
|
||||||
|
|
||||||
# introduce a variable
|
# introduce a variable
|
||||||
var a = foo
|
var a = foo
|
||||||
var a = foo()
|
var a = foo()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue