From b0c06aa7110fc46d3158b620f07aba33b6cd9976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Wed, 4 Dec 2019 08:33:01 +0100 Subject: [PATCH] fix #12740 (#12774) * fix #12740 * A different kind of a hack * proper fix * fix typo --- compiler/renderer.nim | 23 ++++++++++++++------- tests/macros/tastrepr.nim | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 tests/macros/tastrepr.nim diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 698d84de66..d9d4a9bc90 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -451,7 +451,11 @@ proc lsub(g: TSrcGen; n: PNode): int = result = lcomma(g, n, 0, - 3) if n[^2].kind != nkEmpty: result = result + lsub(g, n[^2]) + 2 if n[^1].kind != nkEmpty: result = result + lsub(g, n[^1]) + 3 - of nkVarTuple: result = lcomma(g, n, 0, - 3) + len("() = ") + lsub(g, lastSon(n)) + of nkVarTuple: + if n[^1].kind == nkEmpty: + result = lcomma(g, n, 0, - 2) + len("()") + else: + result = lcomma(g, n, 0, - 3) + len("() = ") + lsub(g, lastSon(n)) of nkChckRangeF: result = len("chckRangeF") + 2 + lcomma(g, n) of nkChckRange64: result = len("chckRange64") + 2 + lcomma(g, n) of nkChckRange: result = len("chckRange") + 2 + lcomma(g, n) @@ -1119,12 +1123,17 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = putWithSpace(g, tkEquals, "=") gsub(g, n[^1], c) of nkVarTuple: - put(g, tkParLe, "(") - gcomma(g, n, 0, -3) - put(g, tkParRi, ")") - put(g, tkSpaces, Space) - putWithSpace(g, tkEquals, "=") - gsub(g, lastSon(n), c) + if n[^1].kind == nkEmpty: + put(g, tkParLe, "(") + gcomma(g, n, 0, -2) + put(g, tkParRi, ")") + else: + put(g, tkParLe, "(") + gcomma(g, n, 0, -3) + put(g, tkParRi, ")") + put(g, tkSpaces, Space) + putWithSpace(g, tkEquals, "=") + gsub(g, lastSon(n), c) of nkExprColonExpr: gsub(g, n, 0) putWithSpace(g, tkColon, ":") diff --git a/tests/macros/tastrepr.nim b/tests/macros/tastrepr.nim new file mode 100644 index 0000000000..e4271f0192 --- /dev/null +++ b/tests/macros/tastrepr.nim @@ -0,0 +1,43 @@ +discard """ +output: ''' +var data = @[(1, "one"), (2, "two")] +for (i, d) in pairs(data): + discard +for i, d in pairs(data): + discard +for i, (x, y) in pairs(data): + discard +var (a, b) = (1, 2) + +var data = @[(1, "one"), (2, "two")] +for (i, d) in pairs(data): + discard +for i, d in pairs(data): + discard +for i, (x, y) in pairs(data): + discard +var (a, b) = (1, 2) +''' +""" + +import macros + +macro echoTypedRepr(arg: typed) = + result = newCall(ident"echo", newLit(arg.repr)) + +macro echoUntypedRepr(arg: untyped) = + result = newCall(ident"echo", newLit(arg.repr)) + +template echoTypedAndUntypedRepr(arg: untyped) = + echoTypedRepr(arg) + echoUntypedRepr(arg) + +echoTypedAndUntypedRepr: + var data = @[(1,"one"), (2,"two")] + for (i, d) in pairs(data): + discard + for i, d in pairs(data): + discard + for i, (x,y) in pairs(data): + discard + var (a,b) = (1,2)