buildMirror method

Future<void> buildMirror(
  1. ClassDeclaration clazz,
  2. MemberDeclarationBuilder builder
)

Implementation

Future<void> buildMirror(ClassDeclaration clazz, MemberDeclarationBuilder builder) async {
  List<FieldDeclaration> properties = await validFields(clazz, builder);
  List<MethodDeclaration> methods = await validMethods(clazz, builder);

  builder.declareInType(DeclarationCode.fromString(asCode("""
  /// Offers field reflection for the [${clazz.identifier.name}] object.
  /// * Offers basic Type information
  /// * You can get & set (via mutation) fields using the [MirrorField] object.
  /// * You can obtain annotations from the [MirrorField] object.
  static final ModelMirror<${clazz.identifier.name}> mirror = ModelMirror(List.unmodifiable([
    ${properties.map((i) => "MirrorField<${clazz.identifier.name}, ${i.type.fullName}>(\"${i.identifier.name.substring(1)}\", ${i.type.fullName}, (o) => o.${i.identifier.name.substring(1)}, (o, v) => o.mutate(${i.identifier.name.substring(1)}: v), const [${i.metadata.whereType<ConstructorMetadataAnnotation>().map((m) => reconstructAnnotation(m)).join(",")}])").join(",\n      ")}
  ]), List.unmodifiable([
    ${methods.map((i) => "MirrorMethod<${clazz.identifier.name}>(\"${i.identifier.name}\", const [${i.metadata.whereType<ConstructorMetadataAnnotation>().map((m) => reconstructAnnotation(m)).join(",")}], (o, p) => o.${buildMethodCall(i)})").join(",\n      ")}
  ]));
  """)));
}