| Index: pkg/analysis_server/lib/src/computer/computer_overrides.dart
|
| diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
|
| index c47e127ee03903ef743e7066b0ecd51eb2cb3437..9e97df649ccbd018a86df0bc1c62026332cec4f1 100644
|
| --- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
|
| +++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
|
| @@ -45,6 +45,30 @@ class DartUnitOverridesComputer {
|
| return _overrides;
|
| }
|
|
|
| + void _addInterfaceOverrides(List<engine.Element> elements, String name,
|
| + engine.InterfaceType type, bool checkType,
|
| + Set<engine.InterfaceType> visited) {
|
| + if (type == null) {
|
| + return;
|
| + }
|
| + if (!visited.add(type)) {
|
| + return;
|
| + }
|
| + // check type
|
| + if (checkType) {
|
| + engine.Element element = _lookupMember(type.element, name);
|
| + if (element != null) {
|
| + elements.add(element);
|
| + }
|
| + }
|
| + // check interfaces
|
| + for (engine.InterfaceType interfaceType in type.interfaces) {
|
| + _addInterfaceOverrides(elements, name, interfaceType, true, visited);
|
| + }
|
| + // check super
|
| + _addInterfaceOverrides(elements, name, type.superclass, true, visited);
|
| + }
|
| +
|
| void _addOverride(int offset, int length, String name) {
|
| // super
|
| engine.Element superEngineElement;
|
| @@ -56,12 +80,10 @@ class DartUnitOverridesComputer {
|
| }
|
| // interfaces
|
| List<engine.Element> interfaceEngineElements = <engine.Element>[];
|
| - for (engine.InterfaceType interfaceType in _currentClass.interfaces) {
|
| - engine.ClassElement interfaceElement = interfaceType.element;
|
| - engine.Element interfaceMember = _lookupMember(interfaceElement, name);
|
| - if (interfaceMember != null) {
|
| - interfaceEngineElements.add(interfaceMember);
|
| - }
|
| + if (superEngineElement == null) {
|
| + Set<engine.InterfaceType> visitedTypes = new Set<engine.InterfaceType>();
|
| + _addInterfaceOverrides(interfaceEngineElements, name, _currentClass.type,
|
| + false, visitedTypes);
|
| }
|
| // is there any override?
|
| if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
|
|
|