generateSubtypesOf method
void
generateSubtypesOf()
Implementation
void generateSubtypesOf() {
typeMap.subtypesOf.values.forEach((typeInfo) {
output.writeLn('class \$SubtypesOf' + typeInfo.flatName + ' extends SubtypesOf<' + typeInfo.uniqueName + '> {');
output.writeLn('String getCode<X extends ' + typeInfo.uniqueName + '>(){');
for (var type in typeMap.getNonAbstractSubtypes(typeInfo)) {
output.writeLn('if (X == ${type.fullName}) return ${type.classCodeAsReference};');
}
output.writeLn('throw new Exception(\'no code for type\');');
output.writeLn('}');
output.writeLn('Map<String, SubtypeInfo> get allSubtypes => {');
for (var type in typeMap.getNonAbstractSubtypes(typeInfo)) {
output.writeLn('${type.classCodeAsReference}: SubtypeInfo(');
//find base class name
String baseClassCode = type.classCodeAsReference;
for (var parentType in type.allTypeInfoPath()){
if (parentType.element!.metadata.where((element) => element.toSource() == '@ComposeSubtypes').isNotEmpty) {
break;
}
baseClassCode = parentType.classCodeAsReference;
}
output.writeLn('${baseClassCode},{');
//save annotations
var myAnnotations = getAnnotations(type.element!);
myAnnotations.forEach((key, value) {
output.writeLn('\"$key\" : $value,');
});
output.writeLn('}, {');
//save inherited annotations
for (var parentElement in type.parentClassElementsPath()){
getAnnotations(parentElement).forEach((key, value) {
if (!myAnnotations.containsKey(key)) {
output.writeLn('\"$key\" : $value,');
}
});
}
output.writeLn('}),');
}
output.writeLn('};');
output.writeLn('}');
});
}