Do not generate object fields for constants
This commit is contained in:
parent
b940a458a1
commit
e556fa26e0
|
@ -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:
|
||||
if not isConst(scm, bn.altBranch.nodes[1]):
|
||||
let label = bn.ident
|
||||
recList.add nkIdentDefs.newNode.add(
|
||||
label.accQuote.toExport,
|
||||
nimTypeOf(known, bn.altBranch.nodes[1], $label),
|
||||
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(
|
||||
|
|
Loading…
Reference in New Issue