Index: pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart |
diff --git a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart |
index 43f79d72360b1f21a35a09a6c93f825e8f39e893..54f997349205270ab4c96f229095a4628d55085d 100644 |
--- a/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart |
+++ b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart |
@@ -13,13 +13,13 @@ class ImplementedComputer { |
List<protocol.ImplementedClass> classes = <protocol.ImplementedClass>[]; |
List<protocol.ImplementedMember> members = <protocol.ImplementedMember>[]; |
- Set<ClassElement> subtypes; |
+ Set<String> subtypeMembers; |
ImplementedComputer(this.searchEngine, this.unitElement); |
compute() async { |
for (ClassElement type in unitElement.types) { |
- // always include Object and its members |
+ // Always include Object and its members. |
if (type.supertype == null) { |
_addImplementedClass(type); |
type.accessors.forEach(_addImplementedMember); |
@@ -27,14 +27,15 @@ class ImplementedComputer { |
type.methods.forEach(_addImplementedMember); |
continue; |
} |
- // analyze ancestors |
- subtypes = await searchEngine.searchAllSubtypes(type); |
- if (subtypes.isNotEmpty) { |
+ |
+ // Analyze subtypes. |
+ subtypeMembers = await searchEngine.membersOfSubtypes(type); |
+ if (subtypeMembers != null) { |
_addImplementedClass(type); |
+ type.accessors.forEach(_addMemberIfImplemented); |
+ type.fields.forEach(_addMemberIfImplemented); |
+ type.methods.forEach(_addMemberIfImplemented); |
} |
- type.accessors.forEach(_addMemberIfImplemented); |
- type.fields.forEach(_addMemberIfImplemented); |
- type.methods.forEach(_addMemberIfImplemented); |
} |
} |
@@ -61,19 +62,7 @@ class ImplementedComputer { |
bool _hasOverride(Element element) { |
String name = element.displayName; |
- LibraryElement library = element.library; |
- for (ClassElement subtype in subtypes) { |
- ClassMemberElement subElement = subtype.getMethod(name); |
- if (subElement == null) { |
- subElement = subtype.getField(name); |
- } |
- if (subElement != null && |
- !subElement.isStatic && |
- subElement.isAccessibleIn(library)) { |
- return true; |
- } |
- } |
- return false; |
+ return subtypeMembers.contains(name); |
} |
/** |