of<T> static method
Returns an instance mirror for instance
.
If kind
is specified, it is used instead of Kind.find. Otherwise
Kind.find is used.
Implementation
static InstanceMirror of<T>(Object? instance, {required Kind? kind}) {
if (instance == null ||
instance is bool ||
instance is num ||
instance is String ||
instance is DateTime ||
instance is TypedData) {
return const _InstanceMirror();
}
final expando = _expando;
final existing = expando[instance];
if (existing != null) {
return existing;
}
_ImmutableInstanceMirrorBuilder builder;
if (instance is Walkable) {
builder = _ImmutableInstanceMirrorBuilder(instance.runtimeType);
instance.walk(builder);
} else {
kind ??= Kind.find(instance: instance);
if (kind is! ImmutableKind) {
assert(false);
return const _InstanceMirror();
}
builder = _ImmutableInstanceMirrorBuilder(instance.runtimeType);
kind.map(builder, instance);
}
final mirror = builder._build();
expando[instance] = mirror;
return mirror;
}