From eec07b4e84d3418d171cf08aa8a02f380a39b78e Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Tue, 11 Feb 2020 12:33:06 -0800 Subject: [PATCH] fix several bugs with `repr` (#13386) --- compiler/renderer.nim | 12 ++++++++---- tests/errmsgs/t8434.nim | 3 +-- tests/macros/tdumpast.nim | 17 +++++++++++++++++ tests/stdlib/tunittesttemplate.nim | 4 ++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/compiler/renderer.nim b/compiler/renderer.nim index d9d4a9bc9078..8840e08bee27 100644 --- a/compiler/renderer.nim +++ b/compiler/renderer.nim @@ -437,7 +437,7 @@ proc lsub(g: TSrcGen; n: PNode): int = of nkTableConstr: result = if n.len > 0: lcomma(g, n) + 2 else: len("{:}") of nkClosedSymChoice, nkOpenSymChoice: - result = lsons(g, n) + len("()") + n.len - 1 + if n.len > 0: result += lsub(g, n[0]) of nkTupleTy: result = lcomma(g, n) + len("tuple[]") of nkTupleClassTy: result = len("tuple") of nkDotExpr: result = lsons(g, n) + 1 @@ -529,10 +529,12 @@ proc lsub(g: TSrcGen; n: PNode): int = if n[0].kind != nkEmpty: result = result + lsub(g, n[0]) + 2 of nkExceptBranch: result = lcomma(g, n, 0, -2) + lsub(g, lastSon(n)) + len("except_:_") + of nkObjectTy: + result = len("object_") else: result = MaxLineLen + 1 proc fits(g: TSrcGen, x: int): bool = - result = x + g.lineLen <= MaxLineLen + result = x <= MaxLineLen type TSubFlag = enum @@ -572,7 +574,7 @@ proc gcommaAux(g: var TSrcGen, n: PNode, ind: int, start: int = 0, for i in start..n.len + theEnd: var c = i < n.len + theEnd var sublen = lsub(g, n[i]) + ord(c) - if not fits(g, sublen) and (ind + sublen < MaxLineLen): optNL(g, ind) + if not fits(g, g.lineLen + sublen) and (ind + sublen < MaxLineLen): optNL(g, ind) let oldLen = g.tokens.len gsub(g, n[i]) if c: @@ -1139,10 +1141,12 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) = putWithSpace(g, tkColon, ":") gsub(g, n, 1) of nkInfix: + let oldLineLen = g.lineLen # we cache this because lineLen gets updated below infixArgument(g, n, 1) put(g, tkSpaces, Space) gsub(g, n, 0) # binary operator - if n.len == 3 and not fits(g, lsub(g, n[2]) + lsub(g, n[0]) + 1): + # eg: `n1 == n2` decompses as following sum: + if n.len == 3 and not fits(g, oldLineLen + lsub(g, n[1]) + lsub(g, n[2]) + lsub(g, n[0]) + len(" ")): optNL(g, g.indent + longIndentWid) else: put(g, tkSpaces, Space) diff --git a/tests/errmsgs/t8434.nim b/tests/errmsgs/t8434.nim index ada38e9c017c..c8bc1193bcc9 100644 --- a/tests/errmsgs/t8434.nim +++ b/tests/errmsgs/t8434.nim @@ -1,8 +1,7 @@ discard """ errormsg: "type mismatch: got " nimout: '''but expected one of: -proc fun0[T1: int | float | - object | array | seq](a1: T1; a2: int) +proc fun0[T1: int | float | object | array | seq](a1: T1; a2: int) first type mismatch at position: 1 required type for a1: T1: int or float or object or array or seq[T] but expression 'byte(1)' is of type: byte diff --git a/tests/macros/tdumpast.nim b/tests/macros/tdumpast.nim index 3a26ffd2f1e0..b9d224ab81ec 100644 --- a/tests/macros/tdumpast.nim +++ b/tests/macros/tdumpast.nim @@ -31,3 +31,20 @@ dumpAST: proc sub(x, y: int): int = return x - y +macro fun() = + let n = quote do: + 1+1 == 2 + doAssert n.repr == "1 + 1 == 2", n.repr +fun() + +macro fun2(): untyped = + let n = quote do: + 1 + 2 * 3 == 1 + 6 + doAssert n.repr == "1 + 2 * 3 == 1 + 6", n.repr +fun2() + +macro fun3(): untyped = + let n = quote do: + int | float | array | seq | object | ptr | pointer | float32 + doAssert n.repr == "int | float | array | seq | object | ptr | pointer | float32", n.repr +fun3() diff --git a/tests/stdlib/tunittesttemplate.nim b/tests/stdlib/tunittesttemplate.nim index 5ac323a3699f..2ca50a18b3d5 100644 --- a/tests/stdlib/tunittesttemplate.nim +++ b/tests/stdlib/tunittesttemplate.nim @@ -1,13 +1,13 @@ discard """ exitcode: 1 outputsub: ''' - tunittesttemplate.nim(20, 12): Check failed: a.b == - 2 + tunittesttemplate.nim(20, 12): Check failed: a.b == 2 a.b was 0 [FAILED] 1 ''' """ + # bug #6736 import unittest