| 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 * @return all implementations of the given {@link ClassMemberElement} is its su
perclasses and | 77 * Returns all the declarations of the given [ClassMemberElement] in |
| 78 * their subclasses. | 78 * superclasses of the declaring class, and its subclasses if not [onlySuper]. |
| 79 */ | 79 */ |
| 80 Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine, | 80 Future<Set<ClassMemberElement>> getHierarchyMembers(SearchEngine searchEngine, |
| 81 ClassMemberElement member) { | 81 ClassMemberElement member, bool onlySuper) { |
| 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); |
| 95 // ignore if super- class does not declare member | 96 // ignore if super- class does not declare member |
| 96 if (getClassMembers(superClass, name).isEmpty) { | 97 if (superClassMembers.isEmpty) { |
| 98 continue; |
| 99 } |
| 100 // add super- class members |
| 101 _addClassMembers(result, superClassMembers); |
| 102 if (onlySuper) { |
| 97 continue; | 103 continue; |
| 98 } | 104 } |
| 99 // check all sub- classes | 105 // check all sub- classes |
| 100 var subClassFuture = getSubClasses(searchEngine, superClass); | 106 var subClassFuture = getSubClasses(searchEngine, superClass); |
| 101 var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) { | 107 var membersFuture = subClassFuture.then((Set<ClassElement> subClasses) { |
| 102 subClasses.add(superClass); | |
| 103 for (ClassElement subClass in subClasses) { | 108 for (ClassElement subClass in subClasses) { |
| 104 List<Element> subClassMembers = getChildren(subClass, name); | 109 List<Element> subClassMembers = getChildren(subClass, name); |
| 105 for (Element member in subClassMembers) { | 110 _addClassMembers(result, subClassMembers); |
| 106 if (member is ClassMemberElement) { | |
| 107 result.add(member); | |
| 108 } | |
| 109 } | |
| 110 } | 111 } |
| 111 }); | 112 }); |
| 112 futures.add(membersFuture); | 113 futures.add(membersFuture); |
| 113 } | 114 } |
| 114 return Future.wait(futures).then((_) { | 115 return Future.wait(futures).then((_) { |
| 115 return result; | 116 return result; |
| 116 }); | 117 }); |
| 117 } | 118 } |
| 118 | 119 |
| 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 |
| 119 | 131 |
| 120 /** | 132 /** |
| 121 * Returns non-synthetic members of the given [ClassElement] and its super | 133 * Returns non-synthetic members of the given [ClassElement] and its super |
| 122 * classes. | 134 * classes. |
| 123 * | 135 * |
| 124 * Includes: fields, accessors and methods. | 136 * Includes: fields, accessors and methods. |
| 125 * Excludes: constructors and synthetic elements. | 137 * Excludes: constructors and synthetic elements. |
| 126 */ | 138 */ |
| 127 List<Element> getMembers(ClassElement clazz) { | 139 List<Element> getMembers(ClassElement clazz) { |
| 128 List<Element> members = <Element>[]; | 140 List<Element> members = <Element>[]; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 * its variable, otherwise returns [element]. | 214 * its variable, otherwise returns [element]. |
| 203 */ | 215 */ |
| 204 Element getSyntheticAccessorVariable(Element element) { | 216 Element getSyntheticAccessorVariable(Element element) { |
| 205 if (element is PropertyAccessorElement) { | 217 if (element is PropertyAccessorElement) { |
| 206 if (element.isSynthetic) { | 218 if (element.isSynthetic) { |
| 207 return element.variable; | 219 return element.variable; |
| 208 } | 220 } |
| 209 } | 221 } |
| 210 return element; | 222 return element; |
| 211 } | 223 } |
| OLD | NEW |