@@ -48,7 +48,6 @@ abstract class Container extends ModelElement {
48
48
/// All methods, including operators and statics, declared as part of this
49
49
/// [Container] . [declaredMethods] must be the union of [instanceMethods] ,
50
50
/// [staticMethods] , and [instanceOperators] .
51
- ///
52
51
Iterable <Method > get declaredMethods;
53
52
54
53
Iterable <Method > get instanceMethods => declaredMethods
@@ -138,11 +137,11 @@ abstract class Container extends ModelElement {
138
137
Map <String , List <ModelElement >> _membersByName;
139
138
140
139
/// Given a ModelElement that is a member of some other class, return
141
- /// a member of this class that has the same name and return type.
140
+ /// the member of this class that has the same name and runtime type.
142
141
///
143
142
/// This enables object substitution for canonicalization, such as Interceptor
144
143
/// for Object.
145
- ModelElement memberByExample ( ModelElement example) {
144
+ T memberByExample < T extends ModelElement >( T example) {
146
145
if (_membersByName == null ) {
147
146
_membersByName = {};
148
147
for (var me in allModelElements) {
@@ -153,11 +152,14 @@ abstract class Container extends ModelElement {
153
152
}
154
153
}
155
154
ModelElement member;
155
+ // [T] is insufficiently specific to disambiguate between different
156
+ // subtypes of [Inheritable] or other mixins/implementations of
157
+ // [ModelElement] via [Iterable.whereType].
156
158
var possibleMembers = _membersByName[example.name]
157
159
.where ((e) => e.runtimeType == example.runtimeType);
158
- if (example.runtimeType == Accessor ) {
159
- possibleMembers = possibleMembers. where (
160
- ( e) => ( example as Accessor ) .isGetter == (e as Accessor ).isGetter);
160
+ if (example is Accessor ) {
161
+ possibleMembers = possibleMembers
162
+ . where (( e) => example.isGetter == (e as Accessor ).isGetter);
161
163
}
162
164
member = possibleMembers.first;
163
165
assert (possibleMembers.length == 1 );
0 commit comments