| 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.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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |