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