123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import macros
- proc assertEq(arg0,arg1: string): void =
- if arg0 != arg1:
- raiseAssert("strings not equal:\n" & arg0 & "\n" & arg1)
- # a simple assignment of stmtList to another variable
- var node {.compileTime.}: NimNode
- # an assignment of stmtList into an array
- var nodeArray {.compileTime.}: array[1, NimNode]
- # an assignment of stmtList into a seq
- var nodeSeq {.compileTime.} = newSeq[NimNode](2)
- proc checkNode(arg: NimNode; name: string): void {. compileTime .} =
- echo "checking ", name
- assertEq arg.lispRepr, """(StmtList (DiscardStmt (Empty)))"""
- node = arg
- nodeArray = [arg]
- nodeSeq[0] = arg
- var seqAppend = newSeq[NimNode](0)
- seqAppend.add([arg]) # at the time of this writing this works
- seqAppend.add(arg) # bit this creates a copy
- arg.add newCall(ident"echo", newLit("Hello World"))
- assertEq arg.lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
- assertEq node.lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
- assertEq nodeArray[0].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
- assertEq nodeSeq[0].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
- assertEq seqAppend[0].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
- assertEq seqAppend[1].lispRepr, """(StmtList (DiscardStmt (Empty)) (Call (Ident "echo") (StrLit "Hello World")))"""
- echo "OK"
- # the root node that is used to generate the Ast
- var stmtList {.compileTime.}: NimNode
- static:
- stmtList = newStmtList(nnkDiscardStmt.newTree(newEmptyNode()))
- checkNode(stmtList, "direct construction")
- macro foo(stmtList: untyped): untyped =
- checkNode(stmtList, "untyped macro argument")
- foo:
- discard
- static:
- stmtList = quote do:
- discard
- checkNode(newTree(nnkStmtList, stmtList), "create with quote")
- static:
- echo "testing body from loop"
- var loop = quote do:
- for i in 0 ..< 10:
- discard
- let innerBody = loop[2]
- innerBody.add newCall(ident"echo", newLit("Hello World"))
- assertEq loop[2].lispRepr, innerBody.lispRepr
- echo "OK"
- static:
- echo "testing creation of comment node"
- var docComment: NimNode = newNimNode(nnkCommentStmt)
- docComment.strVal = "This is a doc comment"
- assertEq repr(docComment), "## This is a doc comment"
- echo "OK"
|