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;
}