prepareForConstructor method
构建内部定义类型vmclass
的实例的初始化值
Implementation
VmSuper prepareForConstructor(List<dynamic>? positionalArguments, Map<Symbol, dynamic>? namedArguments, VmClass vmclass) {
final target = _valueData;
if (target is VmValue) {
return target.prepareForConstructor(positionalArguments, namedArguments, vmclass);
} else {
final superclass = vmclass._internalSuperclass!; //必然存在,无需判断
if (superclass.identifier == VmClass.objectTypeName) {
final instance = VmInstance(); //默认继承Object类型的使用VmInstance创建实例
return instance.._initSuperProperties(childclass: vmclass, superclass: superclass); //创建超类的字段代理
} else {
final listResult = <dynamic>[];
final nameResult = <Symbol, dynamic>{};
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) {
listResult.add(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) {
nameResult[fieldKey] = value;
}
}
final instance = superclass.getProxy(VmClass.newMethodName, setter: false).runFunction(superclass, listResult, nameResult) as VmSuper; //创建对应的超类的实例
return instance.._initSuperProperties(childclass: vmclass, superclass: superclass); //创建超类的字段代理
}
}
}