From e556fa26e0c855dbc9984e3be9d038841d804db6 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Mon, 6 Sep 2021 17:37:36 +0200 Subject: [PATCH] Do not generate object fields for constants --- .../private/preserves_schema_nim.nim | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/preserves/private/preserves_schema_nim.nim b/src/preserves/private/preserves_schema_nim.nim index 09e4268..b42fa0e 100644 --- a/src/preserves/private/preserves_schema_nim.nim +++ b/src/preserves/private/preserves_schema_nim.nim @@ -78,10 +78,13 @@ proc toExport(n: sink PNode): PNode = proc newEmpty(): PNode = newNode(nkEmpty) -proc isConst(sn: SchemaNode): bool = +proc isConst(scm: Schema; sn: SchemaNode): bool = case sn.kind - of snkLiteral: true - else: false + of snkLiteral: result = true + of snkRef: + if sn.refPath.len == 1: + result = isConst(scm, scm.definitions[sn.refPath[0]]) + else: discard proc isSymbolEnum(sn: SchemaNode): bool = if sn.kind == snkOr: @@ -104,7 +107,7 @@ proc toEnumDef(name: string; sn: SchemaNode): PNode = newEmpty(), sn.toEnumTy) -proc nimTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = +proc nimTypeOf(scm: Schema; known: var TypeTable; sn: SchemaNode; name = ""): PNode = case sn.kind of snkOr: if sn.isSymbolEnum: @@ -128,27 +131,28 @@ proc nimTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = case bn.altBranch.nodes.len of 0, 1: discard of 2: - let label = bn.ident - recList.add nkIdentDefs.newNode.add( - label.accQuote.toExport, - nimTypeOf(known, bn.altBranch.nodes[1], $label), - newEmpty()) + if not isConst(scm, bn.altBranch.nodes[1]): + let label = bn.ident + recList.add nkIdentDefs.newNode.add( + label.accQuote.toExport, + nimTypeOf(scm, known, bn.altBranch.nodes[1], $label), + newEmpty()) else: for i, field in bn.altBranch.nodes: - if i > 0: + if i > 0 and (not isConst(scm, field)): let label = field.ident recList.add nkIdentDefs.newNode.add( label.accQuote.toExport, - nimTypeOf(known, field, $label), + nimTypeOf(scm, known, field, $label), newEmpty()) else: - if bn.altBranch.isConst: + if isConst(scm, bn.altBranch): recList.add nkDiscardStmt.newNode.add(newEmpty()) else: let label = bn.ident recList.add(nkIdentDefs.newNode.add( label.accQuote, - nimTypeOf(known, bn.altBranch, $label), + nimTypeOf(scm, known, bn.altBranch, $label), newEmpty())) let disc = nkDotExpr.newNode.add( enumIdent, bn.altLabel.nimIdentNormalize.ident.accQuote) @@ -162,7 +166,7 @@ proc nimTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = of snkAtom: result = typeIdent(sn) of snkEmbedded: - result = nimTypeOf(known, sn.embed) + result = nimTypeOf(scm, known, sn.embed) of snkLiteral: result = case sn.value.kind # nearly verbatim from ../../preserves/src/preserves.nim of pkBoolean: ident"bool" @@ -185,16 +189,16 @@ proc nimTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = of snkSequenceOf: result = nkBracketExpr.newNode.add( ident"seq", - nimTypeOf(known, sn.child)) + nimTypeOf(scm, known, sn.child)) of snkSetOf: result = nkBracketExpr.newNode.add( ident"HashedSet", - nimTypeOf(known, sn.child)) + nimTypeOf(scm, known, sn.child)) of snkDictOf: result = nkBracketExpr.newNode.add( ident"Table", - nimTypeOf(known, sn.nodes[0]), - nimTypeOf(known, sn.nodes[1])) + nimTypeOf(scm, known, sn.nodes[0]), + nimTypeOf(scm, known, sn.nodes[1])) of snkRecord: case sn.nodes.len of 0, 1: @@ -209,7 +213,7 @@ proc nimTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = let id = field.ident recList.add nkIdentDefs.newNode.add( id.accQuote.toExport, - nimTypeOf(known, field, $id), + nimTypeOf(scm, known, field, $id), newEmpty()) result = nn(nkObjectTy, newEmpty(), @@ -220,23 +224,22 @@ proc nimTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = result = nkTupleTy.newNode for tn in sn.nodes: result.add nkIdentDefs.newNode.add( - tn.ident.accQuote, nimTypeOf(known, tn), newEmpty()) + tn.ident.accQuote, nimTypeOf(scm, known, tn), newEmpty()) of snkDictionary: result = nkTupleTy.newNode for i in countup(0, sn.nodes.high, 2): let id = ident(sn.nodes[i+0]) result.add nkIdentDefs.newNode.add( id.accQuote, - nimTypeOf(known, sn.nodes[i+1], $id), + nimTypeOf(scm, known, sn.nodes[i+1], $id), newEmpty()) of snkNamed: - result = nimTypeOf(known, sn.pattern, name) + result = nimTypeOf(scm, known, sn.pattern, name) of snkRef: result = typeIdent(sn) else: result = nkCommentStmt.newNode result.comment.add("Missing type generator for " & $sn.kind & " " & $sn) - result.comment = "``" & $sn & "``" proc toConst(name: string; def: SchemaNode): Pnode = case def.kind @@ -266,7 +269,7 @@ proc toNimLit(sn: SchemaNode): PNode = else: raiseAssert("no Nim literal for " & $sn) -proc preserveTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = +proc preserveTypeOf(scm: Schema; known: var TypeTable; sn: SchemaNode; name = ""): PNode = case sn.kind of snkOr: if sn.isSymbolEnum: @@ -312,7 +315,7 @@ proc preserveTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = let id = field.ident recList.add nkIdentDefs.newNode.add( id.accQuote.toExport, - nimTypeOf(known, field, $id), + nimTypeOf(scm, known, field, $id), newEmpty()) result = nn(nkObjectTy, newEmpty(), @@ -324,14 +327,14 @@ proc preserveTypeOf(known: var TypeTable; sn: SchemaNode; name = ""): PNode = let id = field.ident recList.add nkIdentDefs.newNode.add( id.accQuote, - nimTypeOf(known, field, $id), + nimTypeOf(scm, known, field, $id), newEmpty()) result = nn(nkTupleTy, newEmpty(), newEmpty(), recList) else: - result = nimTypeOf(known, sn, 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)) @@ -404,7 +407,7 @@ proc generateNimFile*(scm: Schema; path: string) = var knownTypes: TypeTable typeSection = newNode nkTypeSection - constSection = newNode nkConstSection + constSection = newNode nkLetSection procs: seq[PNode] if scm.embeddedType == "": typeSection.add nn(nkTypeDef, @@ -423,12 +426,13 @@ proc generateNimFile*(scm: Schema; path: string) = ident"PreserveGen", ident"EmbeddedType")) for name, def in scm.definitions.pairs: - if def.isConst: + if isConst(scm, def): constSection.add toConst(name, def) else: var name = name name[0] = name[0].toUpperAscii - let t = nimTypeOf(knownTypes, def, name) + let t = nimTypeOf(scm, knownTypes, def, name) + t.comment = $def case def.kind of snkAtom: knownTypes[name] = nkTypeDef.newNode.add(