get method

  1. @override
Object? get(
  1. String memberName, [
  2. InterpreterVisitor? visitor
])
override

Accesses a property or method of this value.

Implementation

@override
Object? get(String memberName, [InterpreterVisitor? visitor]) {
  // Handle implicit 'name' property
  if (memberName == 'name') {
    Logger.debug(
        " [EnumValue.get] Accessing implicit property 'name'. Returning: $name");
    return name; // Return the stored name of the enum value
  }

  // Handle implicit 'index' property
  if (memberName == 'index') {
    Logger.debug(
        " [EnumValue.get] Accessing implicit property 'index'. Returning: $index");
    return index;
  }

  // 1. Check instance fields specific to this enum value
  if (_fields.containsKey(memberName)) {
    final fieldValue = _fields[memberName];
    Logger.debug(
        " [EnumValue.get] Found field '$memberName' with value: $fieldValue");
    return fieldValue;
  }

  // 2. Check instance getters defined on the enum
  final getter = parentEnum.getters[memberName];
  if (getter != null) {
    // We need to call the getter, binding `this` to `this` enum value instance
    // This requires the getter function to be callable with the instance
    if (visitor == null) {
      throw RuntimeD4rtException(
          "Internal error: Visitor required to execute enum getter '$memberName'.");
    }
    final boundGetter = getter.bind(this);
    // Call the getter immediately with no arguments
    final getterResult = boundGetter.call(visitor, [], {});
    Logger.debug(
        " [EnumValue.get] Executed getter '$memberName'. Result: $getterResult");
    return getterResult;
  }

  // 3. Check instance methods defined on the enum
  final method = parentEnum.methods[memberName];
  if (method != null) {
    // Return the bound method
    final boundMethod = method.bind(this);
    Logger.debug(
        " [EnumValue.get] Found method '$memberName'. Returning bound method: $boundMethod");
    return boundMethod;
  }

  // 4. Check mixins (similar to InterpretedInstance)
  // Search in reverse order (last mixin wins)
  for (final mixin in parentEnum.mixins.reversed) {
    // Check mixin getters
    final mixinGetter = mixin.getters[memberName];
    if (mixinGetter != null) {
      if (visitor == null) {
        throw RuntimeD4rtException(
            "Internal error: Visitor required to execute mixin getter '$memberName'.");
      }
      final boundGetter = mixinGetter.bind(this);
      final getterResult = boundGetter.call(visitor, [], {});
      Logger.debug(
          " [EnumValue.get] Executed mixin getter '$memberName' from '${mixin.name}'. Result: $getterResult");
      return getterResult;
    }

    // Check mixin methods
    final mixinMethod = mixin.methods[memberName];
    if (mixinMethod != null) {
      final boundMethod = mixinMethod.bind(this);
      Logger.debug(
          " [EnumValue.get] Found mixin method '$memberName' from '${mixin.name}'. Returning bound method.");
      return boundMethod;
    }
  }

  // 5. Check bridged mixins
  for (final bridgedMixin in parentEnum.bridgedMixins.reversed) {
    // Try getter first
    final getterAdapter = bridgedMixin.findInstanceGetterAdapter(memberName);
    if (getterAdapter != null) {
      if (visitor == null) {
        throw RuntimeD4rtException(
            "Internal error: Visitor required to execute bridged mixin getter '$memberName'.");
      }
      Logger.debug(
          " [EnumValue.get] Executing bridged mixin getter '$memberName' from '${bridgedMixin.name}'.");
      try {
        return getterAdapter(visitor, this);
      } catch (e, s) {
        Logger.error(
            "Native exception during bridged mixin getter '$memberName': $e\n$s");
        throw RuntimeD4rtException(
            "Native error in bridged mixin getter '$memberName': $e", originalException: e);
      }
    }

    // Try method next
    final methodAdapter = bridgedMixin.findInstanceMethodAdapter(memberName);
    if (methodAdapter != null) {
      Logger.debug(
          " [EnumValue.get] Found bridged mixin method '$memberName' from '${bridgedMixin.name}'.");
      // Return a callable that wraps the bridged method
      return BridgedEnumMixinMethodCallable(
          this, methodAdapter, memberName, bridgedMixin.name);
    }
  }

  // Property not found
  throw RuntimeD4rtException(
      "Undefined property '$memberName' on enum value '$this'.");
}