get method
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'.");
}