@@ -121,9 +121,9 @@ abstract class Inheritable {
121121 Element searchElement = element;
122122 if (! _canonicalEnclosingClassIsSet) {
123123 if (isInherited) {
124- while ( searchElement is Member ) {
125- searchElement = (searchElement as Member ).baseElement;
126- }
124+ searchElement = searchElement is Member
125+ ? Package . getBasestElement (searchElement)
126+ : searchElement;
127127 bool foundElement = false ;
128128 // TODO(jcollins-g): generate warning if an inherited element's definition
129129 // is in an intermediate non-canonical class in the inheritance chain
@@ -363,8 +363,6 @@ class Class extends ModelElement implements EnclosedElement {
363363 _allElements.addAll (constructors.map ((e) => e.element));
364364 _allElements.addAll (staticMethods.map ((e) => e.element));
365365 _allElements.addAll (staticProperties.map ((e) => e.element));
366- _allElements.addAll (_allElements.where ((e) => e is Member )
367- ..map ((e) => (e as Member ).baseElement));
368366 }
369367 return _allElements.contains (element);
370368 }
@@ -1744,7 +1742,9 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
17441742 // It isn't a disambiguator because EnumFields are not inherited, ever.
17451743 // TODO(jcollins-g): cleanup class hierarchy so that EnumFields aren't
17461744 // Inheritable, somehow?
1747- if (e is Member ) e = (e as Member ).baseElement;
1745+ if (e is Member ) {
1746+ e = Package .getBasestElement (e);
1747+ }
17481748 Tuple4 <Element , Library , Class , ModelElement > key =
17491749 new Tuple4 (e, library, enclosingClass, enclosingCombo);
17501750 ModelElement newModelElement;
@@ -3313,19 +3313,32 @@ class Package implements Nameable, Documentable {
33133313 return _canonicalLibraryFor[e];
33143314 }
33153315
3316+ // TODO(jcollins-g): Revise when dart-lang/sdk#29600 is fixed.
3317+ static Element getBasestElement (Member member) {
3318+ Element element = member;
3319+ while (element is Member ) {
3320+ element = (element as Member ).baseElement;
3321+ }
3322+ return element;
3323+ }
3324+
33163325 /// Tries to find a canonical ModelElement for this element. If we know
33173326 /// this element is related to a particular class, pass preferredClass to
33183327 /// disambiguate.
33193328 ModelElement findCanonicalModelElementFor (Element e, {Class preferredClass}) {
33203329 assert (allLibrariesAdded);
33213330 Library lib = findCanonicalLibraryFor (e);
3331+ if (lib == null && preferredClass != null ) {
3332+ lib = findCanonicalLibraryFor (preferredClass.element);
3333+ }
33223334 ModelElement modelElement;
33233335 // TODO(jcollins-g): The data structures should be changed to eliminate guesswork
33243336 // with member elements.
33253337 if (e is ClassMemberElement || e is PropertyAccessorElement ) {
33263338 // Prefer Fields over Accessors.
33273339 if (e is PropertyAccessorElement )
33283340 e = (e as PropertyAccessorElement ).variable;
3341+ if (e is Member ) e = getBasestElement (e);
33293342 Set <ModelElement > candidates = new Set ();
33303343 Tuple2 <Element , Library > iKey = new Tuple2 (e, lib);
33313344 Tuple4 <Element , Library , Class , ModelElement > key =
0 commit comments