prepareForConstructor method

VmSuper prepareForConstructor(
  1. List? positionalArguments,
  2. Map<Symbol, dynamic>? namedArguments,
  3. VmClass vmclass
)

构建内部定义类型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); //创建超类的字段代理
    }
  }
}