onGenerate method

  1. @override
Future<$BuildOutput> onGenerate(
  1. ArtifactBuilder builder,
  2. ClassElement clazz,
  3. ConstructorElement ctor,
  4. List<FormalParameterElement> params,
  5. BuildStep step,
  6. List<String>? eFields,
)
override

Implementation

@override
Future<$BuildOutput> onGenerate(
  ArtifactBuilder builder,
  ClassElement clazz,
  ConstructorElement ctor,
  List<FormalParameterElement> params,
  BuildStep step,
  List<String>? eFields,
) async {
  if (params.isEmpty) return (<Uri>[], StringBuffer());
  StringBuffer buf = StringBuffer();
  List<Uri> importUris = <Uri>[];
  LibraryElement targetLib = clazz.library;
  buf.write('  ${builder.applyDefsF(clazz.name ?? "")} copyWith({');

  for (FormalParameterElement param in params) {
    String name = paramName(param);
    DartType type = param.type;
    String baseType = _outerNonNullableType(type);
    builder.registerDef(baseType);
    String forceNullType = "${builder.applyDefsF(baseType)}?";

    buf.write('$forceNullType $name,');
    builder.registerDef("bool");
    if (supportsDeleteFlag(param)) {
      buf.write(
        '${builder.applyDefsF("bool")} delete${name.capitalize()}=_F,',
      );
    }

    if (param.hasDefaultValue) {
      buf.write(
        '${builder.applyDefsF("bool")} reset${name.capitalize()}=_F,',
      );
    }

    Uri uri = builder.$getImport(type, targetLib);
    if (uri.toString().isNotEmpty) importUris.add(uri);

    if (isCollectionType(baseType)) {
      buf.write(
        '${builder.applyDefsF(baseType)}? append${name.capitalize()},',
      );
      buf.write(
        '${builder.applyDefsF(baseType)}? remove${name.capitalize()},',
      );
    }

    if (isNumericType(baseType)) {
      buf.write(
        '${builder.applyDefsF(baseType)}? delta${name.capitalize()},',
      );
    }
  }
  buf.write('})'); // end of parameter list, start body

  List<String> subs = builder.subclassesOf(clazz);
  bool hasSubs = subs.isNotEmpty;
  if (hasSubs) {
    buf.write("{");
    for (String sub in subs) {
      buf.write('if (_H is ${builder.applyDefsF(sub)}){');
      buf.write('return (_H as ${builder.applyDefsF(sub)}).copyWith(');
      _writeForwardedCopyWithArgs(buf, params);
      buf.write(");");
      buf.write('}');
    }
  }

  buf.write(
    '${!hasSubs ? "=>" : "return "}${builder.applyDefsF(clazz.name ?? "")}(',
  );
  for (FormalParameterElement param in params) {
    String name = paramName(param);
    bool nullable = isNullableType(param.type);
    String bs = _outerNonNullableType(param.type);
    String resetDefault = builder.defaultValueForParam(param);
    if (isCollectionType(bs)) {
      resetDefault = _typedCollectionDefault(resetDefault, bs, builder);
    }

    String pref = "";
    String nd = nullable ? "??0" : "";
    if (isNumericType(bs)) {
      pref =
          "delta${name.capitalize()}!=null?($name??_H.$name$nd)+delta${name.capitalize()}:";
    }

    String o = "";

    if (supportsDeleteFlag(param) && param.hasDefaultValue) {
      o = '${pref}delete${name.capitalize()}?null:reset${name.capitalize()} ? $resetDefault:($name??_H.$name),';
    } else if (supportsDeleteFlag(param)) {
      o = '${pref}delete${name.capitalize()}?null:($name??_H.$name),';
    } else if (param.hasDefaultValue) {
      o = '${pref}reset${name.capitalize()}?$resetDefault:($name??_H.$name),';
    } else {
      o = '$pref$name??_H.$name,';
    }

    if (isCollectionType(bs)) {
      String gn = nullable ? "?" : "";

      if (param.hasDefaultValue) {
        builder.registerDef(bs);
        o = "((${o.substring(0, o.length - 1)}) as ${builder.applyDefsF(bs)}$gn)$gn.\$u(append${name.capitalize()},remove${name.capitalize()}),";
      } else {
        o = "(${o.substring(0, o.length - 1)})$gn.\$u(append${name.capitalize()},remove${name.capitalize()}),";
      }
    }

    buf.write('$name: $o');
  }

  buf.writeln(');${hasSubs ? "}" : ""}');

  return (importUris, buf);
}