summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAdam Strzelecki <ono@java.pl>2015-06-02 21:56:44 +0200
committerOscar Campbell <oscar@campbell.nu>2015-06-07 13:14:52 +0200
commit83369f4bce15d6d8f4d0bd9a7cb17b2def6daa54 (patch)
tree527ec28d233e7b81a4dbed306c6fd0ce22392bcd
parent07c40add8fbc3b4c248c1403f903617a6bdb027e (diff)
downloadNim-83369f4bce15d6d8f4d0bd9a7cb17b2def6daa54.tar.gz
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.
-rw-r--r--compiler/parser.nim4
1 files changed, 4 insertions, 0 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 18ef06e64..05b4df13d 100644
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -64,6 +64,7 @@ proc setBaseFlags*(n: PNode, base: TNumericalBase)
 proc parseSymbol*(p: var TParser, allowNil = false): PNode
 proc parseTry(p: var TParser; isExpr: bool): PNode
 proc parseCase(p: var TParser): PNode
+proc parseStmtPragma(p: var TParser): PNode
 # implementation
 
 proc getTok(p: var TParser) =
@@ -502,6 +503,7 @@ proc parsePar(p: var TParser): PNode =
   #| par = '(' optInd
   #|           ( &parKeyw complexOrSimpleStmt ^+ ';'
   #|           | ';' complexOrSimpleStmt ^+ ';'
+  #|           | pragmaStmt
   #|           | simpleExpr ( ('=' expr (';' complexOrSimpleStmt ^+ ';' )? )
   #|                        | (':' expr (',' exprColonEqExpr     ^+ ',' )? ) ) )
   #|           optPar ')'
@@ -523,6 +525,8 @@ proc parsePar(p: var TParser): PNode =
     getTok(p)
     optInd(p, result)
     semiStmtList(p, result)
+  elif p.tok.tokType == tkCurlyDotLe:
+    result.add(parseStmtPragma(p))
   elif p.tok.tokType != tkParRi:
     var a = simpleExpr(p)
     if p.tok.tokType == tkEquals: