Parser: Inline expr pragmas with parenthesis
Previously pragmas could be attached only to whole statements, this change
allows attaching pragmas to inline statements, eg.:
template rewriteAdd{a + b}(a: expr, b: expr): expr =
({.noRewrite.}: a + b) + 1
Code above will cause a + b to be rewritten once, because rewriteAdd attaches
{.noRewrite.} to resulting a + b expr.
This commit is contained in:
parent
2f5ed17cfe
commit
b0db8126a5
1 changed files with 4 additions and 0 deletions
|
|
@ -64,6 +64,7 @@ proc setBaseFlags*(n: PNode, base: TNumericalBase)
|
||||||
proc parseSymbol*(p: var TParser, allowNil = false): PNode
|
proc parseSymbol*(p: var TParser, allowNil = false): PNode
|
||||||
proc parseTry(p: var TParser; isExpr: bool): PNode
|
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
|
||||||
# implementation
|
# implementation
|
||||||
|
|
||||||
proc getTok(p: var TParser) =
|
proc getTok(p: var TParser) =
|
||||||
|
|
@ -502,6 +503,7 @@ proc parsePar(p: var TParser): PNode =
|
||||||
#| par = '(' optInd
|
#| par = '(' optInd
|
||||||
#| ( &parKeyw complexOrSimpleStmt ^+ ';'
|
#| ( &parKeyw complexOrSimpleStmt ^+ ';'
|
||||||
#| | ';' complexOrSimpleStmt ^+ ';'
|
#| | ';' complexOrSimpleStmt ^+ ';'
|
||||||
|
#| | pragmaStmt
|
||||||
#| | simpleExpr ( ('=' expr (';' complexOrSimpleStmt ^+ ';' )? )
|
#| | simpleExpr ( ('=' expr (';' complexOrSimpleStmt ^+ ';' )? )
|
||||||
#| | (':' expr (',' exprColonEqExpr ^+ ',' )? ) ) )
|
#| | (':' expr (',' exprColonEqExpr ^+ ',' )? ) ) )
|
||||||
#| optPar ')'
|
#| optPar ')'
|
||||||
|
|
@ -523,6 +525,8 @@ proc parsePar(p: var TParser): PNode =
|
||||||
getTok(p)
|
getTok(p)
|
||||||
optInd(p, result)
|
optInd(p, result)
|
||||||
semiStmtList(p, result)
|
semiStmtList(p, result)
|
||||||
|
elif p.tok.tokType == tkCurlyDotLe:
|
||||||
|
result.add(parseStmtPragma(p))
|
||||||
elif p.tok.tokType != tkParRi:
|
elif p.tok.tokType != tkParRi:
|
||||||
var a = simpleExpr(p)
|
var a = simpleExpr(p)
|
||||||
if p.tok.tokType == tkEquals:
|
if p.tok.tokType == tkEquals:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue