dumpToString: improves on sugar.dump (#16841)

* dumpToString
* _
* fixup
* changelog
* address comment: removed the word "Deprecated"
This commit is contained in:
Timothee Cour 2021-02-01 22:41:33 -08:00 • committed by GitHub
commit 4b2054a7bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 4 deletions

View file

@ -104,6 +104,7 @@ with other backends. see #9125. Use `-d:nimLegacyJsRound` for previous behavior.
`-d:nimLegacyParseQueryStrict`. `cgi.decodeData` which uses the same `-d:nimLegacyParseQueryStrict`. `cgi.decodeData` which uses the same
underlying code is also updated the same way. underlying code is also updated the same way.
- Added `sugar.dumpToString` which improves on `sugar.dump`.

View file

@ -156,16 +156,45 @@ macro dump*(x: untyped): untyped =
## It accepts any expression and prints a textual representation ## It accepts any expression and prints a textual representation
## of the tree representing the expression - as it would appear in ## of the tree representing the expression - as it would appear in
## source code - together with the value of the expression. ## source code - together with the value of the expression.
##
## See also: `dumpToString` which is more convenient and useful since
## it expands intermediate templates/macros, returns a string instead of
## calling `echo`, and works with statements and expressions.
runnableExamples: runnableExamples:
let let
x = 10 x = 10
y = 20 y = 20
dump(x + y) # will print `x + y = 30` if false: dump(x + y) # if true would print `x + y = 30`
let s = x.toStrLit let s = x.toStrLit
let r = quote do: result = quote do:
debugEcho `s`, " = ", `x` debugEcho `s`, " = ", `x`
return r
macro dumpToStringImpl(s: static string, x: typed): string =
let s2 = x.toStrLit
if x.typeKind == ntyVoid:
result = quote do:
`s` & ": " & `s2`
else:
result = quote do:
`s` & ": " & `s2` & " = " & $`x`
macro dumpToString*(x: untyped): string =
## Returns the content of a statement or expression `x` after semantic analysis,
## useful for debugging.
runnableExamples:
const a = 1
let x = 10
doAssert dumpToString(a + 2) == "a + 2: 3 = 3"
doAssert dumpToString(a + x) == "a + x: 1 + x = 11"
template square(x): untyped = x * x
doAssert dumpToString(square(x)) == "square(x): x * x = 100"
doAssert not compiles dumpToString(1 + nonexistant)
import std/strutils
doAssert "failedAssertImpl" in dumpToString(doAssert true) # example with a statement
result = newCall(bindSym"dumpToStringImpl")
result.add newLit repr(x)
result.add x
# TODO: consider exporting this in macros.nim # TODO: consider exporting this in macros.nim
proc freshIdentNodes(ast: NimNode): NimNode = proc freshIdentNodes(ast: NimNode): NimNode =

View file

@ -107,4 +107,14 @@ doAssert collect(for d in data.items: {d}) == data.toHashSet
# bug #14332 # bug #14332
template foo = template foo =
discard collect(newSeq, for i in 1..3: i) discard collect(newSeq, for i in 1..3: i)
foo() foo()
block: # dumpToString
template square(x): untyped = x * x
let x = 10
doAssert dumpToString(square(x)) == "square(x): x * x = 100"
let s = dumpToString(doAssert 1+1 == 2)
doAssert "failedAssertImpl" in s
let s2 = dumpToString:
doAssertRaises(AssertionDefect): doAssert false
doAssert "except AssertionDefect" in s2