@@ -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