findExtensionMember method
Implementation
Callable? findExtensionMember(
Object? target,
String name, {
InterpreterVisitor? visitor,
}) {
// G-DOV-10/11 FIX: Handle null targets by searching extensions on nullable types
if (target == null) {
return _findNullableExtensionMember(name);
}
final targetType = getRuntimeType(target); // Helper to get RuntimeType
if (targetType == null) return null;
// Search current environment and enclosing ones
Environment? current = this;
while (current != null) {
// Check unnamed extensions
for (final ext in current._unnamedExtensions) {
if (_matchesExtensionType(targetType, ext.onType, value: target)) {
final member = ext.findMember(name);
if (member != null) {
Logger.debug(
" [Environment] Found extension member '$name' in unnamed ext on ${ext.onType.name}",
);
// Need to bind 'target' to the call somehow.
// This will likely require returning a bound callable or modifying the call site.
return member; // Return the raw callable for now
}
}
}
// Check named extensions (stored as values)
for (final value in current._values.values) {
if (value is InterpretedExtension) {
if (_matchesExtensionType(targetType, value.onType, value: target)) {
final member = value.findMember(name);
if (member != null) {
Logger.debug(
"[Environment] Found extension member '$name' in named ext '${value.name}' on ${value.onType.name}",
);
return member; // Return the raw callable
}
} else if (targetType is NativeFunction &&
visitor != null &&
value.onType is NativeFunction) {
final valueType = value.onType as NativeFunction;
if (valueType.name == targetType.name) {
final member = value.findMember(name);
if (member != null) {
Logger.debug(
"[Environment] Found extension member '$name' in named ext '${value.name}' on ${value.onType.name}",
);
return member; // Return the raw callable
}
}
}
}
}
current = current._enclosing;
}
return null; // Not found
}