ModelElement canonicalEnclosingElement

Source

ModelElement get canonicalEnclosingElement {
  Element searchElement = element;
  if (!_canonicalEnclosingClassIsSet) {
    if (isInherited) {
      searchElement = searchElement is Member
          ? Package.getBasestElement(searchElement)
          : searchElement;
      // TODO(jcollins-g): generate warning if an inherited element's definition
      // is in an intermediate non-canonical class in the inheritance chain?
      for (Class c in inheritance.reversed) {
        // Filter out mixins.
        if (c.contains(searchElement)) {
          Class canonicalC = package.findCanonicalModelElementFor(c.element);
          // TODO(jcollins-g): invert this lookup so traversal is recursive
          // starting from the ModelElement.
          if (canonicalC != null) {
            assert(canonicalC.contains(searchElement));
            _canonicalEnclosingClass = c;
            break;
          }
        }
      }
      if (definingEnclosingElement.isCanonical) {
        assert(definingEnclosingElement == _canonicalEnclosingClass);
      }
    } else {
      if (enclosingElement.isCanonical) {
        _canonicalEnclosingClass = enclosingElement;
      }
    }
    _canonicalEnclosingClassIsSet = true;
  }
  return _canonicalEnclosingClass;
}