schema: fix missing literals in tuples
This commit is contained in:
parent
ba45f80087
commit
cbf27a0ee0
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue