Chromium Code Reviews| Index: pkg/kernel/lib/class_hierarchy.dart |
| diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart |
| index b756146a2a2e00a389f9f68582ac0003f1f320ab..f7c1f852f50feeb38c824316f0f9a7d7f51209c5 100644 |
| --- a/pkg/kernel/lib/class_hierarchy.dart |
| +++ b/pkg/kernel/lib/class_hierarchy.dart |
| @@ -115,13 +115,30 @@ abstract class ClassHierarchy { |
| /// |
| /// By default getters and setters are overridden separately. The [isSetter] |
| /// callback parameter determines which type of access is being overridden. |
| - /// |
| - /// However if [crossGettersSetters] is set to `true`, getters might be |
| - /// reported as overriding setters, and vice versa - setter overriding |
| - /// getters. The callback should check the [Procedure.kind] property. |
| void forEachOverridePair(Class class_, |
| - callback(Member declaredMember, Member interfaceMember, bool isSetter), |
| - {bool crossGettersSetters: false}); |
| + callback(Member declaredMember, Member interfaceMember, bool isSetter)); |
| + |
| + /// Invokes [callback] for every function, field, or getter declared in |
| + /// [class_] that has a corresponding setter in a supertype of [class_], and |
| + /// for every setter or non-final field declared in [class_] that has a |
| + /// corresponding function, field, or getter in a supertype of [class_]. |
| + /// |
| + /// We use the term "inheritable" for members that are candidates for |
| + /// inheritance but may have been overridden. The "declared" members of a |
| + /// mixin application are those declared in the mixed-in type. The callback is |
| + /// invoked in the following case: |
| + /// |
| + /// A member declared in the class overrides a member inheritable through |
| + /// one of the supertypes of the class. |
| + /// |
| + /// This method will not report that a member overrides itself. A given pair |
| + /// may be reported multiple times when there are multiple inheritance paths |
| + /// to the overridden member. |
| + /// |
| + /// By default getters and setters are overridden separately. The [isSetter] |
|
scheglov
2017/06/26 20:29:12
"By default getters and setters are overridden sep
Paul Berry
2017/06/27 20:53:30
Thanks! https://codereview.chromium.org/296003300
|
| + /// callback parameter corresponds to whether [declaredMember] is a setter. |
| + void forEachCrossOverridePair(Class class_, |
| + callback(Member declaredMember, Member interfaceMember, bool isSetter)); |
| /// This method is invoked by the client after it changed the [classes], and |
| /// some of the information that this hierarchy might have cached, is not |
| @@ -396,10 +413,6 @@ class ClosedWorldClassHierarchy implements ClassHierarchy { |
| isSetter: true); |
| _reportOverrides(info.declaredSetters, superSetters, callback, |
| isSetter: true, onlyAbstract: true); |
| - if (crossGettersSetters) { |
| - _reportOverrides(info.declaredGettersAndCalls, superSetters, callback); |
| - _reportOverrides(info.declaredSetters, superGetters, callback); |
| - } |
| } |
| if (!class_.isAbstract) { |
| // If a non-abstract class declares an abstract method M whose |
| @@ -417,6 +430,21 @@ class ClosedWorldClassHierarchy implements ClassHierarchy { |
| } |
| } |
| + @override |
| + void forEachCrossOverridePair(Class class_, |
| + callback(Member declaredMember, Member interfaceMember, bool isSetter), |
| + {bool crossGettersSetters: false}) { |
| + _ClassInfo info = _infoFor[class_]; |
| + for (var supertype in class_.supers) { |
| + var superclass = supertype.classNode; |
| + var superGetters = getInterfaceMembers(superclass); |
| + var superSetters = getInterfaceMembers(superclass, setters: true); |
| + _reportOverrides(info.declaredGettersAndCalls, superSetters, callback); |
| + _reportOverrides(info.declaredSetters, superGetters, callback, |
| + isSetter: true); |
| + } |
| + } |
| + |
| static void _reportOverrides( |
| List<Member> declaredList, |
| List<Member> inheritedList, |