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 |