findExtensionMember method

Callable? findExtensionMember(
  1. Object? target,
  2. String name, {
  3. InterpreterVisitor? visitor,
})

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
}