FieldInterceptInfo.create constructor

FieldInterceptInfo.create(
  1. FieldInfo fieldInfo,
  2. FieldElement field,
  3. ConstantReader reader
)

工厂方法:从字段和注解 ConstantReader 创建 FieldInterceptInfo

通过 Mustache 模板渲染注解中的代码片段,动态生成对应的代码字符串。

Implementation

factory FieldInterceptInfo.create(
  FieldInfo fieldInfo,
  FieldElement field,
  ConstantReader reader,
) {
  final templateData = {
    "name": field.name,
    "type": field.type.genericsName,
    'typeIsNull':
        (field.type.nullabilitySuffix == NullabilitySuffix.question),
    "keyName": fieldInfo.keyName,
    "keyType": fieldInfo.type,
    "keyTypeIsNull": fieldInfo.typeIsNull,
  };

  FConfigAnnotationFieldInfo.create(reader).let((it) {
    for (var field in it.fields) {
      final fieldElement = reader.read(field);

      if (fieldElement.isNull) {
        templateData[field] = [];
        return;
      }
      templateData[field] = fieldElement.objectValue.parsedValue;
    }
  });

  return FieldInterceptInfo(
    field.name!,
    field.type.genericsName,
    (field.type.nullabilitySuffix == NullabilitySuffix.question),
    fieldInfo.keyName,
    fieldInfo.type,
    fieldInfo.typeIsNull,
    reader
        .read('classCode')
        .stringValueOrNull
        ?.let((it) => Template(it).render(templateData)),
    reader
        .read('getFieldCode')
        .stringValueOrNull
        ?.let((it) => Template(it).render(templateData)),
    reader
        .read('setFieldCode')
        .stringValueOrNull
        ?.let((it) => Template(it).render(templateData)),
    reader
        .read('valueUpdateListenerFunCode')
        .stringValueOrNull
        ?.let((it) => Template(it).render(templateData)),
  );
}