From 61720e0df9475af647de171f6b2964c36234961a Mon Sep 17 00:00:00 2001 From: Andreas Rumpf Date: Tue, 26 Sep 2017 10:24:14 +0200 Subject: breaking change: getAst strips away pointless nnkStmtList nodes; node rendering of nnkStmtList without wrong indentation --- compiler/renderer.nim | 8 +++++++- compiler/semexprs.nim | 7 ++++--- compiler/vm.nim | 3 ++- 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 -- cgit 1.4.1-2-gfad0