mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-22 23:35:22 +00:00
make quote ast a ref type (#5246)
* make quote ast a ref type * recursive set flag isRef for quoted ast
This commit is contained in:
committed by
Andreas Rumpf
parent
b85898cd41
commit
130f30ddb2
69
tests/vm/tnimnode.nim
Normal file
69
tests/vm/tnimnode.nim
Normal file
@@ -0,0 +1,69 @@
|
||||
import macros
|
||||
|
||||
proc assertEq(arg0,arg1: string): void =
|
||||
if arg0 != arg1:
|
||||
raiseAssert("strings not equal:\n" & arg0 & "\n" & arg1)
|
||||
|
||||
static:
|
||||
# a simple assignment of stmtList to another variable
|
||||
var node: NimNode
|
||||
# an assignment of stmtList into an array
|
||||
var nodeArray: array[1, NimNode]
|
||||
# an assignment of stmtList into a seq
|
||||
var nodeSeq = newSeq[NimNode](1)
|
||||
|
||||
|
||||
proc checkNode(arg: NimNode; name: string): void {. compileTime .} =
|
||||
echo "checking ", name
|
||||
|
||||
assertEq arg.lispRepr , "StmtList(DiscardStmt(Empty()))"
|
||||
|
||||
node = arg
|
||||
nodeArray = [arg]
|
||||
nodeSeq[0] = arg
|
||||
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)))"""
|
||||
|
||||
echo "OK"
|
||||
|
||||
static:
|
||||
# the root node that is used to generate the Ast
|
||||
var stmtList: NimNode
|
||||
|
||||
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(stmtList, "create with quote")
|
||||
|
||||
|
||||
static:
|
||||
echo "testing body from loop"
|
||||
var loop = quote do:
|
||||
for i in 0 ..< 10:
|
||||
discard
|
||||
|
||||
let innerBody = loop[0][2]
|
||||
innerBody.add newCall(ident"echo", newLit("Hello World"))
|
||||
|
||||
assertEq loop[0][2].lispRepr, innerBody.lispRepr
|
||||
|
||||
echo "OK"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user