DSL support for handler bodies without parameters
This commit is contained in:
parent
be22238ca3
commit
7ca28768d4
|
@ -139,30 +139,32 @@ method message(e: ClosureEntity; turn: var Turn; v: Assertion) =
|
|||
if not e.messageImpl.isNil: e.messageImpl(turn, v)
|
||||
|
||||
proc wrapPublishHandler(handler: NimNode): NimNode =
|
||||
handler.expectKind nnkDo
|
||||
handler.expectKind {nnkDo, nnkStmtList}
|
||||
var innerProc = newNimNode(nnkProcDef)
|
||||
handler.copyChildrenTo innerProc
|
||||
innerProc[0] = genSym(nskProc, "message")
|
||||
var
|
||||
formalArgs = handler[3]
|
||||
valuesSym = genSym(nskVar, "values")
|
||||
valuesTuple = newNimNode(nnkTupleTy, handler)
|
||||
innerTuple = newNimNode(nnkVarTuple, handler)
|
||||
varSectionInner = newNimNode(nnkVarSection, handler).add(innerTuple)
|
||||
for i, arg in formalArgs:
|
||||
if i > 0:
|
||||
arg.expectKind nnkIdentDefs
|
||||
if arg[1].kind == nnkEmpty:
|
||||
error("type required for capture", arg)
|
||||
var def = newNimNode(nnkIdentDefs, arg)
|
||||
arg.copyChildrenTo def
|
||||
valuesTuple.add(def)
|
||||
innerTuple.add(arg[0])
|
||||
if handler.kind == nnkDo:
|
||||
for i, arg in handler[3]:
|
||||
if i > 0:
|
||||
arg.expectKind nnkIdentDefs
|
||||
if arg[1].kind == nnkEmpty:
|
||||
error("type required for capture", arg)
|
||||
var def = newNimNode(nnkIdentDefs, arg)
|
||||
arg.copyChildrenTo def
|
||||
valuesTuple.add(def)
|
||||
innerTuple.add(arg[0])
|
||||
innerTuple.add(newEmptyNode(), valuesSym)
|
||||
var
|
||||
varSectionOuter = newNimNode(nnkVarSection, handler).add(
|
||||
newIdentDefs(valuesSym, valuesTuple))
|
||||
publishBody = newStmtList(varSectionInner, handler[6])
|
||||
publishBody =
|
||||
if handler.kind == nnkStmtList: handler
|
||||
else: newStmtList(varSectionInner, handler[6])
|
||||
turnSym = ident"turn"
|
||||
handleSym = ident"handle"
|
||||
handlerSym = genSym(nskProc, "publish")
|
||||
|
@ -173,25 +175,25 @@ proc wrapPublishHandler(handler: NimNode): NimNode =
|
|||
`publishBody`
|
||||
|
||||
proc wrapMessageHandler(handler: NimNode): NimNode =
|
||||
handler.expectKind nnkDo
|
||||
handler.expectKind {nnkDo, nnkStmtList}
|
||||
var innerProc = newNimNode(nnkProcDef)
|
||||
handler.copyChildrenTo innerProc
|
||||
innerProc[0] = genSym(nskProc, "message")
|
||||
var
|
||||
formalArgs = handler[3]
|
||||
valuesSym = genSym(nskVar, "values")
|
||||
valuesTuple = newNimNode(nnkTupleTy, handler)
|
||||
innerTuple = newNimNode(nnkVarTuple, handler)
|
||||
varSectionInner = newNimNode(nnkVarSection, handler).add(innerTuple)
|
||||
for i, arg in formalArgs:
|
||||
if i > 0:
|
||||
arg.expectKind nnkIdentDefs
|
||||
if arg[1].kind == nnkEmpty:
|
||||
error("type required for capture", arg)
|
||||
var def = newNimNode(nnkIdentDefs, arg)
|
||||
arg.copyChildrenTo def
|
||||
valuesTuple.add(def)
|
||||
innerTuple.add(arg[0])
|
||||
if handler.kind == nnkDo:
|
||||
for i, arg in handler[3]:
|
||||
if i > 0:
|
||||
arg.expectKind nnkIdentDefs
|
||||
if arg[1].kind == nnkEmpty:
|
||||
error("type required for capture", arg)
|
||||
var def = newNimNode(nnkIdentDefs, arg)
|
||||
arg.copyChildrenTo def
|
||||
valuesTuple.add(def)
|
||||
innerTuple.add(arg[0])
|
||||
innerTuple.add(newEmptyNode(), valuesSym)
|
||||
var
|
||||
varSectionOuter = newNimNode(nnkVarSection, handler).add(
|
||||
|
@ -224,30 +226,32 @@ macro onMessage*(turn: Turn; ds: Ref; pattern: Pattern; handler: untyped) =
|
|||
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(messageImpl: `handlerSym`))
|
||||
|
||||
proc wrapDuringHandler(entryBody, exitBody: NimNode): NimNode =
|
||||
entryBody.expectKind nnkDo
|
||||
entryBody.expectKind {nnkDo, nnkStmtList}
|
||||
var innerProc = newNimNode(nnkProcDef)
|
||||
entryBody.copyChildrenTo innerProc
|
||||
innerProc[0] = genSym(nskProc, "during")
|
||||
var
|
||||
formalArgs = entryBody[3]
|
||||
valuesSym = ident("rawValues")
|
||||
valuesTuple = newNimNode(nnkTupleTy, entryBody)
|
||||
innerTuple = newNimNode(nnkVarTuple, entryBody)
|
||||
varSectionInner = newNimNode(nnkVarSection, entryBody).add(innerTuple)
|
||||
for i, arg in formalArgs:
|
||||
if i > 0:
|
||||
arg.expectKind nnkIdentDefs
|
||||
if arg[1].kind == nnkEmpty:
|
||||
error("type required for capture", arg)
|
||||
var def = newNimNode(nnkIdentDefs, arg)
|
||||
arg.copyChildrenTo def
|
||||
valuesTuple.add(def)
|
||||
innerTuple.add(arg[0])
|
||||
if entryBody.kind == nnkDo:
|
||||
for i, arg in entryBody[3]:
|
||||
if i > 0:
|
||||
arg.expectKind nnkIdentDefs
|
||||
if arg[1].kind == nnkEmpty:
|
||||
error("type required for capture", arg)
|
||||
var def = newNimNode(nnkIdentDefs, arg)
|
||||
arg.copyChildrenTo def
|
||||
valuesTuple.add(def)
|
||||
innerTuple.add(arg[0])
|
||||
innerTuple.add(newEmptyNode(), valuesSym)
|
||||
var
|
||||
varSectionOuter = newNimNode(nnkVarSection, entryBody).add(
|
||||
newIdentDefs(valuesSym, valuesTuple))
|
||||
publishBody = newStmtList(varSectionInner, entryBody[6])
|
||||
publishBody =
|
||||
if entryBody.kind == nnkStmtList: entryBody
|
||||
else: newStmtList(varSectionInner, entryBody[6])
|
||||
turnSym = ident"turn"
|
||||
bindingsSym = ident"bindings"
|
||||
handleSym = ident"duringHandle"
|
||||
|
|
Loading…
Reference in New Issue