| 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);
|
| + 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
|
|
|