Skip to content

Commit 419de6f

Browse files
committed
feat: only add inheritance if class doesn't template any thing
1 parent c5f73fb commit 419de6f

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

schema_salad/cpp_codegen.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ class ClassDefinition:
8181
def __init__(self, name: str):
8282
self.fullName = name
8383
self.extends: List[Dict[str, str]] = []
84+
85+
# List of types from parent classes that have been specialized
86+
self.specializationTypes: List[str] = []
87+
88+
# this includes fields that are also inheritant
89+
self.allfields: List[FieldDefinition] = []
8490
self.fields: List[FieldDefinition] = []
8591
self.abstract = False
8692
(self.namespace, self.classname) = split_name(name)
@@ -505,6 +511,29 @@ class heap_object {
505511
for key in self.classDefinitions:
506512
self.classDefinitions[key].writeFwdDeclaration(self.target, "", " ")
507513

514+
# remove parent classes, that are specialized/templated versions
515+
for key in self.classDefinitions:
516+
if len(self.classDefinitions[key].specializationTypes) > 0:
517+
self.classDefinitions[key].extends = []
518+
519+
520+
# remove fields that are available in a parent class
521+
for key in self.classDefinitions:
522+
for field in self.classDefinitions[key].allfields:
523+
found = False
524+
for parent_key in self.classDefinitions[key].extends:
525+
fullKey = parent_key["namespace"] + "#" + parent_key["classname"]
526+
for f in self.classDefinitions[fullKey].allfields:
527+
if f.name == field.name:
528+
found = True
529+
break
530+
if found:
531+
break
532+
533+
if not found:
534+
self.classDefinitions[key].fields.append(field)
535+
536+
508537
for key in self.enumDefinitions:
509538
self.enumDefinitions[key].writeDefinition(self.target, " ")
510539
for key in self.classDefinitions:
@@ -565,9 +594,13 @@ def parseRecordSchema(self, stype: Dict[str, Any]) -> None:
565594
ext = {"namespace": base_namespace, "classname": base_classname}
566595
cd.extends.append(ext)
567596

597+
if "specialize" in stype:
598+
for e in aslist(stype["specialize"]):
599+
cd.specializationTypes.append(e["specializeFrom"])
600+
568601
if "fields" in stype:
569602
for field in stype["fields"]:
570-
cd.fields.append(self.parseRecordField(field))
603+
cd.allfields.append(self.parseRecordField(field))
571604

572605
self.classDefinitions[stype["name"]] = cd
573606

0 commit comments

Comments
 (0)