| 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 b817147a4273bebc22fc58ce26d48f219363d0b2..23ca2550e68f74c52631dcbd4dc0358da871a42c 100644
|
| --- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
|
| +++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
|
| @@ -13,6 +13,26 @@ import 'package:analyzer/src/generated/element.dart' as engine;
|
| * A computer for class member overrides in a Dart [CompilationUnit].
|
| */
|
| class DartUnitOverridesComputer {
|
| + static const List<ElementKind> FIELD_KINDS = const <ElementKind>[
|
| + ElementKind.FIELD,
|
| + ElementKind.GETTER,
|
| + ElementKind.SETTER
|
| + ];
|
| +
|
| + static const List<ElementKind> GETTER_KINDS = const <ElementKind>[
|
| + ElementKind.FIELD,
|
| + ElementKind.GETTER
|
| + ];
|
| +
|
| + static const List<ElementKind> METHOD_KINDS = const <ElementKind>[
|
| + ElementKind.METHOD
|
| + ];
|
| +
|
| + static const List<ElementKind> SETTER_KINDS = const <ElementKind>[
|
| + ElementKind.FIELD,
|
| + ElementKind.SETTER
|
| + ];
|
| +
|
| final CompilationUnit _unit;
|
|
|
| final List<Override> _overrides = <Override>[];
|
| @@ -33,7 +53,16 @@ class DartUnitOverridesComputer {
|
| continue;
|
| }
|
| SimpleIdentifier nameNode = classMember.name;
|
| - _addOverride(nameNode.offset, nameNode.length, nameNode.name);
|
| + List<ElementKind> kinds;
|
| + if (classMember.isGetter) {
|
| + kinds = GETTER_KINDS;
|
| + } else if (classMember.isSetter) {
|
| + kinds = SETTER_KINDS;
|
| + } else {
|
| + kinds = METHOD_KINDS;
|
| + }
|
| + _addOverride(
|
| + nameNode.offset, nameNode.length, nameNode.name, kinds);
|
| }
|
| if (classMember is FieldDeclaration) {
|
| if (classMember.isStatic) {
|
| @@ -42,7 +71,8 @@ class DartUnitOverridesComputer {
|
| List<VariableDeclaration> fields = classMember.fields.variables;
|
| for (VariableDeclaration field in fields) {
|
| SimpleIdentifier nameNode = field.name;
|
| - _addOverride(nameNode.offset, nameNode.length, nameNode.name);
|
| + _addOverride(
|
| + nameNode.offset, nameNode.length, nameNode.name, FIELD_KINDS);
|
| }
|
| }
|
| }
|
| @@ -54,6 +84,7 @@ class DartUnitOverridesComputer {
|
| void _addInterfaceOverrides(
|
| Set<engine.Element> elements,
|
| String name,
|
| + List<ElementKind> kinds,
|
| engine.InterfaceType type,
|
| bool checkType,
|
| Set<engine.InterfaceType> visited) {
|
| @@ -65,7 +96,7 @@ class DartUnitOverridesComputer {
|
| }
|
| // check type
|
| if (checkType) {
|
| - engine.Element element = _lookupMember(type.element, name);
|
| + engine.Element element = _lookupMember(type.element, name, kinds);
|
| if (element != null) {
|
| elements.add(element);
|
| return;
|
| @@ -73,25 +104,28 @@ class DartUnitOverridesComputer {
|
| }
|
| // check interfaces
|
| for (engine.InterfaceType interfaceType in type.interfaces) {
|
| - _addInterfaceOverrides(elements, name, interfaceType, true, visited);
|
| + _addInterfaceOverrides(
|
| + elements, name, kinds, interfaceType, true, visited);
|
| }
|
| // check super
|
| - _addInterfaceOverrides(elements, name, type.superclass, checkType, visited);
|
| + _addInterfaceOverrides(
|
| + elements, name, kinds, type.superclass, checkType, visited);
|
| }
|
|
|
| - void _addOverride(int offset, int length, String name) {
|
| + void _addOverride(
|
| + int offset, int length, String name, List<ElementKind> kinds) {
|
| // super
|
| engine.Element superEngineElement;
|
| {
|
| engine.InterfaceType superType = _currentClass.supertype;
|
| if (superType != null) {
|
| - superEngineElement = _lookupMember(superType.element, name);
|
| + superEngineElement = _lookupMember(superType.element, name, kinds);
|
| }
|
| }
|
| // interfaces
|
| Set<engine.Element> interfaceEngineElements = new Set<engine.Element>();
|
| - _addInterfaceOverrides(interfaceEngineElements, name, _currentClass.type,
|
| - false, new Set<engine.InterfaceType>());
|
| + _addInterfaceOverrides(interfaceEngineElements, name, kinds,
|
| + _currentClass.type, false, new Set<engine.InterfaceType>());
|
| interfaceEngineElements.remove(superEngineElement);
|
| // is there any override?
|
| if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
|
| @@ -108,25 +142,32 @@ class DartUnitOverridesComputer {
|
| }
|
|
|
| static engine.Element _lookupMember(
|
| - engine.ClassElement classElement, String name) {
|
| + engine.ClassElement classElement, String name, List<ElementKind> kinds) {
|
| if (classElement == null) {
|
| return null;
|
| }
|
| engine.LibraryElement library = classElement.library;
|
| + engine.Element member;
|
| // method
|
| - engine.Element member = classElement.lookUpMethod(name, library);
|
| - if (member != null) {
|
| - return member;
|
| + if (kinds.contains(ElementKind.METHOD)) {
|
| + member = classElement.lookUpMethod(name, library);
|
| + if (member != null) {
|
| + return member;
|
| + }
|
| }
|
| // getter
|
| - member = classElement.lookUpGetter(name, library);
|
| - if (member != null) {
|
| - return member;
|
| + if (kinds.contains(ElementKind.GETTER)) {
|
| + member = classElement.lookUpGetter(name, library);
|
| + if (member != null) {
|
| + return member;
|
| + }
|
| }
|
| // setter
|
| - member = classElement.lookUpSetter(name + '=', library);
|
| - if (member != null) {
|
| - return member;
|
| + if (kinds.contains(ElementKind.SETTER)) {
|
| + member = classElement.lookUpSetter(name + '=', library);
|
| + if (member != null) {
|
| + return member;
|
| + }
|
| }
|
| // not found
|
| return null;
|
|
|