Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: pkg/analysis_server/lib/src/services/search/hierarchy.dart

Issue 2564913002: Implement SearchEngine.searchAllSubtypes() with the analysis driver. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698