memberByExample<T extends ModelElement> method

T memberByExample<T extends ModelElement>(
  1. T example
)

Given a ModelElement that is a member of some other class, return the member of this class that has the same name and runtime type.

This enables object substitution for canonicalization, such as Interceptor for Object.

Implementation

T memberByExample<T extends ModelElement>(T example) {
  ModelElement member;
  // [T] is insufficiently specific to disambiguate between different
  // subtypes of [Inheritable] or other mixins/implementations of
  // [ModelElement] via [Iterable.whereType].
  var possibleMembers = _membersByName[example.name]!
      .where((e) => e.runtimeType == example.runtimeType);
  if (example is Accessor) {
    possibleMembers = possibleMembers
        .where((e) => example.isGetter == (e as Accessor).isGetter);
  }
  member = possibleMembers.first;
  assert(possibleMembers.length == 1);
  return member as T;
}