| 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 c188b7c8b2f081a7d1050b4df6d6a93964448554..759a74156949c829c095fd69c3c5df376af2c122 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
|
| @@ -68,11 +68,6 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| Source _librarySource;
|
|
|
| /**
|
| - * The cached completion target or `null` if not computed yet.
|
| - */
|
| - CompletionTarget _target;
|
| -
|
| - /**
|
| * The [DartType] for Object in dart:core
|
| */
|
| InterfaceType _objectType;
|
| @@ -83,6 +78,12 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| */
|
| bool _haveResolveDeclarationsInScope = false;
|
|
|
| + @override
|
| + Expression dotTarget;
|
| +
|
| + @override
|
| + CompletionTarget target;
|
| +
|
| /**
|
| * Initialize a newly created completion request based on the given request.
|
| */
|
| @@ -102,6 +103,7 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| Source source,
|
| int offset)
|
| : super(context, resourceProvider, searchEngine, source, offset) {
|
| + _updateTargets(context.computeResult(source, PARSED_UNIT));
|
| if (target.unit.directives.any((d) => d is PartOfDirective)) {
|
| List<Source> libraries = context.getLibrariesContaining(source);
|
| if (libraries.isNotEmpty) {
|
| @@ -136,15 +138,6 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| }
|
|
|
| @override
|
| - CompletionTarget get target {
|
| - if (_target == null) {
|
| - CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
|
| - _target = new CompletionTarget.forOffset(unit, offset);
|
| - }
|
| - return _target;
|
| - }
|
| -
|
| - @override
|
| Future<CompilationUnit> resolveDeclarationsInScope() async {
|
| CompilationUnit unit = target.unit;
|
| if (_haveResolveDeclarationsInScope) {
|
| @@ -172,7 +165,7 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| }
|
|
|
| // Recompute the target for the newly resolved unit
|
| - _target = new CompletionTarget.forOffset(resolvedUnit, offset);
|
| + _updateTargets(resolvedUnit);
|
| _haveResolveDeclarationsInScope = true;
|
| return resolvedUnit;
|
| }
|
| @@ -183,12 +176,11 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| if (_librarySource == source) {
|
| libUnit = await resolveDeclarationsInScope();
|
| } else if (_librarySource != null) {
|
| - libUnit =
|
| - await new AnalysisFutureHelper<CompilationUnit>(
|
| - context,
|
| - new LibrarySpecificUnit(_librarySource, _librarySource),
|
| - RESOLVED_UNIT3)
|
| - .computeAsync();
|
| + libUnit = await new AnalysisFutureHelper<CompilationUnit>(
|
| + context,
|
| + new LibrarySpecificUnit(_librarySource, _librarySource),
|
| + RESOLVED_UNIT3)
|
| + .computeAsync();
|
| }
|
| return libUnit?.directives;
|
| }
|
| @@ -219,7 +211,35 @@ class DartCompletionRequestImpl extends CompletionRequestImpl
|
| }
|
|
|
| // Recompute the target for the newly resolved unit
|
| - _target = new CompletionTarget.forOffset(resolvedUnit, offset);
|
| + _updateTargets(resolvedUnit);
|
| _haveResolveDeclarationsInScope = true;
|
| }
|
| +
|
| + /**
|
| + * Update the completion [target] and [dotTarget] based on the given [unit].
|
| + */
|
| + void _updateTargets(CompilationUnit unit) {
|
| + dotTarget = null;
|
| + target = new CompletionTarget.forOffset(unit, offset);
|
| + AstNode node = target.containingNode;
|
| + if (node is MethodInvocation) {
|
| + if (identical(node.methodName, target.entity)) {
|
| + dotTarget = node.realTarget;
|
| + } else if (node.isCascaded && node.operator.offset + 1 == target.offset) {
|
| + dotTarget = node.realTarget;
|
| + }
|
| + }
|
| + if (node is PropertyAccess) {
|
| + if (identical(node.propertyName, target.entity)) {
|
| + dotTarget = node.realTarget;
|
| + } else if (node.isCascaded && node.operator.offset + 1 == target.offset) {
|
| + dotTarget = node.realTarget;
|
| + }
|
| + }
|
| + if (node is PrefixedIdentifier) {
|
| + if (identical(node.identifier, target.entity)) {
|
| + dotTarget = node.prefix;
|
| + }
|
| + }
|
| + }
|
| }
|
|
|