generate method

Future<$BuildOutput> generate(
  1. ClassElement clazz,
  2. BuildStep step
)

Implementation

Future<$BuildOutput> generate(ClassElement clazz, BuildStep step) async {
  compression =
      $artifactChecker
          .firstAnnotationOf(clazz, throwOnUnresolved: false)
          ?.getField("compression")
          ?.toBoolValue() ??
      false;

  ConstructorElement? ctor = clazz.defaultConstructor;
  if (ctor == null) return (<Uri>[], StringBuffer());
  List<FormalParameterElement> params = ctor.aParams;
  List<String>? eAFields;
  Set<String> eFields = {};
  Set<String> rFields = {};
  DartObject? eAnn = $encryptChecker.firstAnnotationOf(
    clazz,
    throwOnUnresolved: false,
  );

  if (eAnn != null) {
    if (eAnn.getField("encrypt")?.toBoolValue() == true) {
      eFields = params.map((i) => i.name).whereType<String>().toSet();
    } else {
      rFields = params.map((i) => i.name).whereType<String>().toSet();
    }
  }

  for (FormalParameterElement p in params) {
    if (p.name == null) {
      continue;
    }
    FieldElement? f = clazz.getField(p.name!);

    if (f == null) {
      continue;
    }

    DartObject? pAnn = $encryptChecker.firstAnnotationOf(
      f,
      throwOnUnresolved: false,
    );
    if (pAnn != null) {
      if (pAnn.getField("encrypt")?.toBoolValue() == true && p.name != null) {
        eFields.add(p.name!);
      } else if (p.name != null) {
        rFields.add(p.name!);
      }
    }
  }

  if (eFields.isNotEmpty || rFields.isNotEmpty) {
    eAFields =
        params.map((i) => i.name).whereType<String>().diff(eFields).toList();
  }

  Future<$BuildOutput> _component(
    String name,
    $ArtifactBuilderOutput component,
  ) {
    return guardGenerationAsync(
      clazz: clazz,
      stage: "component:$name",
      run:
          () =>
              component.onGenerate(this, clazz, ctor, params, step, eAFields),
    );
  }

  return (
        <Uri>[],
        StringBuffer()
          ..writeln(
            "extension \$${clazz.name} on ${applyDefsF(clazz.name ?? "")}{",
          )
          ..writeln("  ${applyDefsF(clazz.name ?? "")} get _H=>this;"),
      )
      .mergeWith(
        await Future.wait([
          _component("to_map", const $ArtifactToMapComponent()),
          _component("from_map", const $ArtifactFromMapComponent()),
          _component("copy_with", const $ArtifactCopyWithComponent()),
          _component("instance", const $ArtifactInstanceComponent()),
          if ($artifactChecker
                  .firstAnnotationOf(clazz, throwOnUnresolved: false)
                  ?.getField("reflection")
                  ?.toBoolValue() ??
              false)
            _component("reflector", const $ArtifactReflectorComponent()),
          if ($artifactChecker
                  .firstAnnotationOf(clazz, throwOnUnresolved: false)
                  ?.getField("generateSchema")
                  ?.toBoolValue() ??
              false)
            _component("schema", const $ArtifactSchemaComponent()),
        ]).then((i) => i.merged),
      )
      .mergeWith((<Uri>[], StringBuffer()..write("}")));
}