diff --git a/src/einheit.nim b/src/einheit.nim index a78f332..4b32088 100644 --- a/src/einheit.nim +++ b/src/einheit.nim @@ -43,21 +43,22 @@ template tupleObjToStr(obj): string {.dirty.} = res.add("(") var firstElement = true for name, value in n.fieldPairs(): - if not firstElement: - res.add(", ") - res.add(name) - res.add(": ") - when (value is object or value is tuple): - when (value is tuple): - res.add("tuple " & typeToStr(type(value))) + when compiles(value): + if not firstElement: + res.add(", ") + res.add(name) + res.add(": ") + when (value is object or value is tuple): + when (value is tuple): + res.add("tuple " & typeToStr(type(value))) + else: + res.add(typeToStr(type(value))) + helper(value) + elif (value is string): + res.add("\"" & $value & "\"") else: - res.add(typeToStr(type(value))) - helper(value) - elif (value is string): - res.add("\"" & $value & "\"") - else: - res.add($value) - firstElement = false + res.add($value) + firstElement = false res.add(")") helper(obj) res @@ -207,6 +208,21 @@ template recursive(node, action): untyped {.dirty.} = result.add helper(c) discard helper(node) +proc getNode(nodeKind: NimNodeKind, node: NimNode): NimNode = + ## Gets the first node with nodeKind + var stack: seq[NimNode] = @[node] + + while stack.len() > 0: + let newNode = stack.pop() + for i in 0 ..< newNode.len(): + let child = newNode[i] + if child.kind == nodeKind: + return child + else: + stack.add(child) + + return newEmptyNode() + template strRep(n: NimNode): untyped = toString(n) @@ -215,7 +231,7 @@ template tableEntry(n: NimNode): untyped = macro getSyms(code:untyped): untyped = ## This macro gets all symbols and values of an expression - ## into a table + ## into a table ## ## Table[string, string] -> symbolName, value ## @@ -240,7 +256,7 @@ macro getSyms(code:untyped): untyped = tableConstr.add(tableEntry(ch1)) if ch1.len() > 0 and ch1[0].kind == nnkDotExpr: tableConstr.add(tableEntry(ch1[0][0])) - for i in 1..