coerceSet<T> static method
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',
);
}
}