writeGeneratedConverter method

void writeGeneratedConverter(
  1. ClassElement element,
  2. StructurizeResult structurized,
  3. String constructorName,
  4. SubjectCodeContext codeContext,
)

Implementation

void writeGeneratedConverter(
    ClassElement element,
    StructurizeResult structurized,
    String constructorName,
    SubjectCodeContext codeContext) {
  var emitter = DartEmitter();
  var converterName = "${element.name}Converter";
  var clazz = Class((builder) {
    builder.name = converterName;

    builder.extend = Reference(
        "$genAlias.DefaultStructureConverter<${codeContext.className(element)}>");

    builder.fields.add(Field((builder) => builder
      ..name = "structure"
      ..type = Reference(
          "$genAlias.DogStructure<${codeContext.className(element)}>")
      ..annotations.add(CodeExpression(Code("override")))
      ..assignment = Code(
          "const ${structurized.structure.code(structurized.fieldNames.map((e) => "_$e").toList())}")
      ..modifier = FieldModifier.final$));

    for (var value in structurized.fieldNames) {
      builder.methods.add(Method((builder) => builder
        ..name = "_$value"
        ..returns = Reference("dynamic")
        ..requiredParameters.add(Parameter((builder) => builder
          ..type = Reference(codeContext.className(element))
          ..name = "obj"))
        ..static = true
        ..lambda = true
        ..body = Code("obj.$value")));
    }

    builder.methods.add(Method((builder) => builder
      ..name = "_activator"
      ..returns = Reference(codeContext.className(element))
      ..requiredParameters.add(Parameter((builder) => builder
        ..type = Reference("List")
        ..name = "list"))
      ..static = true
      ..lambda = true
      ..body = Code(structurized.activator)));
  });
  codeContext.codeBuffer.writeln(clazz.accept(emitter));
}