mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-04 12:07:51 +00:00
* macros.treeRepr + friends: collapse SymChoice * make repr+friends work with invalid symchoice nodes * address comment
162 lines
4.2 KiB
Nim
162 lines
4.2 KiB
Nim
# 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""""
|