DSL support for handler bodies without parameters

This commit is contained in:
Emery Hemingway 2022-06-12 14:09:34 -05:00
parent be22238ca3
commit 7ca28768d4
1 changed files with 39 additions and 35 deletions

View File

@ -139,17 +139,17 @@ method message(e: ClosureEntity; turn: var Turn; v: Assertion) =
if not e.messageImpl.isNil: e.messageImpl(turn, v) if not e.messageImpl.isNil: e.messageImpl(turn, v)
proc wrapPublishHandler(handler: NimNode): NimNode = proc wrapPublishHandler(handler: NimNode): NimNode =
handler.expectKind nnkDo handler.expectKind {nnkDo, nnkStmtList}
var innerProc = newNimNode(nnkProcDef) var innerProc = newNimNode(nnkProcDef)
handler.copyChildrenTo innerProc handler.copyChildrenTo innerProc
innerProc[0] = genSym(nskProc, "message") innerProc[0] = genSym(nskProc, "message")
var var
formalArgs = handler[3]
valuesSym = genSym(nskVar, "values") valuesSym = genSym(nskVar, "values")
valuesTuple = newNimNode(nnkTupleTy, handler) valuesTuple = newNimNode(nnkTupleTy, handler)
innerTuple = newNimNode(nnkVarTuple, handler) innerTuple = newNimNode(nnkVarTuple, handler)
varSectionInner = newNimNode(nnkVarSection, handler).add(innerTuple) varSectionInner = newNimNode(nnkVarSection, handler).add(innerTuple)
for i, arg in formalArgs: if handler.kind == nnkDo:
for i, arg in handler[3]:
if i > 0: if i > 0:
arg.expectKind nnkIdentDefs arg.expectKind nnkIdentDefs
if arg[1].kind == nnkEmpty: if arg[1].kind == nnkEmpty:
@ -162,7 +162,9 @@ proc wrapPublishHandler(handler: NimNode): NimNode =
var var
varSectionOuter = newNimNode(nnkVarSection, handler).add( varSectionOuter = newNimNode(nnkVarSection, handler).add(
newIdentDefs(valuesSym, valuesTuple)) newIdentDefs(valuesSym, valuesTuple))
publishBody = newStmtList(varSectionInner, handler[6]) publishBody =
if handler.kind == nnkStmtList: handler
else: newStmtList(varSectionInner, handler[6])
turnSym = ident"turn" turnSym = ident"turn"
handleSym = ident"handle" handleSym = ident"handle"
handlerSym = genSym(nskProc, "publish") handlerSym = genSym(nskProc, "publish")
@ -173,17 +175,17 @@ proc wrapPublishHandler(handler: NimNode): NimNode =
`publishBody` `publishBody`
proc wrapMessageHandler(handler: NimNode): NimNode = proc wrapMessageHandler(handler: NimNode): NimNode =
handler.expectKind nnkDo handler.expectKind {nnkDo, nnkStmtList}
var innerProc = newNimNode(nnkProcDef) var innerProc = newNimNode(nnkProcDef)
handler.copyChildrenTo innerProc handler.copyChildrenTo innerProc
innerProc[0] = genSym(nskProc, "message") innerProc[0] = genSym(nskProc, "message")
var var
formalArgs = handler[3]
valuesSym = genSym(nskVar, "values") valuesSym = genSym(nskVar, "values")
valuesTuple = newNimNode(nnkTupleTy, handler) valuesTuple = newNimNode(nnkTupleTy, handler)
innerTuple = newNimNode(nnkVarTuple, handler) innerTuple = newNimNode(nnkVarTuple, handler)
varSectionInner = newNimNode(nnkVarSection, handler).add(innerTuple) varSectionInner = newNimNode(nnkVarSection, handler).add(innerTuple)
for i, arg in formalArgs: if handler.kind == nnkDo:
for i, arg in handler[3]:
if i > 0: if i > 0:
arg.expectKind nnkIdentDefs arg.expectKind nnkIdentDefs
if arg[1].kind == nnkEmpty: if arg[1].kind == nnkEmpty:
@ -224,17 +226,17 @@ macro onMessage*(turn: Turn; ds: Ref; pattern: Pattern; handler: untyped) =
discard observe(`turn`, `ds`, `pattern`, ClosureEntity(messageImpl: `handlerSym`)) discard observe(`turn`, `ds`, `pattern`, ClosureEntity(messageImpl: `handlerSym`))
proc wrapDuringHandler(entryBody, exitBody: NimNode): NimNode = proc wrapDuringHandler(entryBody, exitBody: NimNode): NimNode =
entryBody.expectKind nnkDo entryBody.expectKind {nnkDo, nnkStmtList}
var innerProc = newNimNode(nnkProcDef) var innerProc = newNimNode(nnkProcDef)
entryBody.copyChildrenTo innerProc entryBody.copyChildrenTo innerProc
innerProc[0] = genSym(nskProc, "during") innerProc[0] = genSym(nskProc, "during")
var var
formalArgs = entryBody[3]
valuesSym = ident("rawValues") valuesSym = ident("rawValues")
valuesTuple = newNimNode(nnkTupleTy, entryBody) valuesTuple = newNimNode(nnkTupleTy, entryBody)
innerTuple = newNimNode(nnkVarTuple, entryBody) innerTuple = newNimNode(nnkVarTuple, entryBody)
varSectionInner = newNimNode(nnkVarSection, entryBody).add(innerTuple) varSectionInner = newNimNode(nnkVarSection, entryBody).add(innerTuple)
for i, arg in formalArgs: if entryBody.kind == nnkDo:
for i, arg in entryBody[3]:
if i > 0: if i > 0:
arg.expectKind nnkIdentDefs arg.expectKind nnkIdentDefs
if arg[1].kind == nnkEmpty: if arg[1].kind == nnkEmpty:
@ -247,7 +249,9 @@ proc wrapDuringHandler(entryBody, exitBody: NimNode): NimNode =
var var
varSectionOuter = newNimNode(nnkVarSection, entryBody).add( varSectionOuter = newNimNode(nnkVarSection, entryBody).add(
newIdentDefs(valuesSym, valuesTuple)) newIdentDefs(valuesSym, valuesTuple))
publishBody = newStmtList(varSectionInner, entryBody[6]) publishBody =
if entryBody.kind == nnkStmtList: entryBody
else: newStmtList(varSectionInner, entryBody[6])
turnSym = ident"turn" turnSym = ident"turn"
bindingsSym = ident"bindings" bindingsSym = ident"bindings"
handleSym = ident"duringHandle" handleSym = ident"duringHandle"