prepareForInvocation method
准备执行该函数所需的参数列表,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;
}
}