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(', '),
', );',
]));
}