From 5ef0c35a228b83f23b8efcf4311f21a3d07b4e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Fri, 29 Nov 2019 22:49:24 +0100 Subject: [PATCH 1/4] fix #12740 --- compiler/renderer.nim | 2 +- tests/macros/tastrepr.nim | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 tests/macros/tastrepr.nim diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 698d84de667c..98ea78fb1c5c 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -1120,7 +1120,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = gsub(g, n[^1], c) of nkVarTuple: put(g, tkParLe, "(") - gcomma(g, n, 0, -3) + gcomma(g, n, 0, -2) put(g, tkParRi, ")") put(g, tkSpaces, Space) putWithSpace(g, tkEquals, "=") diff --git a/tests/macros/tastrepr.nim b/tests/macros/tastrepr.nim new file mode 100644 index 000000000000..e80aaf00dec6 --- /dev/null +++ b/tests/macros/tastrepr.nim @@ -0,0 +1,17 @@ +discard """ +output: ''' +var data = @["one", "two"] +for (i, d) = in pairs(data): + echo [d] +''' +""" + +import macros + +macro foobar(arg: typed) = + result = newCall(ident"echo", newLit(arg.repr)) + +foobar: + var data = @["one", "two"] + for (i, d) in data.pairs: + echo d From 512df9380367fb478a20cecd64cb300a88eb0097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Sat, 30 Nov 2019 02:17:53 +0100 Subject: [PATCH 2/4] A different kind of a hack --- compiler/renderer.nim | 17 +++++++++++------ tests/macros/tastrepr.nim | 16 +++++++++++++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 98ea78fb1c5c..e36f5935c295 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -1119,12 +1119,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, -2) - put(g, tkParRi, ")") - put(g, tkSpaces, Space) - putWithSpace(g, tkEquals, "=") - gsub(g, lastSon(n), c) + if n[0].kind == nkSym and n[0].sym.kind == skForVar: + 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 index e80aaf00dec6..635e603fd882 100644 --- a/tests/macros/tastrepr.nim +++ b/tests/macros/tastrepr.nim @@ -1,8 +1,13 @@ discard """ output: ''' -var data = @["one", "two"] -for (i, d) = in pairs(data): +var data = @[(1, "one"), (2, "two")] +for (i, d) in pairs(data): echo [d] +for i, d in pairs(data): + echo [d] +for i, (x, y) in pairs(data): + echo [x, " -> ", y] +var (a, b) = (1, 2) ''' """ @@ -12,6 +17,11 @@ macro foobar(arg: typed) = result = newCall(ident"echo", newLit(arg.repr)) foobar: - var data = @["one", "two"] + var data = @[(1,"one"), (2,"two")] for (i, d) in data.pairs: echo d + for i, d in data.pairs: + echo d + for i, (x,y) in data.pairs: + echo x, " -> ", y + var (a,b) = (1,2) From 5c7ab022b1772033f8c6014d0c7d826155b078fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Sat, 30 Nov 2019 10:54:06 +0100 Subject: [PATCH 3/4] proper fix --- compiler/renderer.nim | 8 ++++++-- tests/macros/tastrepr.nim | 38 +++++++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index e36f5935c295..0675710415f0 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,7 +1123,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = putWithSpace(g, tkEquals, "=") gsub(g, n[^1], c) of nkVarTuple: - if n[0].kind == nkSym and n[0].sym.kind == skForVar: + if n[^1].kind == nkEmpty: put(g, tkParLe, "(") gcomma(g, n, 0, -2) put(g, tkParRi, ")") diff --git a/tests/macros/tastrepr.nim b/tests/macros/tastrepr.nim index 635e603fd882..e4271f019211 100644 --- a/tests/macros/tastrepr.nim +++ b/tests/macros/tastrepr.nim @@ -2,26 +2,42 @@ discard """ output: ''' var data = @[(1, "one"), (2, "two")] for (i, d) in pairs(data): - echo [d] + discard for i, d in pairs(data): - echo [d] + discard for i, (x, y) in pairs(data): - echo [x, " -> ", y] + 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 foobar(arg: typed) = +macro echoTypedRepr(arg: typed) = + result = newCall(ident"echo", newLit(arg.repr)) + +macro echoUntypedRepr(arg: untyped) = result = newCall(ident"echo", newLit(arg.repr)) -foobar: +template echoTypedAndUntypedRepr(arg: untyped) = + echoTypedRepr(arg) + echoUntypedRepr(arg) + +echoTypedAndUntypedRepr: var data = @[(1,"one"), (2,"two")] - for (i, d) in data.pairs: - echo d - for i, d in data.pairs: - echo d - for i, (x,y) in data.pairs: - echo x, " -> ", y + 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) From 98521a5f4344172427f1e4b1b3766a35a2dd503b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arne=20D=C3=B6ring?= Date: Sat, 30 Nov 2019 17:22:34 +0100 Subject: [PATCH 4/4] fix typo --- compiler/renderer.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index 0675710415f0..d9d4a9bc9078 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -452,7 +452,7 @@ proc lsub(g: TSrcGen; n: PNode): int = 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: - if n[1].kind == nkEmpty: + if n[^1].kind == nkEmpty: result = lcomma(g, n, 0, - 2) + len("()") else: result = lcomma(g, n, 0, - 3) + len("() = ") + lsub(g, lastSon(n))