Rename PNimrodNode to NimNode
This commit is contained in:
parent
8e651fa0d4
commit
fd4e629905
30 changed files with 508 additions and 518 deletions
|
|
@ -18,9 +18,9 @@ proc `$`*[T](x: seq[T]): string =
|
|||
result.add($x[i])
|
||||
result.add ']'
|
||||
|
||||
macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
||||
macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
||||
result = newNimNode(nnkStmtList)
|
||||
let
|
||||
let
|
||||
typeName = quoted2ident(typeNameN)
|
||||
packetID = ^"p"
|
||||
streamID = ^"s"
|
||||
|
|
@ -66,7 +66,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
readBody = newNimNode(nnkStmtList)
|
||||
lenNames = 0
|
||||
for i in 0.. typeFields.len - 1:
|
||||
let
|
||||
let
|
||||
name = typeFields[i][0]
|
||||
dotName = packetID.dot(name)
|
||||
resName = newIdentNode(!"result").dot(name)
|
||||
|
|
@ -91,11 +91,11 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
newNimNode(nnkDiscardStmt).und(
|
||||
newCall("readData", streamID, newNimNode(nnkAddr).und(resName), newCall("sizeof", resName))))
|
||||
packBody.add(
|
||||
newCall("writeData", streamID, newNimNode(nnkAddr).und(dotName), newCall("sizeof", dotName)))
|
||||
newCall("writeData", streamID, newNimNode(nnkAddr).und(dotName), newCall("sizeof", dotName)))
|
||||
of "seq":
|
||||
## let lenX = readInt16(s)
|
||||
newLenName()
|
||||
let
|
||||
let
|
||||
item = ^"item" ## item name in our iterators
|
||||
seqType = typeFields[i][1][1] ## type of seq
|
||||
readName = newIdentNode("read"& $seqType.ident)
|
||||
|
|
@ -107,7 +107,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
readBody.add( ## result.name = @[]
|
||||
resName := ("@".prefix(newNimNode(nnkBracket))),
|
||||
newNimNode(nnkForStmt).und( ## for item in 1..len:
|
||||
item,
|
||||
item,
|
||||
infix(1.lit, "..", lenName),
|
||||
newNimNode(nnkStmtList).und(
|
||||
newCall( ## add(result.name, unpack[seqType](stream))
|
||||
|
|
@ -117,7 +117,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
newNimNode(nnkVarSection).und(newNimNode(nnkIdentDefs).und(
|
||||
lenName, ## var lenName = int16(len(p.name))
|
||||
newIdentNode("int16"),
|
||||
newCall("int16", newCall("len", dotName)))),
|
||||
newCall("int16", newCall("len", dotName)))),
|
||||
newCall("writeData", streamID, newNimNode(nnkAddr).und(lenName), 2.lit),
|
||||
newNimNode(nnkForStmt).und( ## for item in 0..length - 1: pack(p.name[item], stream)
|
||||
item,
|
||||
|
|
@ -143,8 +143,8 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
readBody.add(resName := newCall("read"& $typeFields[i][1].ident, streamID))
|
||||
else:
|
||||
error("I dont know what to do with: "& treerepr(typeFields[i]))
|
||||
|
||||
var
|
||||
|
||||
var
|
||||
toStringFunc = newNimNode(nnkProcDef).und(
|
||||
newNimNode(nnkPostfix).und(
|
||||
^"*",
|
||||
|
|
@ -161,12 +161,12 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
emptyNode(),
|
||||
newNimNode(nnkStmtList).und(#[6]
|
||||
newNimNode(nnkAsgn).und(
|
||||
^"result", ## result =
|
||||
^"result", ## result =
|
||||
newNimNode(nnkCall).und(#[6][0][1]
|
||||
^"format", ## format
|
||||
emptyNode())))) ## "[TypeName $1 $2]"
|
||||
formatStr = "["& $typeName.ident
|
||||
|
||||
|
||||
const emptyFields = {nnkEmpty, nnkNilLit}
|
||||
var objFields = newNimNode(nnkRecList)
|
||||
for i in 0.. < len(typeFields):
|
||||
|
|
@ -186,10 +186,10 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
prefix("$", packetID.dot(fname)))
|
||||
formatStr.add " $"
|
||||
formatStr.add($(i + 1))
|
||||
|
||||
|
||||
formatStr.add ']'
|
||||
toStringFunc[6][0][1][1] = formatStr.lit()
|
||||
|
||||
|
||||
result.add(
|
||||
newNimNode(nnkTypeSection).und(
|
||||
newNimNode(nnkTypeDef).und(
|
||||
|
|
@ -206,15 +206,15 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
when defined(GenPacketShowOutput):
|
||||
echo(repr(result))
|
||||
|
||||
proc `->`(a: string, b: string): PNimrodNode {.compileTime.} =
|
||||
proc `->`(a: string, b: string): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkIdentDefs).und(^a, ^b, newNimNode(nnkEmpty))
|
||||
proc `->`(a: string, b: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc `->`(a: string, b: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkIdentDefs).und(^a, b, newNimNode(nnkEmpty))
|
||||
proc `->`(a, b: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc `->`(a, b: NimNode): NimNode {.compileTime.} =
|
||||
a[2] = b
|
||||
result = a
|
||||
|
||||
proc newProc*(name: string, params: varargs[PNimrodNode], resultType: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc newProc*(name: string, params: varargs[NimNode], resultType: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkProcDef).und(
|
||||
^name,
|
||||
emptyNode(),
|
||||
|
|
@ -227,7 +227,7 @@ proc newProc*(name: string, params: varargs[PNimrodNode], resultType: PNimrodNod
|
|||
macro forwardPacket*(typeName: expr, underlyingType: typedesc): stmt {.immediate.} =
|
||||
result = newNimNode(nnkStmtList).und(
|
||||
newProc(
|
||||
"read"& $typeName.ident,
|
||||
"read"& $typeName.ident,
|
||||
["s" -> "PStream" -> newNimNode(nnkNilLit)],
|
||||
typeName),
|
||||
newProc(
|
||||
|
|
@ -258,21 +258,21 @@ when isMainModule:
|
|||
A = 0'i8,
|
||||
B, C
|
||||
forwardPacket(SomeEnum, int8)
|
||||
|
||||
|
||||
|
||||
|
||||
defPacket(Foo, tuple[x: array[0..4, int8]])
|
||||
var f = newFoo([4'i8, 3'i8, 2'i8, 1'i8, 0'i8])
|
||||
var s2 = newStringStream("")
|
||||
f.pack(s2)
|
||||
assert s2.data == "\4\3\2\1\0"
|
||||
|
||||
|
||||
var s = newStringStream()
|
||||
s.flushImpl = proc(s: PStream) =
|
||||
var z = PStringStream(s)
|
||||
z.setPosition(0)
|
||||
z.data.setLen(0)
|
||||
|
||||
|
||||
|
||||
|
||||
s.setPosition(0)
|
||||
s.data.setLen(0)
|
||||
var o = B
|
||||
|
|
@ -283,7 +283,7 @@ when isMainModule:
|
|||
o.pack(s)
|
||||
assert s.data == "\1\0\2"
|
||||
s.flush
|
||||
|
||||
|
||||
defPacket(Y, tuple[z: int8])
|
||||
proc `$`(z: Y): string = result = "Y("& $z.z &")"
|
||||
defPacket(TestPkt, tuple[x: seq[Y]])
|
||||
|
|
@ -292,4 +292,4 @@ when isMainModule:
|
|||
for itm in test.x:
|
||||
echo(itm)
|
||||
test.pack(s)
|
||||
echo(repr(s.data))
|
||||
echo(repr(s.data))
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ template defPacketImports*(): stmt {.immediate, dirty.} =
|
|||
import macros, macro_dsl, estreams
|
||||
from strutils import format
|
||||
|
||||
macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
||||
macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
||||
result = newNimNode(nnkStmtList)
|
||||
let
|
||||
let
|
||||
typeName = quoted2ident(typeNameN)
|
||||
packetID = ^"p"
|
||||
streamID = ^"s"
|
||||
|
|
@ -57,7 +57,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
readBody = newNimNode(nnkStmtList)
|
||||
lenNames = 0
|
||||
for i in 0.. typeFields.len - 1:
|
||||
let
|
||||
let
|
||||
name = typeFields[i][0]
|
||||
dotName = packetID.dot(name)
|
||||
resName = newIdentNode(!"result").dot(name)
|
||||
|
|
@ -67,7 +67,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
of "seq":
|
||||
## let lenX = readInt16(s)
|
||||
newLenName()
|
||||
let
|
||||
let
|
||||
item = ^"item" ## item name in our iterators
|
||||
seqType = typeFields[i][1][1] ## type of seq
|
||||
readName = newIdentNode("read"& $seqType.ident)
|
||||
|
|
@ -79,7 +79,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
readBody.add( ## result.name = @[]
|
||||
resName := ("@".prefix(newNimNode(nnkBracket))),
|
||||
newNimNode(nnkForStmt).und( ## for item in 1..len:
|
||||
item,
|
||||
item,
|
||||
infix(1.lit, "..", lenName),
|
||||
newNimNode(nnkStmtList).und(
|
||||
newCall( ## add(result.name, unpack[seqType](stream))
|
||||
|
|
@ -89,7 +89,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
newNimNode(nnkVarSection).und(newNimNode(nnkIdentDefs).und(
|
||||
lenName, ## var lenName = int16(len(p.name))
|
||||
newIdentNode("int16"),
|
||||
newCall("int16", newCall("len", dotName)))),
|
||||
newCall("int16", newCall("len", dotName)))),
|
||||
newCall("writeBE", streamID, lenName),
|
||||
newNimNode(nnkForStmt).und( ## for item in 0..length - 1: pack(p.name[item], stream)
|
||||
item,
|
||||
|
|
@ -115,8 +115,8 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
readBody.add(resName := newCall("read"& $typeFields[i][1].ident, streamID))
|
||||
else:
|
||||
error("I dont know what to do with: "& treerepr(typeFields[i]))
|
||||
|
||||
var
|
||||
|
||||
var
|
||||
toStringFunc = newNimNode(nnkProcDef).und(
|
||||
newNimNode(nnkPostfix).und(
|
||||
^"*",
|
||||
|
|
@ -133,12 +133,12 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
emptyNode(),
|
||||
newNimNode(nnkStmtList).und(#[6]
|
||||
newNimNode(nnkAsgn).und(
|
||||
^"result", ## result =
|
||||
^"result", ## result =
|
||||
newNimNode(nnkCall).und(#[6][0][1]
|
||||
^"format", ## format
|
||||
emptyNode())))) ## "[TypeName $1 $2]"
|
||||
formatStr = "["& $typeName.ident
|
||||
|
||||
|
||||
const emptyFields = {nnkEmpty, nnkNilLit}
|
||||
var objFields = newNimNode(nnkRecList)
|
||||
for i in 0.. < len(typeFields):
|
||||
|
|
@ -158,10 +158,10 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
prefix("$", packetID.dot(fname)))
|
||||
formatStr.add " $"
|
||||
formatStr.add($(i + 1))
|
||||
|
||||
|
||||
formatStr.add ']'
|
||||
toStringFunc[6][0][1][1] = formatStr.lit()
|
||||
|
||||
|
||||
result.add(
|
||||
newNimNode(nnkTypeSection).und(
|
||||
newNimNode(nnkTypeDef).und(
|
||||
|
|
@ -178,7 +178,7 @@ macro defPacket*(typeNameN: expr, typeFields: expr): stmt {.immediate.} =
|
|||
when defined(GenPacketShowOutput):
|
||||
echo(repr(result))
|
||||
|
||||
proc newProc*(name: PNimrodNode; params: varargs[PNimrodNode]; resultType: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc newProc*(name: NimNode; params: varargs[NimNode]; resultType: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkProcDef).und(
|
||||
name,
|
||||
emptyNode(),
|
||||
|
|
@ -189,15 +189,15 @@ proc newProc*(name: PNimrodNode; params: varargs[PNimrodNode]; resultType: PNimr
|
|||
newNimNode(nnkStmtList))
|
||||
result[3].add(params)
|
||||
|
||||
proc body*(procNode: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc body*(procNode: NimNode): NimNode {.compileTime.} =
|
||||
assert procNode.kind == nnkProcDef and procNode[6].kind == nnkStmtList
|
||||
result = procNode[6]
|
||||
|
||||
proc iddefs*(a, b: string; c: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc iddefs*(a, b: string; c: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkIdentDefs).und(^a, ^b, c)
|
||||
proc iddefs*(a: string; b: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc iddefs*(a: string; b: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkIdentDefs).und(^a, b, emptyNode())
|
||||
proc varTy*(a: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc varTy*(a: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkVarTy).und(a)
|
||||
|
||||
macro forwardPacket*(typeName: expr, underlyingType: expr): stmt {.immediate.} =
|
||||
|
|
@ -206,7 +206,7 @@ macro forwardPacket*(typeName: expr, underlyingType: expr): stmt {.immediate.} =
|
|||
streamID = ^"s"
|
||||
result = newNimNode(nnkStmtList).und(
|
||||
newProc(
|
||||
(^("read"& $typeName.ident)).postfix("*"),
|
||||
(^("read"& $typeName.ident)).postfix("*"),
|
||||
[ iddefs("s", "PBuffer", newNimNode(nnkNilLit)) ],
|
||||
typeName),
|
||||
newProc(
|
||||
|
|
@ -218,7 +218,7 @@ macro forwardPacket*(typeName: expr, underlyingType: expr): stmt {.immediate.} =
|
|||
readBody = result[0][6]
|
||||
packBody = result[1][6]
|
||||
resName = ^"result"
|
||||
|
||||
|
||||
case underlyingType.kind
|
||||
of nnkBracketExpr:
|
||||
case $underlyingType[0].ident
|
||||
|
|
@ -250,21 +250,21 @@ when isMainModule:
|
|||
A = 0'i8,
|
||||
B, C
|
||||
forwardPacket(SomeEnum, int8)
|
||||
|
||||
|
||||
|
||||
|
||||
defPacket(Foo, tuple[x: array[0..4, int8]])
|
||||
var f = newFoo([4'i8, 3'i8, 2'i8, 1'i8, 0'i8])
|
||||
var s2 = newStringStream("")
|
||||
f.pack(s2)
|
||||
assert s2.data == "\4\3\2\1\0"
|
||||
|
||||
|
||||
var s = newStringStream()
|
||||
s.flushImpl = proc(s: PStream) =
|
||||
var z = PStringStream(s)
|
||||
z.setPosition(0)
|
||||
z.data.setLen(0)
|
||||
|
||||
|
||||
|
||||
|
||||
s.setPosition(0)
|
||||
s.data.setLen(0)
|
||||
var o = B
|
||||
|
|
@ -275,7 +275,7 @@ when isMainModule:
|
|||
o.pack(s)
|
||||
assert s.data == "\1\0\2"
|
||||
s.flush
|
||||
|
||||
|
||||
defPacket(Y, tuple[z: int8])
|
||||
proc `$`(z: Y): string = result = "Y("& $z.z &")"
|
||||
defPacket(TestPkt, tuple[x: seq[Y]])
|
||||
|
|
|
|||
|
|
@ -1,42 +1,42 @@
|
|||
import macros
|
||||
{.deadCodeElim: on.}
|
||||
#Inline macro.add() to allow for easier nesting
|
||||
proc und*(a: PNimrodNode; b: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc und*(a: NimNode; b: NimNode): NimNode {.compileTime.} =
|
||||
a.add(b)
|
||||
result = a
|
||||
proc und*(a: PNimrodNode; b: varargs[PNimrodNode]): PNimrodNode {.compileTime.} =
|
||||
proc und*(a: NimNode; b: varargs[NimNode]): NimNode {.compileTime.} =
|
||||
a.add(b)
|
||||
result = a
|
||||
|
||||
proc `^`*(a: string): PNimrodNode {.compileTime.} =
|
||||
proc `^`*(a: string): NimNode {.compileTime.} =
|
||||
## new ident node
|
||||
result = newIdentNode(!a)
|
||||
proc `[]`*(a, b: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc `[]`*(a, b: NimNode): NimNode {.compileTime.} =
|
||||
## new bracket expression: node[node] not to be confused with node[indx]
|
||||
result = newNimNode(nnkBracketExpr).und(a, b)
|
||||
proc `:=`*(left, right: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc `:=`*(left, right: NimNode): NimNode {.compileTime.} =
|
||||
## new Asgn node: left = right
|
||||
result = newNimNode(nnkAsgn).und(left, right)
|
||||
|
||||
proc lit*(a: string): PNimrodNode {.compileTime.} =
|
||||
proc lit*(a: string): NimNode {.compileTime.} =
|
||||
result = newStrLitNode(a)
|
||||
proc lit*(a: int): PNimrodNode {.compileTime.} =
|
||||
proc lit*(a: int): NimNode {.compileTime.} =
|
||||
result = newIntLitNode(a)
|
||||
proc lit*(a: float): PNimrodNode {.compileTime.} =
|
||||
proc lit*(a: float): NimNode {.compileTime.} =
|
||||
result = newFloatLitNode(a)
|
||||
proc lit*(a: char): PNimrodNode {.compileTime.} =
|
||||
proc lit*(a: char): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkCharLit)
|
||||
result.intval = a.ord
|
||||
|
||||
proc emptyNode*(): PNimrodNode {.compileTime.} =
|
||||
proc emptyNode*(): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkEmpty)
|
||||
|
||||
proc dot*(left, right: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc dot*(left, right: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkDotExpr).und(left, right)
|
||||
proc prefix*(a: string, b: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc prefix*(a: string, b: NimNode): NimNode {.compileTime.} =
|
||||
result = newNimNode(nnkPrefix).und(newIdentNode(!a), b)
|
||||
|
||||
proc quoted2ident*(a: PNimrodNode): PNimrodNode {.compileTime.} =
|
||||
proc quoted2ident*(a: NimNode): NimNode {.compileTime.} =
|
||||
if a.kind != nnkAccQuoted:
|
||||
return a
|
||||
var pname = ""
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue