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('}');
  });
}