summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/renderer.nim13
-rw-r--r--tests/stdlib/trepr.nim80
2 files changed, 90 insertions, 3 deletions
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index 13ff6941f..c36eaaf11 100644
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -1007,12 +1007,19 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
   of nkCall, nkConv, nkDotCall, nkPattern, nkObjConstr:
     if n.len > 1 and n.lastSon.kind in {nkStmtList, nkStmtListExpr}:
       accentedName(g, n[0])
-      if n.len > 2:
+      var i = 1
+      while i < n.len and n[i].kind notin {nkStmtList, nkStmtListExpr}: i.inc
+      if i > 1:
         put(g, tkParLe, "(")
-        gcomma(g, n, 1, -2)
+        gcomma(g, n, 1, i - 1 - n.len)
         put(g, tkParRi, ")")
       put(g, tkColon, ":")
-      gsub(g, n, n.len-1)
+      gsub(g, n, i)
+      for j in i+1 ..< n.len:
+        optNL(g)
+        put(g, tkDo, "do")
+        put(g, tkColon, ":")
+        gsub(g, n, j)
     elif n.len >= 1:
       case bracketKind(g, n[0])
       of bkBracket:
diff --git a/tests/stdlib/trepr.nim b/tests/stdlib/trepr.nim
index 1d89d37b2..357854d67 100644
--- a/tests/stdlib/trepr.nim
+++ b/tests/stdlib/trepr.nim
@@ -6,6 +6,8 @@ discard """
 # if excessive, could remove 'cpp' from targets
 
 from strutils import endsWith, contains
+from std/macros import newLit
+macro deb(a): string = newLit a.repr
 
 template main() =
   doAssert repr({3,5}) == "{3, 5}"
@@ -65,5 +67,83 @@ template main() =
     else:
       doAssert reprOpenarray(arr) == "[1, 2, 3]"
 
+  block: # bug #17292
+    template foo(a, b, c, d) = discard
+    block:
+      let a = deb:
+        foo(1, 2, 3, 4)
+      doAssert a == "\nfoo(1, 2, 3, 4)"
+    block:
+      let a = deb:
+        foo(1, 2, 3): 4
+      doAssert a == """
+
+foo(1, 2, 3):
+  4"""
+
+    block:
+      let a = deb:
+        foo(1, 2): 3
+        do: 4
+      doAssert a == """
+
+foo(1, 2):
+  3
+do:
+  4"""
+
+    block:
+      let a = deb:
+        foo(1): 3
+        do: 3
+        do: 4
+      doAssert a == """
+
+foo(1):
+  3
+do:
+  3
+do:
+  4"""
+
+    block:
+      let a = deb:
+        foo(1):
+          3
+        do:
+          discard
+          3
+        do:
+          discard
+          4
+
+      doAssert a == """
+
+foo(1):
+  3
+do:
+  discard
+  3
+do:
+  discard
+  4"""
+
+    block:
+      let a = deb:
+        foo: 1
+        do: 2
+        do: 3
+        do: 4
+      doAssert a == """
+
+foo:
+  1
+do:
+  2
+do:
+  3
+do:
+  4"""
+
 static: main()
 main()