@@ -53,63 +53,55 @@ mixin Inheritable on ContainerMember {
53
53
54
54
@override
55
55
Container ? computeCanonicalEnclosingContainer () {
56
- if (isInherited) {
57
- var searchElement = element.baseElement;
58
- // TODO(jcollins-g): generate warning if an inherited element's definition
59
- // is in an intermediate non-canonical class in the inheritance chain?
60
- Container ? found;
61
- var reverseInheritance = _inheritance.reversed.toList ();
62
- for (var i = 0 ; i < reverseInheritance.length; i++ ) {
63
- var container = reverseInheritance[i];
64
- if (container.containsElement (searchElement)) {
65
- var previousIsHiddenAndNotDefining = i > 0 &&
66
- _isHiddenInterface (reverseInheritance[i - 1 ]) &&
67
- container != definingEnclosingContainer;
68
- var thisIsHiddenAndDefining = _isHiddenInterface (container) &&
69
- container == definingEnclosingContainer;
70
- // If the previous container in the search is one of the "hidden"
71
- // interfaces, and it's not this member's defining container, OR if
72
- // this container in the search is one of the "hidden" interfaces,
73
- // and it is also this member's defining container, then we can just
74
- // immediately return the canonical enclosing container of the
75
- // overridden member in the previous, non-hidden container in the
76
- // inheritance.
77
- if (previousIsHiddenAndNotDefining || thisIsHiddenAndDefining) {
78
- var previousVisible = reverseInheritance
79
- .take (i)
80
- .lastWhere ((e) => ! _isHiddenInterface (e));
81
- var membersInPreviousVisible = previousVisible.allModelElements
82
- .where ((e) => e.name == name)
83
- .whereType <Inheritable >()
84
- .whereNotType <Field >();
85
- assert (
86
- membersInPreviousVisible.length == 1 ,
87
- 'found multiple members named "$name " in '
88
- '"${previousVisible .name }": '
89
- '${membersInPreviousVisible .toList ()}' );
90
- return membersInPreviousVisible.first.canonicalEnclosingContainer;
91
- }
92
- var canonicalContainer = packageGraph
93
- .findCanonicalModelElementFor (container) as Container ? ;
94
- // TODO(jcollins-g): invert this lookup so traversal is recursive
95
- // starting from the ModelElement.
96
- if (canonicalContainer != null ) {
97
- assert (canonicalContainer.isCanonical);
98
- assert (canonicalContainer.containsElement (searchElement));
99
- found = canonicalContainer;
100
- break ;
101
- }
56
+ if (! isInherited || definingEnclosingContainer is Extension ) {
57
+ return super .computeCanonicalEnclosingContainer ();
58
+ }
59
+
60
+ var searchElement = element.baseElement;
61
+ // TODO(jcollins-g): generate warning if an inherited element's definition
62
+ // is in an intermediate non-canonical class in the inheritance chain?
63
+ var reverseInheritance = _inheritance.reversed.toList ();
64
+ for (var i = 0 ; i < reverseInheritance.length; i++ ) {
65
+ var container = reverseInheritance[i];
66
+ if (container.containsElement (searchElement)) {
67
+ var previousIsHiddenAndNotDefining = i > 0 &&
68
+ _isHiddenInterface (reverseInheritance[i - 1 ]) &&
69
+ container != definingEnclosingContainer;
70
+ var thisIsHiddenAndDefining = _isHiddenInterface (container) &&
71
+ container == definingEnclosingContainer;
72
+ // If the previous container in the search is one of the "hidden"
73
+ // interfaces, and it's not this member's defining container, OR if this
74
+ // container in the search is one of the "hidden" interfaces, and it is
75
+ // also this member's defining container, then we can immediately return
76
+ // the canonical enclosing container of the overridden member in the
77
+ // previous, non-hidden container in the inheritance.
78
+ if (previousIsHiddenAndNotDefining || thisIsHiddenAndDefining) {
79
+ var previousVisible = reverseInheritance
80
+ .take (i)
81
+ .lastWhere ((e) => ! _isHiddenInterface (e));
82
+ var membersInPreviousVisible = previousVisible.allModelElements
83
+ .where ((e) => e.name == name)
84
+ .whereType <Inheritable >()
85
+ .whereNotType <Field >();
86
+ assert (
87
+ membersInPreviousVisible.length == 1 ,
88
+ 'found multiple members named "$name " in '
89
+ '"${previousVisible .name }": '
90
+ '${membersInPreviousVisible .toList ()}' );
91
+ return membersInPreviousVisible.first.canonicalEnclosingContainer;
92
+ }
93
+ var canonicalContainer =
94
+ packageGraph.findCanonicalModelElementFor (container) as Container ? ;
95
+ // TODO(jcollins-g): invert this lookup so traversal is recursive
96
+ // starting from the ModelElement.
97
+ if (canonicalContainer != null ) {
98
+ return canonicalContainer;
102
99
}
103
100
}
104
- if (found != null ) {
105
- return found;
106
- }
107
- } else if (definingEnclosingContainer is ! Extension ) {
108
- // TODO(jcollins-g): factor out extension logic into [Extendable].
109
- return packageGraph.findCanonicalModelElementFor (enclosingElement)
110
- as Container ? ;
111
101
}
112
- return super .computeCanonicalEnclosingContainer ();
102
+
103
+ // None of the super-containers are canonical.
104
+ return null ;
113
105
}
114
106
115
107
/// Whether [c] is a "hidden" interface.
0 commit comments