From cbf27a0ee065ab827ce58ef7dc5486af87434f9a Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Sun, 24 Oct 2021 14:00:18 +0200 Subject: [PATCH] schema: fix missing literals in tuples --- src/preserves/preserves_schema_nim.nim | 65 +++++++++++--------------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/src/preserves/preserves_schema_nim.nim b/src/preserves/preserves_schema_nim.nim index 7cc349e..f48dc60 100644 --- a/src/preserves/preserves_schema_nim.nim +++ b/src/preserves/preserves_schema_nim.nim @@ -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))