123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- # 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""""
|