From 41675a2daf2f42d50ba5d0c7628bf42eacf5ae92 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Mon, 6 Sep 2021 18:33:20 +0200 Subject: [PATCH] Generate procs for constants --- .../private/preserves_schema_nim.nim | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/preserves/private/preserves_schema_nim.nim b/src/preserves/private/preserves_schema_nim.nim index b57106f..886ddf3 100644 --- a/src/preserves/private/preserves_schema_nim.nim +++ b/src/preserves/private/preserves_schema_nim.nim @@ -240,21 +240,35 @@ proc nimTypeOf(scm: Schema; known: var TypeTable; sn: SchemaNode; name = ""): PN result = nkCommentStmt.newNode result.comment.add("Missing type generator for " & $sn.kind & " " & $sn) -proc toConst(name: string; def: SchemaNode): Pnode = +proc exportIdent(id: string): PNode = nn(nkPostFix, ident"*", ident(id)) + +proc generateConstProcs(result: var seq[PNode]; name: string; def: SchemaNode) = case def.kind of snkLiteral: - result = nkConstDef.newNode.add( - name.ident.accQuote, newEmpty()) + var stmts = nn(nkStmtList) case def.value.kind of pkSignedInteger: - discard result.add newIntNode(nkIntLit, def.value.int) + discard stmts.add newIntNode(nkIntLit, def.value.int) of pkSymbol: - discard result.add nn(nkCall, + discard stmts.add nn(nkCall, ident"symbol", - PNode(kind: nkStrLit, strVal: def.value.symbol), - ident"EmbeddedType") + PNode(kind: nkStrLit, + strVal: def.value.symbol), + ident"EmbeddedType") else: - raiseAssert("cannot convert " & $def & " to a Nim literal") + raiseAssert("conversion of " & $def & " to a Nim literal is not implemented") + var procId = name + procId[0] = procId[0].toLowerAscii + let constProc= nn(nkProcDef, + exportIdent(procId), + newEmpty(), + newEmpty(), + nn(nkFormalParams, ident"Preserve"), + newEmpty(), + newEmpty(), + stmts) + constProc.comment = $def + result.add constProc else: discard proc toNimLit(sn: SchemaNode): PNode = @@ -336,7 +350,6 @@ proc preserveTypeOf(scm: Schema; known: var TypeTable; sn: SchemaNode; name = "" result = nimTypeOf(scm, known, sn, name) proc generateProcs(result: var seq[PNode]; name: string; sn: SchemaNode) = - proc exportIdent(id: string): PNode = nn(nkPostFix, ident"*", ident(id)) case sn.kind of snkRecord: var @@ -409,7 +422,6 @@ proc generateNimFile*(scm: Schema; path: string) = var knownTypes: TypeTable typeSection = newNode nkTypeSection - constSection = newNode nkLetSection procs: seq[PNode] if scm.embeddedType == "": typeSection.add nn(nkTypeDef, @@ -429,7 +441,7 @@ proc generateNimFile*(scm: Schema; path: string) = ident"EmbeddedType")) for name, def in scm.definitions.pairs: if isConst(scm, def): - constSection.add toConst(name, def) + generateConstProcs(procs, name, def) else: var name = name name[0] = name[0].toUpperAscii @@ -481,8 +493,7 @@ proc generateNimFile*(scm: Schema; path: string) = collectRefImports(imports, scm) var module = newNode(nkStmtList).add( imports, - typeSection, - constSection + typeSection ).add(procs) writeFile(path, renderTree(module, {renderNone, renderIr}))