OtherMethodInfo.create constructor

OtherMethodInfo.create(
  1. MethodElement methodElement,
  2. ConstantReader reader
)

工厂方法:从方法元素和注解 ConstantReader 创建 OtherMethodInfo

Implementation

factory OtherMethodInfo.create(
  MethodElement methodElement,
  ConstantReader reader,
) {
  final returnType = methodElement.returnType.genericsName;
  final typeIsNull =
      (methodElement.returnType.nullabilitySuffix ==
      NullabilitySuffix.question);
  // 在analyzer 8.1.1版本中,parameters属性仍然可用,但返回类型可能有变化
  final methodParams = methodElement.formalParameters.map((param) {
    return {
      'type': param.type.genericsName,
      'typeIsNull':
          (param.type.nullabilitySuffix == NullabilitySuffix.question),
      'name': param.name,
    };
  }).toList();

  final Map<String, dynamic> templateData = {
    'methodName': methodElement.name,
    'returnType': returnType == 'void' ? null : returnType,
    'returnTypeIsNull': typeIsNull,
    'methodParams': methodParams,
    'isAsync': methodElement.firstFragment.isAsynchronous,
  };

  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 OtherMethodInfo(
    methodElement.name!,
    returnType,
    typeIsNull,
    methodParams,
    reader
        .read('classCode')
        .stringValueOrNull
        ?.let((it) => Template(it).render(templateData)),
    reader.read('isAsync').boolValue,
    reader
        .read('funCode')
        .stringValue
        .let((it) => Template(it).render(templateData)),
    reader
        .read('valueUpdateListenerFunCode')
        .stringValueOrNull
        ?.let((it) => Template(it).render(templateData)),
  );
}