| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library services.hierarchy; | 5 library services.hierarchy; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analysis_server/src/services/search/element_visitors.dart'; | 10 import 'package:analysis_server/src/services/search/element_visitors.dart'; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 if (subClass.context == seed.context) { | 67 if (subClass.context == seed.context) { |
| 68 subClasses.add(subClass); | 68 subClasses.add(subClass); |
| 69 } | 69 } |
| 70 } | 70 } |
| 71 return subClasses; | 71 return subClasses; |
| 72 }); | 72 }); |
| 73 } | 73 } |
| 74 | 74 |
| 75 | 75 |
| 76 /** | 76 /** |
| 77 * Returns all the declarations of the given [ClassMemberElement] in | 77 * @return all implementations of the given {@link ClassMemberElement} is its su
perclasses and |
| 78 * superclasses of the declaring class, and its subclasses if not [onlySuper]. | 78 * their subclasses. |
| 79 */ | 79 */ |
| 80 Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine, | 80 Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine, |
| 81 ClassMemberElement member, bool onlySuper) { | 81 ClassMemberElement member) { |
| 82 Set<ClassMemberElement> result = new HashSet<ClassMemberElement>(); | 82 Set<ClassMemberElement> result = new HashSet<ClassMemberElement>(); |
| 83 // constructor | 83 // constructor |
| 84 if (member is ConstructorElement) { | 84 if (member is ConstructorElement) { |
| 85 result.add(member); | 85 result.add(member); |
| 86 return new Future.value(result); | 86 return new Future.value(result); |
| 87 } | 87 } |
| 88 // method, field, etc | 88 // method, field, etc |
| 89 String name = member.displayName; | 89 String name = member.displayName; |
| 90 ClassElement memberClass = member.enclosingElement; | 90 ClassElement memberClass = member.enclosingElement; |
| 91 List<Future> futures = <Future>[]; | 91 List<Future> futures = <Future>[]; |
| 92 Set<ClassElement> searchClasses = getSuperClasses(memberClass); | 92 Set<ClassElement> searchClasses = getSuperClasses(memberClass); |
| 93 searchClasses.add(memberClass); | 93 searchClasses.add(memberClass); |
| 94 for (ClassElement superClass in searchClasses) { | 94 for (ClassElement superClass in searchClasses) { |
| 95 List<Element> superClassMembers = getChildren(superClass, name); | |
| 96 // ignore if super- class does not declare member | 95 // ignore if super- class does not declare member |
| 97 if (superClassMembers.isEmpty) { | 96 if (getClassMembers(superClass, name).isEmpty) { |
| 98 continue; | |
| 99 } | |
| 100 // add super- class members | |
| 101 _addClassMembers(result, superClassMembers); | |
| 102 if (onlySuper) { | |
| 103 continue; | 97 continue; |
| 104 } | 98 } |
| 105 // check all sub- classes | 99 // check all sub- classes |
| 106 var subClassFuture = getSubClasses(searchEngine, superClass); | 100 var subClassFuture = getSubClasses(searchEngine, superClass); |
| 107 var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) { | 101 var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) { |
| 102 subClasses.add(superClass); |
| 108 for (ClassElement subClass in subClasses) { | 103 for (ClassElement subClass in subClasses) { |
| 109 List<Element> subClassMembers = getChildren(subClass, name); | 104 List<Element> subClassMembers = getChildren(subClass, name); |
| 110 _addClassMembers(result, subClassMembers); | 105 for (Element member in subClassMembers) { |
| 106 if (member is ClassMemberElement) { |
| 107 result.add(member); |
| 108 } |
| 109 } |
| 111 } | 110 } |
| 112 }); | 111 }); |
| 113 futures.add(membersFuture); | 112 futures.add(membersFuture); |
| 114 } | 113 } |
| 115 return Future.wait(futures).then((_) { | 114 return Future.wait(futures).then((_) { |
| 116 return result; | 115 return result; |
| 117 }); | 116 }); |
| 118 } | 117 } |
| 119 | 118 |
| 120 /** | |
| 121 * Adds [ClassMemberElement]s from [elements] to [result]. | |
| 122 */ | |
| 123 void _addClassMembers(Set<ClassMemberElement> result, List<Element> elements) { | |
| 124 for (Element member in elements) { | |
| 125 if (member is ClassMemberElement) { | |
| 126 result.add(member); | |
| 127 } | |
| 128 } | |
| 129 } | |
| 130 | |
| 131 | 119 |
| 132 /** | 120 /** |
| 133 * Returns non-synthetic members of the given [ClassElement] and its super | 121 * Returns non-synthetic members of the given [ClassElement] and its super |
| 134 * classes. | 122 * classes. |
| 135 * | 123 * |
| 136 * Includes: fields, accessors and methods. | 124 * Includes: fields, accessors and methods. |
| 137 * Excludes: constructors and synthetic elements. | 125 * Excludes: constructors and synthetic elements. |
| 138 */ | 126 */ |
| 139 List<Element> getMembers(ClassElement clazz) { | 127 List<Element> getMembers(ClassElement clazz) { |
| 140 List<Element> members = <Element>[]; | 128 List<Element> members = <Element>[]; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 214 * its variable, otherwise returns [element]. | 202 * its variable, otherwise returns [element]. |
| 215 */ | 203 */ |
| 216 Element getSyntheticAccessorVariable(Element element) { | 204 Element getSyntheticAccessorVariable(Element element) { |
| 217 if (element is PropertyAccessorElement) { | 205 if (element is PropertyAccessorElement) { |
| 218 if (element.isSynthetic) { | 206 if (element.isSynthetic) { |
| 219 return element.variable; | 207 return element.variable; |
| 220 } | 208 } |
| 221 } | 209 } |
| 222 return element; | 210 return element; |
| 223 } | 211 } |
| OLD | NEW |