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

Side by Side Diff: pkg/analysis_server/lib/src/services/completion/suggestion_builder.dart

Issue 684183002: Refactor CompletionSuggestionKind (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: merge Created 6 years, 1 month 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 | Annotate | Revision Log
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.completion.suggestion.builder; 5 library services.completion.suggestion.builder;
6 6
7 import 'package:analysis_server/src/protocol_server.dart' as protocol; 7 import 'package:analysis_server/src/protocol_server.dart' as protocol;
8 import 'package:analysis_server/src/protocol_server.dart' hide Element, 8 import 'package:analysis_server/src/protocol_server.dart' hide Element,
9 ElementKind; 9 ElementKind;
10 import 'package:analysis_server/src/services/completion/dart_completion_manager. dart'; 10 import 'package:analysis_server/src/services/completion/dart_completion_manager. dart';
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 } 89 }
90 90
91 /** 91 /**
92 * This class visits elements in a class and provides suggestions based upon 92 * This class visits elements in a class and provides suggestions based upon
93 * the visible members in that class. Clients should call 93 * the visible members in that class. Clients should call
94 * [ClassElementSuggestionBuilder.suggestionsFor]. 94 * [ClassElementSuggestionBuilder.suggestionsFor].
95 */ 95 */
96 class ClassElementSuggestionBuilder extends _AbstractSuggestionBuilder { 96 class ClassElementSuggestionBuilder extends _AbstractSuggestionBuilder {
97 final bool staticOnly; 97 final bool staticOnly;
98 98
99 ClassElementSuggestionBuilder(DartCompletionRequest request, {bool staticOnly: 99 ClassElementSuggestionBuilder(DartCompletionRequest request, bool staticOnly)
100 false}) 100 : super(request, CompletionSuggestionKind.INVOCATION),
101 : super(request),
102 this.staticOnly = staticOnly; 101 this.staticOnly = staticOnly;
103 102
104 @override 103 @override
105 visitClassElement(ClassElement element) { 104 visitClassElement(ClassElement element) {
106 element.visitChildren(this); 105 element.visitChildren(this);
107 element.allSupertypes.forEach((InterfaceType type) { 106 element.allSupertypes.forEach((InterfaceType type) {
108 type.element.visitChildren(this); 107 type.element.visitChildren(this);
109 }); 108 });
110 } 109 }
111 110
112 @override 111 @override
113 visitElement(Element element) { 112 visitElement(Element element) {
114 // ignored 113 // ignored
115 } 114 }
116 115
117 @override 116 @override
118 visitFieldElement(FieldElement element) { 117 visitFieldElement(FieldElement element) {
119 if (staticOnly && !element.isStatic) { 118 if (staticOnly && !element.isStatic) {
120 return; 119 return;
121 } 120 }
122 _addElementSuggestion( 121 _addElementSuggestion(element, element.type, element.enclosingElement);
123 element,
124 CompletionSuggestionKind.GETTER,
125 element.type,
126 element.enclosingElement);
127 } 122 }
128 123
129 @override 124 @override
130 visitMethodElement(MethodElement element) { 125 visitMethodElement(MethodElement element) {
131 if (staticOnly && !element.isStatic) { 126 if (staticOnly && !element.isStatic) {
132 return; 127 return;
133 } 128 }
134 if (element.isOperator) { 129 if (element.isOperator) {
135 return; 130 return;
136 } 131 }
137 _addElementSuggestion( 132 _addElementSuggestion(
138 element, 133 element,
139 CompletionSuggestionKind.METHOD,
140 element.returnType, 134 element.returnType,
141 element.enclosingElement); 135 element.enclosingElement);
142 } 136 }
143 137
144 @override 138 @override
145 visitPropertyAccessorElement(PropertyAccessorElement element) { 139 visitPropertyAccessorElement(PropertyAccessorElement element) {
146 if (staticOnly && !element.isStatic) { 140 if (staticOnly && !element.isStatic) {
147 return; 141 return;
148 } 142 }
149 if (element.isGetter) { 143 if (element.isGetter) {
150 _addElementSuggestion( 144 _addElementSuggestion(
151 element, 145 element,
152 CompletionSuggestionKind.GETTER,
153 element.returnType, 146 element.returnType,
154 element.enclosingElement); 147 element.enclosingElement);
155 } else if (element.isSetter) { 148 } else if (element.isSetter) {
156 _addElementSuggestion( 149 _addElementSuggestion(
157 element, 150 element,
158 CompletionSuggestionKind.SETTER,
159 element.returnType, 151 element.returnType,
160 element.enclosingElement); 152 element.enclosingElement);
161 } 153 }
162 } 154 }
163 155
164 /** 156 /**
165 * Add suggestions for the visible members in the given class 157 * Add suggestions for the visible members in the given class
166 */ 158 */
167 static void suggestionsFor(DartCompletionRequest request, Element element) { 159 static void suggestionsFor(DartCompletionRequest request, Element element,
160 {bool staticOnly: false}) {
168 if (element is ClassElement) { 161 if (element is ClassElement) {
169 return element.accept(new ClassElementSuggestionBuilder(request)); 162 return element.accept(
163 new ClassElementSuggestionBuilder(request, staticOnly));
170 } 164 }
171 } 165 }
172
173 /**
174 * Add suggestions for the visible static members in the given class
175 */
176 static void staticSuggestionsFor(DartCompletionRequest request,
177 ClassElement element) {
178 return element.accept(
179 new ClassElementSuggestionBuilder(request, staticOnly: true));
180 }
181 } 166 }
182 167
183 /** 168 /**
184 * This class visits elements in a library and provides suggestions based upon 169 * This class visits elements in a library and provides suggestions based upon
185 * the visible members in that library. Clients should call 170 * the visible members in that library. Clients should call
186 * [LibraryElementSuggestionBuilder.suggestionsFor]. 171 * [LibraryElementSuggestionBuilder.suggestionsFor].
187 */ 172 */
188 class LibraryElementSuggestionBuilder extends _AbstractSuggestionBuilder { 173 class LibraryElementSuggestionBuilder extends _AbstractSuggestionBuilder {
189 174
190 LibraryElementSuggestionBuilder(DartCompletionRequest request) 175 LibraryElementSuggestionBuilder(DartCompletionRequest request,
191 : super(request); 176 CompletionSuggestionKind kind)
177 : super(request, kind);
192 178
193 @override 179 @override
194 visitClassElement(ClassElement element) { 180 visitClassElement(ClassElement element) {
195 _addElementSuggestion(element, CompletionSuggestionKind.CLASS, null, null); 181 _addElementSuggestion(element, null, null);
196 } 182 }
197 183
198 @override 184 @override
199 visitCompilationUnitElement(CompilationUnitElement element) { 185 visitCompilationUnitElement(CompilationUnitElement element) {
200 element.visitChildren(this); 186 element.visitChildren(this);
201 } 187 }
202 188
203 @override 189 @override
204 visitElement(Element element) { 190 visitElement(Element element) {
205 // ignored 191 // ignored
206 } 192 }
207 193
208 @override 194 @override
209 visitFunctionElement(FunctionElement element) { 195 visitFunctionElement(FunctionElement element) {
210 _addElementSuggestion( 196 _addElementSuggestion(element, element.returnType, null);
211 element,
212 CompletionSuggestionKind.FUNCTION,
213 element.returnType,
214 null);
215 } 197 }
216 198
217 @override 199 @override
218 visitFunctionTypeAliasElement(FunctionTypeAliasElement element) { 200 visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
219 _addElementSuggestion( 201 _addElementSuggestion(element, element.returnType, null);
220 element,
221 CompletionSuggestionKind.FUNCTION_TYPE_ALIAS,
222 element.returnType,
223 null);
224 } 202 }
225 203
226 @override 204 @override
227 visitTopLevelVariableElement(TopLevelVariableElement element) { 205 visitTopLevelVariableElement(TopLevelVariableElement element) {
228 _addElementSuggestion( 206 _addElementSuggestion(element, element.type, null);
229 element,
230 CompletionSuggestionKind.TOP_LEVEL_VARIABLE,
231 element.type,
232 null);
233 } 207 }
234 208
235 /** 209 /**
236 * Add suggestions for the visible members in the given library 210 * Add suggestions for the visible members in the given library
237 */ 211 */
238 static void suggestionsFor(DartCompletionRequest request, 212 static void suggestionsFor(DartCompletionRequest request,
239 LibraryElement library) { 213 CompletionSuggestionKind kind, LibraryElement library) {
240 if (library != null) { 214 if (library != null) {
241 library.visitChildren(new LibraryElementSuggestionBuilder(request)); 215 library.visitChildren(new LibraryElementSuggestionBuilder(request, kind));
242 } 216 }
243 } 217 }
244 } 218 }
245 219
246 /** 220 /**
247 * This class visits elements in a class and provides suggestions based upon 221 * This class visits elements in a class and provides suggestions based upon
248 * the visible named constructors in that class. Clients should call 222 * the visible named constructors in that class. Clients should call
249 * [NamedConstructorSuggestionBuilder.suggestionsFor]. 223 * [NamedConstructorSuggestionBuilder.suggestionsFor].
250 */ 224 */
251 class NamedConstructorSuggestionBuilder extends _AbstractSuggestionBuilder { 225 class NamedConstructorSuggestionBuilder extends _AbstractSuggestionBuilder {
252 226
253 NamedConstructorSuggestionBuilder(DartCompletionRequest request) 227 NamedConstructorSuggestionBuilder(DartCompletionRequest request)
254 : super(request); 228 : super(request, CompletionSuggestionKind.INVOCATION);
255 229
256 @override 230 @override
257 visitClassElement(ClassElement element) { 231 visitClassElement(ClassElement element) {
258 element.visitChildren(this); 232 element.visitChildren(this);
259 } 233 }
260 234
261 @override 235 @override
262 visitConstructorElement(ConstructorElement element) { 236 visitConstructorElement(ConstructorElement element) {
263 _addElementSuggestion( 237 _addElementSuggestion(
264 element, 238 element,
265 CompletionSuggestionKind.CONSTRUCTOR,
266 element.returnType, 239 element.returnType,
267 element.enclosingElement); 240 element.enclosingElement);
268 } 241 }
269 242
270 @override 243 @override
271 visitElement(Element element) { 244 visitElement(Element element) {
272 // ignored 245 // ignored
273 } 246 }
274 247
275 /** 248 /**
276 * Add suggestions for the visible members in the given class 249 * Add suggestions for the visible members in the given class
277 */ 250 */
278 static void suggestionsFor(DartCompletionRequest request, Element element) { 251 static void suggestionsFor(DartCompletionRequest request, Element element) {
279 if (element is ClassElement) { 252 if (element is ClassElement) {
280 element.accept(new NamedConstructorSuggestionBuilder(request)); 253 element.accept(new NamedConstructorSuggestionBuilder(request));
281 } 254 }
282 } 255 }
283 } 256 }
284 257
285 /** 258 /**
286 * Common superclass for sharing behavior 259 * Common superclass for sharing behavior
287 */ 260 */
288 class _AbstractSuggestionBuilder extends GeneralizingElementVisitor { 261 class _AbstractSuggestionBuilder extends GeneralizingElementVisitor {
289 final DartCompletionRequest request; 262 final DartCompletionRequest request;
263 final CompletionSuggestionKind kind;
290 final Set<String> _completions = new Set<String>(); 264 final Set<String> _completions = new Set<String>();
291 265
292 _AbstractSuggestionBuilder(this.request); 266 _AbstractSuggestionBuilder(this.request, this.kind);
293 267
294 void _addElementSuggestion(Element element, CompletionSuggestionKind kind, 268 void _addElementSuggestion(Element element, DartType type,
295 DartType type, ClassElement enclosingElement) { 269 ClassElement enclosingElement) {
296 if (element.isSynthetic) { 270 if (element.isSynthetic) {
297 return; 271 return;
298 } 272 }
299 if (element.isPrivate) { 273 if (element.isPrivate) {
300 LibraryElement elementLibrary = element.library; 274 LibraryElement elementLibrary = element.library;
301 LibraryElement unitLibrary = request.unit.element.library; 275 LibraryElement unitLibrary = request.unit.element.library;
302 if (elementLibrary != unitLibrary) { 276 if (elementLibrary != unitLibrary) {
303 return; 277 return;
304 } 278 }
305 } 279 }
(...skipping 24 matching lines...) Expand all
330 } 304 }
331 if (type != null) { 305 if (type != null) {
332 String typeName = type.displayName; 306 String typeName = type.displayName;
333 if (typeName != null && typeName.length > 0 && typeName != 'dynamic') { 307 if (typeName != null && typeName.length > 0 && typeName != 'dynamic') {
334 suggestion.returnType = typeName; 308 suggestion.returnType = typeName;
335 } 309 }
336 } 310 }
337 request.suggestions.add(suggestion); 311 request.suggestions.add(suggestion);
338 } 312 }
339 } 313 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698