Future buildDeclarationsForClass()

in working/macros/example/data_class.dart [124:153]


  Future<void> buildDeclarationsForClass(
      ClassDeclaration clazz, ClassMemberDeclarationBuilder builder) async {
    var methods = await builder.methodsOf(clazz);
    if (methods.any((c) => c.identifier.name == 'copyWith')) {
      throw ArgumentError(
          'Cannot generate a copyWith method because one already exists');
    }
    var allFields = await clazz.allFields(builder).toList();
    var namedParams = [
      for (var field in allFields)
        ParameterCode.fromParts(
            [field.type.code, '? ${field.identifier.name}']),
    ];
    var args = [
      for (var field in allFields)
        NamedArgumentCode.fromString(
            '${field.identifier.name}: ${field.identifier.name} '
            '?? this.${field.identifier.name}'),
    ];
    builder.declareInClass(DeclarationCode.fromParts([
      clazz.identifier,
      ' copyWith({',
      ...namedParams.joinAsCode(', '),
      ',})',
      // TODO: We assume this constructor exists, but should check
      '=> ', clazz.identifier, '(',
      ...args.joinAsCode(', '),
      ', );',
    ]));
  }