Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(13)

Unified Diff: pkg/analysis_server/lib/src/computer/computer_overrides.dart

Issue 1632033002: Issue 25542. If an element does not have its own documentation, use the documentation from the over… (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 8a742125b21e28845847ea3b577d685899296f28..55e269aa47c7f9ce4c69a0ddbfe8d42034b8270d 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -5,65 +5,42 @@
library computer.overrides;
import 'package:analysis_server/src/collections.dart';
-import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analyzer/dart/element/element.dart' as engine;
-import 'package:analyzer/dart/element/type.dart' as engine;
+import 'package:analysis_server/src/protocol_server.dart' as proto;
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/generated/ast.dart';
/**
+ * Return the elements that the given [element] overrides.
+ */
+OverriddenElements findOverriddenElements(Element element) {
+ if (element?.enclosingElement is ClassElement) {
+ return new _OverriddenElementsFinder(element).find();
+ }
+ return new OverriddenElements(element, null, <Element>[]);
+}
+
+/**
* 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>[];
- engine.ClassElement _currentClass;
+ final List<proto.Override> _overrides = <proto.Override>[];
DartUnitOverridesComputer(this._unit);
/**
* Returns the computed occurrences, not `null`.
*/
- List<Override> compute() {
+ List<proto.Override> compute() {
for (CompilationUnitMember unitMember in _unit.declarations) {
if (unitMember is ClassDeclaration) {
- _currentClass = unitMember.element;
for (ClassMember classMember in unitMember.members) {
if (classMember is MethodDeclaration) {
if (classMember.isStatic) {
continue;
}
- SimpleIdentifier name = classMember.name;
- List<ElementKind> kinds;
- if (classMember.isGetter) {
- kinds = GETTER_KINDS;
- } else if (classMember.isSetter) {
- kinds = SETTER_KINDS;
- } else {
- kinds = METHOD_KINDS;
- }
- new _SingleOverrideComputer(_currentClass, name, kinds)
- .addOverrideTo(_overrides);
+ _addOverride(classMember.name);
}
if (classMember is FieldDeclaration) {
if (classMember.isStatic) {
@@ -71,9 +48,7 @@ class DartUnitOverridesComputer {
}
List<VariableDeclaration> fields = classMember.fields.variables;
for (VariableDeclaration field in fields) {
- SimpleIdentifier name = field.name;
- new _SingleOverrideComputer(_currentClass, name, FIELD_KINDS)
- .addOverrideTo(_overrides);
+ _addOverride(field.name);
}
}
}
@@ -81,105 +56,161 @@ class DartUnitOverridesComputer {
}
return _overrides;
}
+
+ /**
+ * Add a new [Override] for the declaration with the given name [node].
+ */
+ void _addOverride(SimpleIdentifier node) {
+ Element element = node.staticElement;
+ OverriddenElements overridesResult =
+ new _OverriddenElementsFinder(element).find();
+ if (overridesResult.superElement != null ||
+ overridesResult.interfaceElements.isNotEmpty) {
+ proto.OverriddenMember superMember = overridesResult.superElement != null
+ ? proto.newOverriddenMember_fromEngine(overridesResult.superElement)
+ : null;
+ List<proto.OverriddenMember> interfaceMembers = overridesResult
+ .interfaceElements
+ .map((member) => proto.newOverriddenMember_fromEngine(member))
+ .toList();
+ _overrides.add(new proto.Override(node.offset, node.length,
+ superclassMember: superMember,
+ interfaceMembers: nullIfEmpty(interfaceMembers)));
+ }
+ }
}
/**
- * Computer for [Override] for a single declaration.
+ * The container with elements that a class member overrides.
*/
-class _SingleOverrideComputer {
- final engine.LibraryElement currentLibrary;
- final engine.ClassElement currentClass;
- final SimpleIdentifier node;
- final String name;
- final List<ElementKind> kinds;
-
- _SingleOverrideComputer(
- engine.ClassElement currentClass, SimpleIdentifier node, this.kinds)
- : currentClass = currentClass,
- currentLibrary = currentClass.library,
- node = node,
- name = node.name;
+class OverriddenElements {
+ /**
+ * The element that overrides other class members.
+ */
+ final Element element;
/**
- * Add a new [Override] for this declaration to the given [overrides].
+ * The element that [element] overrides and which is defined in a class that
+ * is a superclass of the class that defines [element].
*/
- void addOverrideTo(List<Override> overrides) {
+ final Element superElement;
+
+ /**
+ * The element that [element] overrides and which is defined in a class that
+ * which is implemented by the class that defines [element].
+ */
+ final List<Element> interfaceElements;
+
+ OverriddenElements(this.element, this.superElement, this.interfaceElements);
+}
+
+class _OverriddenElementsFinder {
+ 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
+ ];
+
+ Element _seed;
+ LibraryElement _library;
+ ClassElement _class;
+ String _name;
+ List<ElementKind> _kinds;
+
+ Set<Element> _interfaceElements = new Set<Element>();
+ Set<InterfaceType> _visited = new Set<InterfaceType>();
+
+ _OverriddenElementsFinder(Element seed) {
+ _seed = seed;
+ _class = seed.enclosingElement;
+ _library = _class.library;
+ _name = seed.displayName;
+ if (seed is MethodElement) {
+ _kinds = METHOD_KINDS;
+ } else if (seed is PropertyAccessorElement) {
+ _kinds = seed.isGetter ? GETTER_KINDS : SETTER_KINDS;
+ } else {
+ _kinds = FIELD_KINDS;
+ }
+ }
+
+ /**
+ * Add the [OverriddenElements] for this element.
+ */
+ OverriddenElements find() {
// super
- engine.Element superEngineElement;
- {
- engine.InterfaceType superType = currentClass.supertype;
- if (superType != null) {
- superEngineElement = _lookupMember(superType.element);
- }
+ Element superElement;
+ InterfaceType superType = _class.supertype;
+ if (superType != null) {
+ superElement = _lookupMember(superType.element);
}
// interfaces
- Set<engine.Element> interfaceEngineElements = new Set<engine.Element>();
- _addInterfaceOverrides(interfaceEngineElements, currentClass.type, false,
- new Set<engine.InterfaceType>());
- interfaceEngineElements.remove(superEngineElement);
- // is there any override?
- if (superEngineElement != null || interfaceEngineElements.isNotEmpty) {
- OverriddenMember superMember = superEngineElement != null
- ? newOverriddenMember_fromEngine(superEngineElement)
- : null;
- List<OverriddenMember> interfaceMembers = interfaceEngineElements
- .map((member) => newOverriddenMember_fromEngine(member))
- .toList();
- overrides.add(new Override(node.offset, node.length,
- superclassMember: superMember,
- interfaceMembers: nullIfEmpty(interfaceMembers)));
- }
+ _addInterfaceOverrides(_class.type, false);
+ _interfaceElements.remove(superElement);
+ // done
+ return new OverriddenElements(
+ _seed, superElement, _interfaceElements.toList());
}
- void _addInterfaceOverrides(
- Set<engine.Element> elements,
- engine.InterfaceType type,
- bool checkType,
- Set<engine.InterfaceType> visited) {
+ void _addInterfaceOverrides(InterfaceType type, bool checkType) {
if (type == null) {
return;
}
- if (!visited.add(type)) {
+ if (!_visited.add(type)) {
return;
}
// check type
if (checkType) {
- engine.Element element = _lookupMember(type.element);
+ Element element = _lookupMember(type.element);
if (element != null) {
- elements.add(element);
+ _interfaceElements.add(element);
return;
}
}
// check interfaces
- for (engine.InterfaceType interfaceType in type.interfaces) {
- _addInterfaceOverrides(elements, interfaceType, true, visited);
+ for (InterfaceType interfaceType in type.interfaces) {
+ _addInterfaceOverrides(interfaceType, true);
}
// check super
- _addInterfaceOverrides(elements, type.superclass, checkType, visited);
+ _addInterfaceOverrides(type.superclass, checkType);
}
- engine.Element _lookupMember(engine.ClassElement classElement) {
+ Element _lookupMember(ClassElement classElement) {
if (classElement == null) {
return null;
}
- engine.Element member;
+ Element member;
// method
- if (kinds.contains(ElementKind.METHOD)) {
- member = classElement.lookUpMethod(name, currentLibrary);
+ if (_kinds.contains(ElementKind.METHOD)) {
+ member = classElement.lookUpMethod(_name, _library);
if (member != null) {
return member;
}
}
// getter
- if (kinds.contains(ElementKind.GETTER)) {
- member = classElement.lookUpGetter(name, currentLibrary);
+ if (_kinds.contains(ElementKind.GETTER)) {
+ member = classElement.lookUpGetter(_name, _library);
if (member != null) {
return member;
}
}
// setter
- if (kinds.contains(ElementKind.SETTER)) {
- member = classElement.lookUpSetter(name + '=', currentLibrary);
+ if (_kinds.contains(ElementKind.SETTER)) {
+ member = classElement.lookUpSetter(_name + '=', _library);
if (member != null) {
return member;
}

Powered by Google App Engine
This is Rietveld 408576698