getAllConcreteMembers method

Map<String, InterpretedFunction> getAllConcreteMembers()

Returns a map of all concrete instance members (methods, getters, setters) available on this class, including those inherited via the extends chain. Key: member name, Value: the concrete InterpretedFunction.

Implementation

Map<String, InterpretedFunction> getAllConcreteMembers() {
  final concreteMembers = <String, InterpretedFunction>{};
  InterpretedClass? current = this;
  while (current != null) {
    // G-DOV-6/7 FIX: Also include concrete members from mixins at each level
    for (final mixin in current.mixins) {
      mixin.methods.forEach((name, func) {
        if (!func.isAbstract) {
          concreteMembers.putIfAbsent(name, () => func);
        }
      });
      mixin.getters.forEach((name, func) {
        if (!func.isAbstract) {
          concreteMembers.putIfAbsent(name, () => func);
        }
      });
      mixin.setters.forEach((name, func) {
        if (!func.isAbstract) {
          concreteMembers.putIfAbsent(name, () => func);
        }
      });
    }
    // Add concrete members from the current class, avoiding overwrites from subclasses
    current.methods.forEach((name, func) {
      if (!func.isAbstract) {
        concreteMembers.putIfAbsent(name, () => func);
      }
    });
    current.getters.forEach((name, func) {
      if (!func.isAbstract) {
        concreteMembers.putIfAbsent(name, () => func);
      }
    });
    current.setters.forEach((name, func) {
      if (!func.isAbstract) {
        concreteMembers.putIfAbsent(name, () => func);
      }
    });
    current = current.superclass;
  }
  return concreteMembers;
}