DSX<T extends Object> constructor

DSX<T extends Object>(
  1. Object objSource,
  2. T obj, {
  3. List? parameters,
})

Creates a DSX object that makes a reference to object with parameters.

Implementation

factory DSX(Object objSource, T obj, {List? parameters}) {
  if (_isPrimitive(objSource) || _isPrimitive(obj)) {
    var type = DSXObjectType.forObject(obj);
    var dsx = DSX<T>._(type, parameters);

    _dsxToObjectSource[dsx] = objSource;
    _dsxToObject[dsx] = obj;

    _validateDSKKey(dsx._key);
    _keyToDSK[dsx._key] ??= WeakReference(dsx);
    _notManagedDSXs.add(dsx);

    print('primitive> $dsx > $objSource ; $obj');

    return dsx;
  }

  var prevDSX = _objectsToDSX[objSource];
  prevDSX ??= _objectsToDSX[obj];

  if (prevDSX != null) {
    for (var e in prevDSX) {
      if (e.equalsParameters(parameters)) {
        var dsx = e as DSX<T>;
        if (identical(dsx.objectSource, objSource)) {
          return dsx;
        }
      }
    }

    var type = DSXObjectType.forObject(obj);
    var dsx = DSX<T>._(type, parameters);
    prevDSX.add(dsx);

    _objectsToDSX[objSource] = prevDSX;
    _objectsToDSX[obj] = prevDSX;
    _dsxToObjectSource[dsx] = objSource;
    _dsxToObject[dsx] = obj;

    _validateDSKKey(dsx._key);
    _keyToDSK[dsx._key] ??= WeakReference(dsx);
    _notManagedDSXs.add(dsx);

    return dsx;
  } else {
    var type = DSXObjectType.forObject(obj);
    var dsx = DSX<T>._(type, parameters);

    _objectsToDSX[objSource] = [dsx];
    _objectsToDSX[obj] = [dsx];
    _dsxToObjectSource[dsx] = objSource;
    _dsxToObject[dsx] = obj;

    _validateDSKKey(dsx._key);
    _keyToDSK[dsx._key] ??= WeakReference(dsx);
    _notManagedDSXs.add(dsx);

    return dsx;
  }
}