generateClass method

void generateClass(
  1. BuildContext ctx,
  2. LibraryBuilder file,
  3. ConstantReader annotation
)

Generate an extended model class.

Implementation

void generateClass(
    BuildContext ctx, LibraryBuilder file, ConstantReader annotation) {
  file.body.add(Class((clazz) {
    //log.fine('Generate Class: ${ctx.modelClassNameRecase.pascalCase}');
    clazz
      ..name = ctx.modelClassNameRecase.pascalCase
      ..annotations.add(refer('generatedSerializable'));

    for (var ann in ctx.includeAnnotations) {
      clazz.annotations.add(convertObject(ann));
    }

    if (shouldBeConstant(ctx)) {
      clazz.implements.add(Reference(ctx.originalClassName));
    } else {
      clazz.extend = Reference(ctx.originalClassName);
    }

    //if (ctx.importsPackageMeta)
    //  clazz.annotations.add(CodeExpression(Code('immutable')));

    // Generate the fields for the class
    for (var field in ctx.fields) {
      //log.fine('Generate Field: ${field.name}');

      clazz.fields.add(Field((b) {
        b
          ..name = field.name
          //..modifier = FieldModifier.final$
          //..annotations.add(CodeExpression(Code('override')))
          ..annotations.add(refer('override'))
          ..type = convertTypeReference(field.type);

        // Fields should only be forced-final if the original field has no setter.
        //log.fine('Final: ${field.isFinal}');
        //if (field.setter == null && field is! ShimFieldImpl) {
        //if (field.isFinal) {
        //  b.modifier = FieldModifier.final$;
        //}

        for (var el in [field.getter, field]) {
          //if (el?.documentationComment != null) {
          b.docs.addAll(el?.documentationComment?.split('\n') ?? []);
          //}
        }
      }));
    }

    generateConstructor(ctx, clazz, file);
    generateCopyWithMethod(ctx, clazz, file);
    generateEqualsOperator(ctx, clazz, file);
    generateHashCode(ctx, clazz);
    generateToString(ctx, clazz);

    // Generate toJson() method if necessary
    var serializers = annotation.peek('serializers')?.listValue ?? [];

    if (serializers.any((o) => o.toIntValue() == Serializers.json)) {
      clazz.methods.add(Method((method) {
        method
          ..name = 'toJson'
          ..returns = Reference('Map<String, dynamic>')
          ..body = Code('return ${clazz.name}Serializer.toMap(this);');
      }));
    }
  }));
}