Index: pkg/analysis_services/lib/search/hierarchy.dart |
diff --git a/pkg/analysis_services/lib/search/hierarchy.dart b/pkg/analysis_services/lib/search/hierarchy.dart |
deleted file mode 100644 |
index a783b483f9a7fd81436a61c3f45b1d48c85605cb..0000000000000000000000000000000000000000 |
--- a/pkg/analysis_services/lib/search/hierarchy.dart |
+++ /dev/null |
@@ -1,211 +0,0 @@ |
-// Copyright (c) 2014, 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 services.hierarchy; |
- |
-import 'dart:async'; |
-import 'dart:collection'; |
- |
-import 'package:analysis_services/search/element_visitors.dart'; |
-import 'package:analysis_services/search/search_engine.dart'; |
-import 'package:analyzer/src/generated/element.dart'; |
- |
- |
-/** |
- * Returns direct children of [parent]. |
- */ |
-List<Element> getChildren(Element parent, [String name]) { |
- List<Element> children = <Element>[]; |
- visitChildren(parent, (Element element) { |
- if (name == null || element.displayName == name) { |
- children.add(element); |
- } |
- }); |
- return children; |
-} |
- |
- |
-/** |
- * Returns direct non-synthetic children of the given [ClassElement]. |
- * |
- * Includes: fields, accessors and methods. |
- * Excludes: constructors and synthetic elements. |
- */ |
-List<Element> getClassMembers(ClassElement clazz, [String name]) { |
- List<Element> members = <Element>[]; |
- visitChildren(clazz, (Element element) { |
- if (element.isSynthetic) { |
- return; |
- } |
- if (element is ConstructorElement) { |
- return; |
- } |
- if (name != null && element.displayName != name) { |
- return; |
- } |
- if (element is ExecutableElement) { |
- members.add(element); |
- } |
- if (element is FieldElement) { |
- members.add(element); |
- } |
- }); |
- return members; |
-} |
- |
- |
-/** |
- * Returns a [Set] with direct subclasses of [seed]. |
- */ |
-Future<Set<ClassElement>> getDirectSubClasses(SearchEngine searchEngine, |
- ClassElement seed) { |
- return searchEngine.searchSubtypes(seed).then((List<SearchMatch> matches) { |
- Set<ClassElement> subClasses = new HashSet<ClassElement>(); |
- for (SearchMatch match in matches) { |
- ClassElement subClass = match.element; |
- if (subClass.context == seed.context) { |
- subClasses.add(subClass); |
- } |
- } |
- return subClasses; |
- }); |
-} |
- |
- |
-/** |
- * @return all implementations of the given {@link ClassMemberElement} is its superclasses and |
- * their subclasses. |
- */ |
-Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine, |
- ClassMemberElement member) { |
- Set<ClassMemberElement> result = new HashSet<ClassMemberElement>(); |
- // constructor |
- if (member is ConstructorElement) { |
- result.add(member); |
- return new Future.value(result); |
- } |
- // method, field, etc |
- String name = member.displayName; |
- ClassElement memberClass = member.enclosingElement; |
- List<Future> futures = <Future>[]; |
- Set<ClassElement> searchClasses = getSuperClasses(memberClass); |
- searchClasses.add(memberClass); |
- for (ClassElement superClass in searchClasses) { |
- // ignore if super- class does not declare member |
- if (getClassMembers(superClass, name).isEmpty) { |
- continue; |
- } |
- // check all sub- classes |
- var subClassFuture = getSubClasses(searchEngine, superClass); |
- var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) { |
- subClasses.add(superClass); |
- for (ClassElement subClass in subClasses) { |
- List<Element> subClassMembers = getChildren(subClass, name); |
- for (Element member in subClassMembers) { |
- if (member is ClassMemberElement) { |
- result.add(member); |
- } |
- } |
- } |
- }); |
- futures.add(membersFuture); |
- } |
- return Future.wait(futures).then((_) { |
- return result; |
- }); |
-} |
- |
- |
-/** |
- * Returns non-synthetic members of the given [ClassElement] and its super |
- * classes. |
- * |
- * Includes: fields, accessors and methods. |
- * Excludes: constructors and synthetic elements. |
- */ |
-List<Element> getMembers(ClassElement clazz) { |
- List<Element> members = <Element>[]; |
- members.addAll(getClassMembers(clazz)); |
- Set<ClassElement> superClasses = getSuperClasses(clazz); |
- for (ClassElement superClass in superClasses) { |
- members.addAll(getClassMembers(superClass)); |
- } |
- return members; |
-} |
- |
- |
-/** |
- * Returns a [Set] with all direct and indirect subclasses of [seed]. |
- */ |
-Future<Set<ClassElement>> getSubClasses(SearchEngine searchEngine, |
- ClassElement seed) { |
- Set<ClassElement> subs = new HashSet<ClassElement>(); |
- // prepare queue |
- List<ClassElement> queue = new List<ClassElement>(); |
- queue.add(seed); |
- // schedule subclasss search |
- addSubClasses() { |
- // add direct subclasses of the next class |
- while (queue.isNotEmpty) { |
- ClassElement clazz = queue.removeLast(); |
- if (subs.add(clazz)) { |
- return getDirectSubClasses(searchEngine, clazz).then((directSubs) { |
- queue.addAll(directSubs); |
- return new Future(addSubClasses); |
- }); |
- } |
- } |
- // done |
- subs.remove(seed); |
- return subs; |
- } |
- return new Future(addSubClasses); |
-} |
- |
- |
-/** |
- * Returns a [Set] with all direct and indirect superclasses of [seed]. |
- */ |
-Set<ClassElement> getSuperClasses(ClassElement seed) { |
- Set<ClassElement> result = new HashSet<ClassElement>(); |
- // prepare queue |
- List<ClassElement> queue = new List<ClassElement>(); |
- queue.add(seed); |
- // process queue |
- while (!queue.isEmpty) { |
- ClassElement current = queue.removeLast(); |
- // add if not checked already |
- if (!result.add(current)) { |
- continue; |
- } |
- // append supertype |
- { |
- InterfaceType superType = current.supertype; |
- if (superType != null) { |
- queue.add(superType.element); |
- } |
- } |
- // append interfaces |
- for (InterfaceType intf in current.interfaces) { |
- queue.add(intf.element); |
- } |
- } |
- // we don't need "seed" itself |
- result.remove(seed); |
- return result; |
-} |
- |
- |
-/** |
- * If the given [element] is a synthetic [PropertyAccessorElement] returns |
- * its variable, otherwise returns [element]. |
- */ |
-Element getSyntheticAccessorVariable(Element element) { |
- if (element is PropertyAccessorElement) { |
- if (element.isSynthetic) { |
- return element.variable; |
- } |
- } |
- return element; |
-} |