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