generateCopyWithMethod method

void generateCopyWithMethod(
  1. BuildContext ctx,
  2. ClassBuilder clazz,
  3. LibraryBuilder file
)

Generate a copyWith method.

Implementation

void generateCopyWithMethod(
    BuildContext ctx, ClassBuilder clazz, LibraryBuilder file) {
  clazz.methods.add(Method((method) {
    method
      ..name = 'copyWith'
      ..returns = ctx.modelClassType;

    // Add all `super` params
    if (ctx.constructorParameters.isNotEmpty) {
      for (var param in ctx.constructorParameters) {
        method.requiredParameters.add(Parameter((b) => b
          ..name = param.name
          ..type = convertTypeReference(param.type)));
      }
    }

    var buf = StringBuffer('return ${ctx.modelClassName}(');
    var i = 0;
    for (var param in ctx.constructorParameters) {
      if (i++ > 0) buf.write(', ');
      buf.write(param.name);
    }

    // Add named parameters
    for (var field in ctx.fields) {
      method.optionalParameters.add(Parameter((b) {
        b
          ..name = field.name
          ..named = true
          ..type = convertTypeReference(field.type, forceNullable: true);
      }));

      if (i++ > 0) buf.write(', ');
      buf.write('${field.name}: ${field.name} ?? this.${field.name}');
    }

    buf.write(');');
    method.body = Code(buf.toString());
  }));
}