diff options
-rw-r--r-- | compiler/parser.nim | 1 | ||||
-rw-r--r-- | compiler/renderer.nim | 17 | ||||
-rw-r--r-- | tests/macros/tmacrostmt.nim | 16 |
3 files changed, 29 insertions, 5 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim index c513fac68..5664a9f67 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -568,6 +568,7 @@ proc parsePar(p: var TParser): PNode = result = newNodeP(nkPar, p) getTok(p) optInd(p, result) + flexComment(p, result) if p.tok.tokType in {tkDiscard, tkInclude, tkIf, tkWhile, tkCase, tkTry, tkDefer, tkFinally, tkExcept, tkFor, tkBlock, tkConst, tkLet, tkWhen, tkVar, diff --git a/compiler/renderer.nim b/compiler/renderer.nim index ae5b05b18..ce27e1cd9 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -634,9 +634,16 @@ proc gstmts(g: var TSrcGen, n: PNode, c: TContext, doIndent=true) = optNL(g) +proc gcond(g: var TSrcGen, n: PNode) = + if n.kind == nkStmtListExpr: + put(g, tkParLe, "(") + gsub(g, n) + if n.kind == nkStmtListExpr: + put(g, tkParRi, ")") + proc gif(g: var TSrcGen, n: PNode) = var c: TContext - gsub(g, n.sons[0].sons[0]) + gcond(g, n.sons[0].sons[0]) initContext(c) putWithSpace(g, tkColon, ":") if longMode(g, n) or (lsub(g, n.sons[0].sons[1]) + g.lineLen > MaxLineLen): @@ -651,7 +658,7 @@ proc gif(g: var TSrcGen, n: PNode) = proc gwhile(g: var TSrcGen, n: PNode) = var c: TContext putWithSpace(g, tkWhile, "while") - gsub(g, n.sons[0]) + gcond(g, n.sons[0]) putWithSpace(g, tkColon, ":") initContext(c) if longMode(g, n) or (lsub(g, n.sons[1]) + g.lineLen > MaxLineLen): @@ -715,7 +722,7 @@ proc gcase(g: var TSrcGen, n: PNode) = var last = if n.sons[length-1].kind == nkElse: -2 else: -1 if longMode(g, n, 0, last): incl(c.flags, rfLongMode) putWithSpace(g, tkCase, "case") - gsub(g, n.sons[0]) + gcond(g, n.sons[0]) gcoms(g) optNL(g) gsons(g, n, c, 1, last) @@ -1102,13 +1109,13 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = put(g, tkAccent, "`") of nkIfExpr: putWithSpace(g, tkIf, "if") - if n.len > 0: gsub(g, n.sons[0], 0) + if n.len > 0: gcond(g, n.sons[0].sons[0]) putWithSpace(g, tkColon, ":") if n.len > 0: gsub(g, n.sons[0], 1) gsons(g, n, emptyContext, 1) of nkElifExpr: putWithSpace(g, tkElif, " elif") - gsub(g, n, 0) + gcond(g, n[0]) putWithSpace(g, tkColon, ":") gsub(g, n, 1) of nkElseExpr: diff --git a/tests/macros/tmacrostmt.nim b/tests/macros/tmacrostmt.nim index abb4cc050..9dbfbce43 100644 --- a/tests/macros/tmacrostmt.nim +++ b/tests/macros/tmacrostmt.nim @@ -57,5 +57,21 @@ proc test_block(x, y : int): int = result = x result = y +#------------------------------------ +# bugs #8348 + +template `>`(x, y: untyped): untyped = + ## "is greater" operator. This is the same as ``y < x``. + y < x + +proc test_cond_stmtlist(x, y: int): int = + result = x + if x > y: + result = x + + repr_and_parse(one_if_proc) repr_and_parse(test_block) +repr_and_parse(test_cond_stmtlist) + + |