summary refs log tree commit diff stats
path: root/tests/macros/tdumpast.nim
blob: 484b3c2f3a28c33446df0428fe21e978010dfc2a (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# Dump the contents of a NimNode

import macros

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

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

  macro dumpAST(n: untyped): string =
    var msg = ""
    msg.add "lispRepr:\n" & n.lispRepr & "\n"
    msg.add "treeRepr:\n" & n.treeRepr & "\n"

    var plusAst = getAst(plus(1, 2))
    msg.add "lispRepr:\n" & n.lispRepr & "\n"

    var callAst = getAst(call(4))
    msg.add "callAst.lispRepr:\n" & callAst.lispRepr & "\n"

    var e = parseExpr("foo(bar + baz)")
    msg.add "e.lispRepr:\n" & e.lispRepr & "\n"
    result = msg.newLit

  let a = dumpAST:
    proc add(x, y: int): int =
      return x + y
    const foo = 3

  doAssert a == """
lispRepr:
(StmtList (ProcDef (Ident "add") (Empty) (Empty) (FormalParams (Ident "int") (IdentDefs (Ident "x") (Ident "y") (Ident "int") (Empty))) (Empty) (Empty) (StmtList (ReturnStmt (Infix (Ident "+") (Ident "x") (Ident "y"))))) (ConstSection (ConstDef (Ident "foo") (Empty) (IntLit 3))))
treeRepr:
StmtList
  ProcDef
    Ident "add"
    Empty
    Empty
    FormalParams
      Ident "int"
      IdentDefs
        Ident "x"
        Ident "y"
        Ident "int"
        Empty
    Empty
    Empty
    StmtList
      ReturnStmt
        Infix
          Ident "+"
          Ident "x"
          Ident "y"
  ConstSection
    ConstDef
      Ident "foo"
      Empty
      IntLit 3
lispRepr:
(StmtList (ProcDef (Ident "add") (Empty) (Empty) (FormalParams (Ident "int") (IdentDefs (Ident "x") (Ident "y") (Ident "int") (Empty))) (Empty) (Empty) (StmtList (ReturnStmt (Infix (Ident "+") (Ident "x") (Ident "y"))))) (ConstSection (ConstDef (Ident "foo") (Empty) (IntLit 3))))
callAst.lispRepr:
(Call (Ident "foo") (StrLit "bar"))
e.lispRepr:
(Call (Ident "foo") (Infix (Ident "+") (Ident "bar") (Ident "baz")))
"""

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

block: # treeRepr
  macro treeRepr2(a: untyped): string = newLit a.treeRepr
  macro treeRepr3(a: typed): string = newLit a.treeRepr

  doAssert treeRepr2(1+1 == 2) == """
Infix
  Ident "=="
  Infix
    Ident "+"
    IntLit 1
    IntLit 1
  IntLit 2"""

  proc baz() = discard
  proc baz(a: int) = discard
  proc baz(a: float) = discard

  doAssert treeRepr3(baz()) == """
Call
  Sym "baz""""

  let a = treeRepr3(block:
    proc bar(a: auto) = baz())
  doAssert a == """
BlockStmt
  Empty
  ProcDef
    Sym "bar"
    Empty
    GenericParams
      Sym "a:type"
    FormalParams
      Empty
      IdentDefs
        Sym "a"
        Sym "auto"
        Empty
    Empty
    Bracket
      Empty
      Empty
    StmtList
      Call
        OpenSymChoice 3 "baz""""