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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..44dcc2391f2f9913b789dffa7cd572110b0afebe |
--- /dev/null |
+++ b/pkg/analysis_server/lib/src/domains/analysis/implemented_dart.dart |
@@ -0,0 +1,73 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library domains.analysis.implemented_dart; |
+ |
+import 'package:analysis_server/src/protocol_server.dart' as protocol; |
+import 'package:analysis_server/src/services/search/hierarchy.dart'; |
+import 'package:analysis_server/src/services/search/search_engine.dart'; |
+import 'package:analyzer/src/generated/element.dart'; |
+ |
+class ImplementedComputer { |
+ final SearchEngine searchEngine; |
+ final CompilationUnitElement unitElement; |
+ |
+ List<protocol.ImplementedClass> classes = <protocol.ImplementedClass>[]; |
+ List<protocol.ImplementedMember> members = <protocol.ImplementedMember>[]; |
+ |
+ Set<ClassElement> subtypes; |
+ |
+ ImplementedComputer(this.searchEngine, this.unitElement); |
+ |
+ compute() async { |
+ for (ClassElement type in unitElement.types) { |
+ subtypes = await getSubClasses(searchEngine, type); |
+ if (subtypes.isNotEmpty) { |
+ _addImplementedClass(type); |
+ } |
+ type.accessors.forEach(_addMemberIfImplemented); |
+ type.fields.forEach(_addMemberIfImplemented); |
+ type.methods.forEach(_addMemberIfImplemented); |
+ } |
+ } |
+ |
+ void _addImplementedClass(ClassElement type) { |
+ String name = type.name; |
+ if (name != null) { |
+ int offset = type.nameOffset; |
+ int length = name.length; |
+ classes.add(new protocol.ImplementedClass(offset, length)); |
+ } |
+ } |
+ |
+ void _addImplementedMember(Element member) { |
+ String name = member.displayName; |
+ if (name != null) { |
+ int offset = member.nameOffset; |
+ int length = name.length; |
+ members.add(new protocol.ImplementedMember(offset, length)); |
+ } |
+ } |
+ |
+ void _addMemberIfImplemented(Element element) { |
+ if (!element.isSynthetic) { |
+ String name = element.displayName; |
+ if (name != null && _hasOverride(name)) { |
+ _addImplementedMember(element); |
+ } |
+ } |
+ } |
+ |
+ bool _hasOverride(String name) { |
+ for (ClassElement subtype in subtypes) { |
+ if (subtype.getMethod(name) != null) { |
+ return true; |
+ } |
+ if (subtype.getField(name) != null) { |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+} |