@@ -121,9 +121,9 @@ abstract class Inheritable {
121
121
Element searchElement = element;
122
122
if (! _canonicalEnclosingClassIsSet) {
123
123
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;
127
127
bool foundElement = false ;
128
128
// TODO(jcollins-g): generate warning if an inherited element's definition
129
129
// is in an intermediate non-canonical class in the inheritance chain
@@ -363,8 +363,6 @@ class Class extends ModelElement implements EnclosedElement {
363
363
_allElements.addAll (constructors.map ((e) => e.element));
364
364
_allElements.addAll (staticMethods.map ((e) => e.element));
365
365
_allElements.addAll (staticProperties.map ((e) => e.element));
366
- _allElements.addAll (_allElements.where ((e) => e is Member )
367
- ..map ((e) => (e as Member ).baseElement));
368
366
}
369
367
return _allElements.contains (element);
370
368
}
@@ -1744,7 +1742,9 @@ abstract class ModelElement implements Comparable, Nameable, Documentable {
1744
1742
// It isn't a disambiguator because EnumFields are not inherited, ever.
1745
1743
// TODO(jcollins-g): cleanup class hierarchy so that EnumFields aren't
1746
1744
// Inheritable, somehow?
1747
- if (e is Member ) e = (e as Member ).baseElement;
1745
+ if (e is Member ) {
1746
+ e = Package .getBasestElement (e);
1747
+ }
1748
1748
Tuple4 <Element , Library , Class , ModelElement > key =
1749
1749
new Tuple4 (e, library, enclosingClass, enclosingCombo);
1750
1750
ModelElement newModelElement;
@@ -3313,19 +3313,32 @@ class Package implements Nameable, Documentable {
3313
3313
return _canonicalLibraryFor[e];
3314
3314
}
3315
3315
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
+
3316
3325
/// Tries to find a canonical ModelElement for this element. If we know
3317
3326
/// this element is related to a particular class, pass preferredClass to
3318
3327
/// disambiguate.
3319
3328
ModelElement findCanonicalModelElementFor (Element e, {Class preferredClass}) {
3320
3329
assert (allLibrariesAdded);
3321
3330
Library lib = findCanonicalLibraryFor (e);
3331
+ if (lib == null && preferredClass != null ) {
3332
+ lib = findCanonicalLibraryFor (preferredClass.element);
3333
+ }
3322
3334
ModelElement modelElement;
3323
3335
// TODO(jcollins-g): The data structures should be changed to eliminate guesswork
3324
3336
// with member elements.
3325
3337
if (e is ClassMemberElement || e is PropertyAccessorElement ) {
3326
3338
// Prefer Fields over Accessors.
3327
3339
if (e is PropertyAccessorElement )
3328
3340
e = (e as PropertyAccessorElement ).variable;
3341
+ if (e is Member ) e = getBasestElement (e);
3329
3342
Set <ModelElement > candidates = new Set ();
3330
3343
Tuple2 <Element , Library > iKey = new Tuple2 (e, lib);
3331
3344
Tuple4 <Element , Library , Class , ModelElement > key =
0 commit comments