summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2017-09-26 10:24:14 +0200
committerAndreas Rumpf <rumpf_a@web.de>2017-09-26 10:24:14 +0200
commit61720e0df9475af647de171f6b2964c36234961a (patch)
tree855abcb47447691e5d8f9d03d9828852d5d5f77a
parenteeb2661a28069c94b44cf965817709b0cd9886d7 (diff)
downloadNim-61720e0df9475af647de171f6b2964c36234961a.tar.gz
breaking change: getAst strips away pointless nnkStmtList nodes; node rendering of nnkStmtList without wrong indentation
-rw-r--r--compiler/renderer.nim8
-rw-r--r--compiler/semexprs.nim7
-rw-r--r--compiler/vm.nim3
3 files changed, 13 insertions, 5 deletions
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index c52161a55..05329394a 100644
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -1366,7 +1366,13 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
 proc renderTree(n: PNode, renderFlags: TRenderFlags = {}): string =
   var g: TSrcGen
   initSrcGen(g, renderFlags)
-  gsub(g, n)
+  # do not indent the initial statement list so that
+  # writeFile("file.nim", repr n)
+  # produces working Nim code:
+  if n.kind in {nkStmtList, nkStmtListExpr, nkStmtListType}:
+    gstmts(g, n, emptyContext, doIndent = false)
+  else:
+    gsub(g, n)
   result = g.buf
 
 proc renderModule(n: PNode, filename: string,
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index fb86eae05..439f2772a 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -1617,9 +1617,10 @@ proc semExpandToAst(c: PContext, n: PNode): PNode =
   # Preserve the magic symbol in order to be handled in evals.nim
   internalAssert n.sons[0].sym.magic == mExpandToAst
   #n.typ = getSysSym("NimNode").typ # expandedSym.getReturnType
-  n.typ = if getCompilerProc("NimNode") != nil: sysTypeFromName"NimNode"
-          else: sysTypeFromName"PNimrodNode"
-  result = n
+  if n.kind == nkStmtList and n.len == 1: result = n[0]
+  else: result = n
+  result.typ = if getCompilerProc("NimNode") != nil: sysTypeFromName"NimNode"
+               else: sysTypeFromName"PNimrodNode"
 
 proc semExpandToAst(c: PContext, n: PNode, magicSym: PSym,
                     flags: TExprFlags = {}): PNode =
diff --git a/compiler/vm.nim b/compiler/vm.nim
index 8d4359db9..cb801bd5e 100644
--- a/compiler/vm.nim
+++ b/compiler/vm.nim
@@ -979,7 +979,8 @@ proc rawExecute(c: PCtx, start: int, tos: PStackFrame): TFullReg =
           let node = regs[rb+i].regToNode
           node.info = c.debug[pc]
           macroCall.add(node)
-        let a = evalTemplate(macroCall, prc, genSymOwner)
+        var a = evalTemplate(macroCall, prc, genSymOwner)
+        if a.kind == nkStmtList and a.len == 1: a = a[0]
         a.recSetFlagIsRef
         ensureKind(rkNode)
         regs[ra].node = a