schema: fix missing literals in tuples

This commit is contained in:
Emery Hemingway 2021-10-24 14:00:18 +02:00
parent ba45f80087
commit cbf27a0ee0
1 changed files with 27 additions and 38 deletions

View File

@ -455,24 +455,34 @@ proc addField(recList: PNode; scm: Schema; known: var TypeTable; sp: SimplePatte
recList.add identDef(id, nimTypeOf(scm, known, sp))
proc addFields(recList: PNode; scm: Schema; known: var TypeTable; cp: CompoundPattern; parentName: string): PNode {.discardable.} =
template addField(np: NamedPattern) =
let
label = np.label
id = label.toFieldIdent
pattern = np.pattern
if pattern.isRef or pattern.isSimple:
addField(recList, scm, known, pattern.simplePattern, label)
else:
var
typeName = parentName & capitalizeAscii(label)
fieldSpec = nimTypeOf(scm, known, pattern, label)
known[typeName] = typeDef(scm, typeName, pattern, fieldSpec.node)
recList.add identDef(id, ident(typeName), isEmbeddable(scm, pattern))
case cp.orKind
of CompoundPatternKind.rec:
# recList.add identDef(ident(label), nimTypeOf(scm, known, cp, ""))
raiseassert "unexpected record of fields " #& $cp.rec
of CompoundPatternKind.tuple:
for np in cp.tuple.patterns:
let
label = np.label
id = label.toFieldIdent
if np.pattern.isRef or np.pattern.isSimple:
addField(recList, scm, known, np.pattern.simplePattern, label)
else:
var
pat = np.pattern
typeName = parentName & capitalizeAscii(label)
fieldSpec = nimTypeOf(scm, known, pat, label)
known[typeName] = typeDef(scm, typeName, pat, fieldSpec.node)
recList.add identDef(id, ident(typeName), isEmbeddable(scm, pat))
for np in cp.tuple.patterns: addField(np)
of CompoundPatternKind.tuplePrefix:
for np in cp.tuplePrefix.fixed: addField(np)
let variableType = nimTypeOf(scm, known, cp.tuplePrefix.variable)
recList.add identDef(
nn(nkPragmaExpr,
ident(cp.tuplePrefix.variable, parentName).accQuote.toExport,
nn(nkPragma, ident"preservesTupleTail")),
variableType.parameterize,
variableType.embeddable)
else: raiseAssert "not adding fields for " #& $cp
reclist
@ -505,31 +515,10 @@ proc nimTypeOf(scm: Schema; known: var TypeTable; cp: CompoundPattern; name: str
result.node = nn(nkObjectTy,
newEmpty(), newEmpty(),
nn(nkRecList).addFields(scm, known, cp.rec.fields.pattern, name))
of CompoundPatternKind.`tuple`:
var recList = nn(nkRecList)
for np in cp.tuple.patterns:
let pat = np.pattern
if not isLiteral(scm, pat):
let fieldType = nimTypeOf(scm, known, pat)
orEmbed result, fieldType
recList.add identDef(ident(np, name).accQuote.toExport, fieldType)
result.node = nn(nkObjectTy, newEmpty(), newEmpty(), recList)
of CompoundPatternKind.`tupleprefix`:
var recList = nn(nkRecList)
for np in cp.tuplePrefix.fixed:
let pat = np.pattern
if not isLiteral(scm, pat):
let fieldType = nimTypeOf(scm, known, pat)
orEmbed result, fieldType
recList.add identDef(ident(np, name).accQuote.toExport, fieldType)
let variableType = nimTypeOf(scm, known, cp.tuplePrefix.variable)
recList.add identDef(
nn(nkPragmaExpr,
ident(cp.tuplePrefix.variable, name).accQuote.toExport,
nn(nkPragma, ident"preservesTupleTail")),
variableType.parameterize,
variableType.embeddable)
result.node = nn(nkObjectTy, newEmpty(), newEmpty(), recList)
of CompoundPatternKind.`tuple`, CompoundPatternKind.`tupleprefix`:
result.node = nn(nkObjectTy,
newEmpty(), newEmpty(),
nn(nkRecList).addFields(scm, known, cp, name))
of CompoundPatternKind.`dict`:
result.node = nn(nkObjectTy, newEmpty(), newEmpty(),
nn(nkRecList).addFields(scm, known, cp.dict.entries, name))