Chromium Code Reviews| Index: pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart |
| diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart |
| index 3ecbd3eecc4e478c5dcc5ef8dfb1140a87d60457..c188b7c8b2f081a7d1050b4df6d6a93964448554 100644 |
| --- a/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart |
| +++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_manager.dart |
| @@ -60,6 +60,14 @@ class DartCompletionManager implements CompletionContributor { |
| class DartCompletionRequestImpl extends CompletionRequestImpl |
| implements DartCompletionRequest { |
| /** |
| + * The source for the library containing the completion request. |
| + * This may be different from the source in which the completion is requested |
| + * if the completion is being requested in a part file. |
| + * This may be `null` if the library for a part file cannot be determined. |
| + */ |
| + Source _librarySource; |
| + |
| + /** |
| * The cached completion target or `null` if not computed yet. |
| */ |
| CompletionTarget _target; |
| @@ -93,7 +101,16 @@ class DartCompletionRequestImpl extends CompletionRequestImpl |
| SearchEngine searchEngine, |
| Source source, |
| int offset) |
| - : super(context, resourceProvider, searchEngine, source, offset); |
| + : super(context, resourceProvider, searchEngine, source, offset) { |
| + if (target.unit.directives.any((d) => d is PartOfDirective)) { |
| + List<Source> libraries = context.getLibrariesContaining(source); |
|
scheglov
2015/12/09 19:24:17
context.getLibrariesContaining(source) already ret
danrubel
2015/12/09 19:32:41
Correct... if that information is cached. I don't
|
| + if (libraries.isNotEmpty) { |
| + _librarySource = libraries[0]; |
| + } |
| + } else { |
| + _librarySource = source; |
| + } |
| + } |
| @override |
| Future<LibraryElement> get libraryElement async { |
| @@ -134,24 +151,16 @@ class DartCompletionRequestImpl extends CompletionRequestImpl |
| return unit; |
| } |
| - // Determine the library source |
| - Source librarySource; |
| - if (unit.directives.any((d) => d is PartOfDirective)) { |
| - List<Source> libraries = context.getLibrariesContaining(source); |
| - if (libraries.isEmpty) { |
| - return null; |
| - } |
| - librarySource = libraries[0]; |
| - } else { |
| - librarySource = source; |
| + // Gracefully degrade if librarySource cannot be determined |
| + if (_librarySource == null) { |
| + return null; |
| } |
| // Resolve declarations in the target unit |
| CompilationUnit resolvedUnit = |
| - await new AnalysisFutureHelper<CompilationUnit>( |
| - context, |
| - new LibrarySpecificUnit(librarySource, source), |
| - RESOLVED_UNIT3).computeAsync(); |
| + await new AnalysisFutureHelper<CompilationUnit>(context, |
| + new LibrarySpecificUnit(_librarySource, source), RESOLVED_UNIT3) |
| + .computeAsync(); |
| // TODO(danrubel) determine if the underlying source has been modified |
| // in a way that invalidates the completion request |
| @@ -169,30 +178,36 @@ class DartCompletionRequestImpl extends CompletionRequestImpl |
| } |
| @override |
| + Future<List<Directive>> resolveDirectives() async { |
| + CompilationUnit libUnit; |
| + if (_librarySource == source) { |
| + libUnit = await resolveDeclarationsInScope(); |
| + } else if (_librarySource != null) { |
| + libUnit = |
| + await new AnalysisFutureHelper<CompilationUnit>( |
| + context, |
| + new LibrarySpecificUnit(_librarySource, _librarySource), |
| + RESOLVED_UNIT3) |
| + .computeAsync(); |
| + } |
| + return libUnit?.directives; |
| + } |
| + |
| + @override |
| Future resolveExpression(Expression expression) async { |
| //TODO(danrubel) resolve the expression or containing method |
| // rather than the entire complilation unit |
| - CompilationUnit unit = target.unit; |
| - |
| - // Determine the library source |
| - Source librarySource; |
| - if (unit.directives.any((d) => d is PartOfDirective)) { |
| - List<Source> libraries = context.getLibrariesContaining(source); |
| - if (libraries.isEmpty) { |
| - return; |
| - } |
| - librarySource = libraries[0]; |
| - } else { |
| - librarySource = source; |
| + // Gracefully degrade if librarySource cannot be determined |
| + if (_librarySource == null) { |
| + return null; |
| } |
| // Resolve declarations in the target unit |
| CompilationUnit resolvedUnit = |
| - await new AnalysisFutureHelper<CompilationUnit>( |
| - context, |
| - new LibrarySpecificUnit(librarySource, source), |
| - RESOLVED_UNIT).computeAsync(); |
| + await new AnalysisFutureHelper<CompilationUnit>(context, |
| + new LibrarySpecificUnit(_librarySource, source), RESOLVED_UNIT) |
| + .computeAsync(); |
| // TODO(danrubel) determine if the underlying source has been modified |
| // in a way that invalidates the completion request |
| @@ -200,7 +215,7 @@ class DartCompletionRequestImpl extends CompletionRequestImpl |
| // Gracefully degrade if unit cannot be resolved |
| if (resolvedUnit == null) { |
| - return; |
| + return null; |
| } |
| // Recompute the target for the newly resolved unit |