prepareForInvocation method

List<VmObject> prepareForInvocation(
  1. List? positionalArguments,
  2. Map<Symbol, dynamic>? namedArguments,
  3. VmValue? buildTarget
)

准备执行该函数所需的参数列表,buildTarget是被该函数初始化的构建目标实例

Implementation

List<VmObject> prepareForInvocation(List<dynamic>? positionalArguments, Map<Symbol, dynamic>? namedArguments, VmValue? buildTarget) {
  final target = _valueData;
  if (target is VmValue) {
    return target.prepareForInvocation(positionalArguments, namedArguments, buildTarget);
  } else {
    final result = <VmObject>[];
    positionalArguments ??= const [];
    namedArguments ??= const {};
    //匹配列表参数
    for (var i = 0; i < metaData.listArguments.length; i++) {
      final field = metaData.listArguments[i];
      final value = i < positionalArguments.length ? positionalArguments[i] : field.fieldValue; //列表参数按照索引一一对应即可
      if (field.isSuperField) {
        //已在超类作用域中添加,直接忽略
      } else if (field.isClassField) {
        buildTarget!.getProperty(field.fieldName).setValue(value);
      } else {
        result.add(VmValue.forVariable(identifier: field.fieldName, initType: field.fieldType, initValue: value));
      }
    }
    //匹配命名参数
    for (var i = 0; i < metaData.nameArguments.length; i++) {
      final field = metaData.nameArguments[i];
      final fieldKey = Symbol(field.fieldName);
      final value = namedArguments.containsKey(fieldKey) ? namedArguments[fieldKey] : field.fieldValue; //命名参数按照字段名称进行匹配
      if (field.isSuperField) {
        //已在超类作用域中添加,直接忽略
      } else if (field.isClassField) {
        buildTarget!.getProperty(field.fieldName).setValue(value);
      } else {
        result.add(VmValue.forVariable(identifier: field.fieldName, initType: field.fieldType, initValue: value));
      }
    }
    return result;
  }
}