coerceSet<T> static method

Set<T> coerceSet<T>(
  1. Object? arg,
  2. String paramName
)

Coerce a Set from D4rt to a typed Set.

D4rt creates Set<Object?> when evaluating set literals. This function coerces the set to the expected element type by unwrapping BridgedInstance, BridgedEnumValue, and InterpretedInstance elements.

Implementation

static Set<T> coerceSet<T>(Object? arg, String paramName) {
  if (arg == null) {
    throw ArgumentD4rtException(
      'Invalid parameter "$paramName": expected Set<$T>, got null',
    );
  }

  // Handle BridgedInstance wrapping
  final value = arg is BridgedInstance ? arg.nativeObject : arg;

  // D4rt may produce Maps for set literals (e.g. `{}` defaults to Map,
  // or `{a, b}` can be misidentified). Coerce Map keys → Set elements.
  final Iterable<Object?> elements;
  if (value is Set) {
    if (value is Set<T>) return value;
    elements = value;
  } else if (value is Map) {
    elements = value.keys;
  } else if (value is List) {
    elements = value;
  } else {
    throw ArgumentD4rtException(
      'Invalid parameter "$paramName": expected Set<$T>, got ${value.runtimeType}',
    );
  }

  // Coerce each element to the expected type
  try {
    return elements.map<T>((e) {
      if (e is BridgedInstance) {
        final native = e.nativeObject;
        if (native is T) return native as T;
        // GEN-079: Try wrapper resolution before failing the cast.
        final wrapped = _tryGenericWrapperResolution<T>(native);
        if (wrapped != null) return wrapped;
        return native as T;
      }
      if (e is BridgedEnumValue) {
        return e.nativeValue as T;
      }
      if (e is InterpretedInstance) {
        if (e.bridgedSuperObject is T) {
          return e.bridgedSuperObject as T;
        }
        final effectiveVisitor = _activeVisitor;
        if (_interfaceProxies.isNotEmpty && effectiveVisitor != null) {
          final proxy = tryCreateInterfaceProxyWithVisitor<T>(
            e,
            effectiveVisitor,
          );
          if (proxy != null) return proxy;
        }
      }
      // GEN-079: Generic wrapper resolution for set elements.
      final unwrappedElem = e is BridgedInstance ? e.nativeObject : e;
      final wrapped = _tryGenericWrapperResolution<T>(unwrappedElem);
      if (wrapped != null) return wrapped;
      return e as T;
    }).toSet();
  } catch (e) {
    throw ArgumentD4rtException(
      'Invalid parameter "$paramName": cannot convert to Set<$T> - $e',
    );
  }
}