summary refs log tree commit diff stats
path: root/tests/macros/tdumpast.nim
blob: b6bcbe8f04dfc57a2632d996bc072cf7a8d43515 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# Dump the contents of a NimNode

import macros

template plus(a, b: untyped): untyped {.dirty} =
  a + b

macro call(e: untyped): untyped =
  result = newCall("foo", newStrLitNode("bar"))

macro dumpAST(n: untyped): untyped =
  # dump AST as a side-effect and return the inner node
  let n = callsite()
  echo n.lispRepr
  echo n.treeRepr

  var plusAst = getAst(plus(1, 2))
  echo plusAst.lispRepr

  var callAst = getAst(call(4))
  echo callAst.lispRepr

  var e = parseExpr("foo(bar + baz)")
  echo e.lispRepr

  result = n[1]

dumpAST:
  proc add(x, y: int): int =
    return x + y

  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()

macro fun4() =
  let n = quote do:
    (a: 1)
  doAssert n.repr == "(a: 1)", n.repr
fun4()

# nkTupleConstr vs nkPar tests:
block: # lispRepr
  macro lispRepr2(a: untyped): string = newLit a.lispRepr

  doAssert lispRepr2(()) == """(TupleConstr)"""
  doAssert lispRepr2((a: 1)) == """(TupleConstr (ExprColonExpr (Ident "a") (IntLit 1)))"""
  doAssert lispRepr2((a: 1, b: 2)) == """(TupleConstr (ExprColonExpr (Ident "a") (IntLit 1)) (ExprColonExpr (Ident "b") (IntLit 2)))"""
  doAssert lispRepr2((1,)) == """(TupleConstr (IntLit 1))"""
  doAssert lispRepr2((1, 2)) == """(TupleConstr (IntLit 1) (IntLit 2))"""
  doAssert lispRepr2((1, 2, 3.0)) == """(TupleConstr (IntLit 1) (IntLit 2) (FloatLit 3.0))"""
  doAssert lispRepr2((1)) == """(Par (IntLit 1))"""
  doAssert lispRepr2((1+2)) == """(Par (Infix (Ident "+") (IntLit 1) (IntLit 2)))"""

block: # repr
  macro repr2(a: untyped): string = newLit a.repr

  doAssert repr2(()) == "()"
  doAssert repr2((a: 1)) == "(a: 1)"
  doAssert repr2((a: 1, b: 2)) == "(a: 1, b: 2)"
  doAssert repr2((1,)) == "(1,)"
  doAssert repr2((1, 2)) == "(1, 2)"
  doAssert repr2((1, 2, 3.0)) == "(1, 2, 3.0)"
  doAssert repr2((1)) == "(1)"
  doAssert repr2((1+2)) == "(1 + 2)"