| 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 80 ClassElement memberClass = member.enclosingElement; | 80 ClassElement memberClass = member.enclosingElement; |
| 81 Set<ClassElement> searchClasses = getSuperClasses(memberClass); | 81 Set<ClassElement> searchClasses = getSuperClasses(memberClass); |
| 82 searchClasses.add(memberClass); | 82 searchClasses.add(memberClass); |
| 83 for (ClassElement superClass in searchClasses) { | 83 for (ClassElement superClass in searchClasses) { |
| 84 // ignore if super- class does not declare member | 84 // ignore if super- class does not declare member |
| 85 if (getClassMembers(superClass, name).isEmpty) { | 85 if (getClassMembers(superClass, name).isEmpty) { |
| 86 continue; | 86 continue; |
| 87 } | 87 } |
| 88 // check all sub- classes | 88 // check all sub- classes |
| 89 Set<ClassElement> subClasses = | 89 Set<ClassElement> subClasses = |
| 90 await getSubClasses(searchEngine, superClass); | 90 await searchEngine.searchAllSubtypes(superClass); |
| 91 subClasses.add(superClass); | 91 subClasses.add(superClass); |
| 92 for (ClassElement subClass in subClasses) { | 92 for (ClassElement subClass in subClasses) { |
| 93 List<Element> subClassMembers = getChildren(subClass, name); | 93 List<Element> subClassMembers = getChildren(subClass, name); |
| 94 for (Element member in subClassMembers) { | 94 for (Element member in subClassMembers) { |
| 95 if (member is ClassMemberElement) { | 95 if (member is ClassMemberElement) { |
| 96 result.add(member); | 96 result.add(member); |
| 97 } | 97 } |
| 98 } | 98 } |
| 99 } | 99 } |
| 100 } | 100 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 112 List<Element> members = <Element>[]; | 112 List<Element> members = <Element>[]; |
| 113 members.addAll(getClassMembers(clazz)); | 113 members.addAll(getClassMembers(clazz)); |
| 114 Set<ClassElement> superClasses = getSuperClasses(clazz); | 114 Set<ClassElement> superClasses = getSuperClasses(clazz); |
| 115 for (ClassElement superClass in superClasses) { | 115 for (ClassElement superClass in superClasses) { |
| 116 members.addAll(getClassMembers(superClass)); | 116 members.addAll(getClassMembers(superClass)); |
| 117 } | 117 } |
| 118 return members; | 118 return members; |
| 119 } | 119 } |
| 120 | 120 |
| 121 /** | 121 /** |
| 122 * Returns a [Set] with all direct and indirect subclasses of [seed]. | |
| 123 */ | |
| 124 Future<Set<ClassElement>> getSubClasses( | |
| 125 SearchEngine searchEngine, ClassElement seed) async { | |
| 126 List<SearchMatch> matches = await searchEngine.searchAllSubtypes(seed); | |
| 127 return matches.map((match) => match.element).toSet(); | |
| 128 } | |
| 129 | |
| 130 /** | |
| 131 * Returns a [Set] with all direct and indirect superclasses of [seed]. | 122 * Returns a [Set] with all direct and indirect superclasses of [seed]. |
| 132 */ | 123 */ |
| 133 Set<ClassElement> getSuperClasses(ClassElement seed) { | 124 Set<ClassElement> getSuperClasses(ClassElement seed) { |
| 134 Set<ClassElement> result = new HashSet<ClassElement>(); | 125 Set<ClassElement> result = new HashSet<ClassElement>(); |
| 135 // prepare queue | 126 // prepare queue |
| 136 List<ClassElement> queue = new List<ClassElement>(); | 127 List<ClassElement> queue = new List<ClassElement>(); |
| 137 queue.add(seed); | 128 queue.add(seed); |
| 138 // process queue | 129 // process queue |
| 139 while (!queue.isEmpty) { | 130 while (!queue.isEmpty) { |
| 140 ClassElement current = queue.removeLast(); | 131 ClassElement current = queue.removeLast(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 164 * its variable, otherwise returns [element]. | 155 * its variable, otherwise returns [element]. |
| 165 */ | 156 */ |
| 166 Element getSyntheticAccessorVariable(Element element) { | 157 Element getSyntheticAccessorVariable(Element element) { |
| 167 if (element is PropertyAccessorElement) { | 158 if (element is PropertyAccessorElement) { |
| 168 if (element.isSynthetic) { | 159 if (element.isSynthetic) { |
| 169 return element.variable; | 160 return element.variable; |
| 170 } | 161 } |
| 171 } | 162 } |
| 172 return element; | 163 return element; |
| 173 } | 164 } |
| OLD | NEW |