| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.dart.manager; | 5 library services.completion.dart.manager; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 10 import 'package:analysis_server/src/provisional/completion/completion_core.dart' | 10 import 'package:analysis_server/src/provisional/completion/completion_core.dart' |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 53 return suggestions; | 53 return suggestions; |
| 54 } | 54 } |
| 55 } | 55 } |
| 56 | 56 |
| 57 /** | 57 /** |
| 58 * The information about a requested list of completions within a Dart file. | 58 * The information about a requested list of completions within a Dart file. |
| 59 */ | 59 */ |
| 60 class DartCompletionRequestImpl extends CompletionRequestImpl | 60 class DartCompletionRequestImpl extends CompletionRequestImpl |
| 61 implements DartCompletionRequest { | 61 implements DartCompletionRequest { |
| 62 /** | 62 /** |
| 63 * The source for the library containing the completion request. |
| 64 * This may be different from the source in which the completion is requested |
| 65 * if the completion is being requested in a part file. |
| 66 * This may be `null` if the library for a part file cannot be determined. |
| 67 */ |
| 68 Source _librarySource; |
| 69 |
| 70 /** |
| 63 * The cached completion target or `null` if not computed yet. | 71 * The cached completion target or `null` if not computed yet. |
| 64 */ | 72 */ |
| 65 CompletionTarget _target; | 73 CompletionTarget _target; |
| 66 | 74 |
| 67 /** | 75 /** |
| 68 * The [DartType] for Object in dart:core | 76 * The [DartType] for Object in dart:core |
| 69 */ | 77 */ |
| 70 InterfaceType _objectType; | 78 InterfaceType _objectType; |
| 71 | 79 |
| 72 /** | 80 /** |
| (...skipping 13 matching lines...) Expand all Loading... |
| 86 request.source, | 94 request.source, |
| 87 request.offset); | 95 request.offset); |
| 88 } | 96 } |
| 89 | 97 |
| 90 DartCompletionRequestImpl._( | 98 DartCompletionRequestImpl._( |
| 91 AnalysisContext context, | 99 AnalysisContext context, |
| 92 ResourceProvider resourceProvider, | 100 ResourceProvider resourceProvider, |
| 93 SearchEngine searchEngine, | 101 SearchEngine searchEngine, |
| 94 Source source, | 102 Source source, |
| 95 int offset) | 103 int offset) |
| 96 : super(context, resourceProvider, searchEngine, source, offset); | 104 : super(context, resourceProvider, searchEngine, source, offset) { |
| 105 if (target.unit.directives.any((d) => d is PartOfDirective)) { |
| 106 List<Source> libraries = context.getLibrariesContaining(source); |
| 107 if (libraries.isNotEmpty) { |
| 108 _librarySource = libraries[0]; |
| 109 } |
| 110 } else { |
| 111 _librarySource = source; |
| 112 } |
| 113 } |
| 97 | 114 |
| 98 @override | 115 @override |
| 99 Future<LibraryElement> get libraryElement async { | 116 Future<LibraryElement> get libraryElement async { |
| 100 //TODO(danrubel) build the library element rather than all the declarations | 117 //TODO(danrubel) build the library element rather than all the declarations |
| 101 CompilationUnit unit = await resolveDeclarationsInScope(); | 118 CompilationUnit unit = await resolveDeclarationsInScope(); |
| 102 if (unit != null) { | 119 if (unit != null) { |
| 103 CompilationUnitElement elem = unit.element; | 120 CompilationUnitElement elem = unit.element; |
| 104 if (elem != null) { | 121 if (elem != null) { |
| 105 return elem.library; | 122 return elem.library; |
| 106 } | 123 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 127 return _target; | 144 return _target; |
| 128 } | 145 } |
| 129 | 146 |
| 130 @override | 147 @override |
| 131 Future<CompilationUnit> resolveDeclarationsInScope() async { | 148 Future<CompilationUnit> resolveDeclarationsInScope() async { |
| 132 CompilationUnit unit = target.unit; | 149 CompilationUnit unit = target.unit; |
| 133 if (_haveResolveDeclarationsInScope) { | 150 if (_haveResolveDeclarationsInScope) { |
| 134 return unit; | 151 return unit; |
| 135 } | 152 } |
| 136 | 153 |
| 137 // Determine the library source | 154 // Gracefully degrade if librarySource cannot be determined |
| 138 Source librarySource; | 155 if (_librarySource == null) { |
| 139 if (unit.directives.any((d) => d is PartOfDirective)) { | 156 return null; |
| 140 List<Source> libraries = context.getLibrariesContaining(source); | |
| 141 if (libraries.isEmpty) { | |
| 142 return null; | |
| 143 } | |
| 144 librarySource = libraries[0]; | |
| 145 } else { | |
| 146 librarySource = source; | |
| 147 } | 157 } |
| 148 | 158 |
| 149 // Resolve declarations in the target unit | 159 // Resolve declarations in the target unit |
| 150 CompilationUnit resolvedUnit = | 160 CompilationUnit resolvedUnit = |
| 151 await new AnalysisFutureHelper<CompilationUnit>( | 161 await new AnalysisFutureHelper<CompilationUnit>(context, |
| 152 context, | 162 new LibrarySpecificUnit(_librarySource, source), RESOLVED_UNIT3) |
| 153 new LibrarySpecificUnit(librarySource, source), | 163 .computeAsync(); |
| 154 RESOLVED_UNIT3).computeAsync(); | |
| 155 | 164 |
| 156 // TODO(danrubel) determine if the underlying source has been modified | 165 // TODO(danrubel) determine if the underlying source has been modified |
| 157 // in a way that invalidates the completion request | 166 // in a way that invalidates the completion request |
| 158 // and return null | 167 // and return null |
| 159 | 168 |
| 160 // Gracefully degrade if unit cannot be resolved | 169 // Gracefully degrade if unit cannot be resolved |
| 161 if (resolvedUnit == null) { | 170 if (resolvedUnit == null) { |
| 162 return null; | 171 return null; |
| 163 } | 172 } |
| 164 | 173 |
| 165 // Recompute the target for the newly resolved unit | 174 // Recompute the target for the newly resolved unit |
| 166 _target = new CompletionTarget.forOffset(resolvedUnit, offset); | 175 _target = new CompletionTarget.forOffset(resolvedUnit, offset); |
| 167 _haveResolveDeclarationsInScope = true; | 176 _haveResolveDeclarationsInScope = true; |
| 168 return resolvedUnit; | 177 return resolvedUnit; |
| 169 } | 178 } |
| 170 | 179 |
| 171 @override | 180 @override |
| 181 Future<List<Directive>> resolveDirectives() async { |
| 182 CompilationUnit libUnit; |
| 183 if (_librarySource == source) { |
| 184 libUnit = await resolveDeclarationsInScope(); |
| 185 } else if (_librarySource != null) { |
| 186 libUnit = |
| 187 await new AnalysisFutureHelper<CompilationUnit>( |
| 188 context, |
| 189 new LibrarySpecificUnit(_librarySource, _librarySource), |
| 190 RESOLVED_UNIT3) |
| 191 .computeAsync(); |
| 192 } |
| 193 return libUnit?.directives; |
| 194 } |
| 195 |
| 196 @override |
| 172 Future resolveExpression(Expression expression) async { | 197 Future resolveExpression(Expression expression) async { |
| 173 //TODO(danrubel) resolve the expression or containing method | 198 //TODO(danrubel) resolve the expression or containing method |
| 174 // rather than the entire complilation unit | 199 // rather than the entire complilation unit |
| 175 | 200 |
| 176 CompilationUnit unit = target.unit; | 201 // Gracefully degrade if librarySource cannot be determined |
| 177 | 202 if (_librarySource == null) { |
| 178 // Determine the library source | 203 return null; |
| 179 Source librarySource; | |
| 180 if (unit.directives.any((d) => d is PartOfDirective)) { | |
| 181 List<Source> libraries = context.getLibrariesContaining(source); | |
| 182 if (libraries.isEmpty) { | |
| 183 return; | |
| 184 } | |
| 185 librarySource = libraries[0]; | |
| 186 } else { | |
| 187 librarySource = source; | |
| 188 } | 204 } |
| 189 | 205 |
| 190 // Resolve declarations in the target unit | 206 // Resolve declarations in the target unit |
| 191 CompilationUnit resolvedUnit = | 207 CompilationUnit resolvedUnit = |
| 192 await new AnalysisFutureHelper<CompilationUnit>( | 208 await new AnalysisFutureHelper<CompilationUnit>(context, |
| 193 context, | 209 new LibrarySpecificUnit(_librarySource, source), RESOLVED_UNIT) |
| 194 new LibrarySpecificUnit(librarySource, source), | 210 .computeAsync(); |
| 195 RESOLVED_UNIT).computeAsync(); | |
| 196 | 211 |
| 197 // TODO(danrubel) determine if the underlying source has been modified | 212 // TODO(danrubel) determine if the underlying source has been modified |
| 198 // in a way that invalidates the completion request | 213 // in a way that invalidates the completion request |
| 199 // and return null | 214 // and return null |
| 200 | 215 |
| 201 // Gracefully degrade if unit cannot be resolved | 216 // Gracefully degrade if unit cannot be resolved |
| 202 if (resolvedUnit == null) { | 217 if (resolvedUnit == null) { |
| 203 return; | 218 return null; |
| 204 } | 219 } |
| 205 | 220 |
| 206 // Recompute the target for the newly resolved unit | 221 // Recompute the target for the newly resolved unit |
| 207 _target = new CompletionTarget.forOffset(resolvedUnit, offset); | 222 _target = new CompletionTarget.forOffset(resolvedUnit, offset); |
| 208 _haveResolveDeclarationsInScope = true; | 223 _haveResolveDeclarationsInScope = true; |
| 209 } | 224 } |
| 210 } | 225 } |
| OLD | NEW |