| 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 197fa38bce00628b7ace0a6159eba3fe8656ce06..40ee04f4758bf6e7cbee9922715dbeb9262a6e98 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
|
| @@ -8,11 +8,11 @@ import 'dart:async';
|
|
|
| import 'package:analysis_server/src/protocol.dart';
|
| import 'package:analysis_server/src/services/completion/completion_manager.dart';
|
| -import 'package:analysis_server/src/services/search/search_engine.dart';
|
| import 'package:analysis_server/src/services/completion/imported_type_computer.dart';
|
| import 'package:analysis_server/src/services/completion/invocation_computer.dart';
|
| import 'package:analysis_server/src/services/completion/keyword_computer.dart';
|
| import 'package:analysis_server/src/services/completion/local_computer.dart';
|
| +import 'package:analysis_server/src/services/search/search_engine.dart';
|
| import 'package:analyzer/src/generated/ast.dart';
|
| import 'package:analyzer/src/generated/element.dart';
|
| import 'package:analyzer/src/generated/engine.dart';
|
| @@ -73,6 +73,9 @@ class DartCompletionManager extends CompletionManager {
|
| CompilationUnit unit = context.parseCompilationUnit(source);
|
| request.unit = unit;
|
| request.node = new NodeLocator.con1(offset).searchWithin(unit);
|
| + if (request.node != null) {
|
| + request.node.accept(new _ReplacementOffsetBuilder(request));
|
| + }
|
| computers.removeWhere((DartCompletionComputer c) => c.computeFast(request));
|
| sendResults(computers.isEmpty);
|
| }
|
| @@ -119,7 +122,11 @@ class DartCompletionManager extends CompletionManager {
|
| */
|
| void sendResults(bool last) {
|
| controller.add(
|
| - new CompletionResult(request.offset, 0, request.suggestions, last));
|
| + new CompletionResult(
|
| + request.replacementOffset,
|
| + request.replacementLength,
|
| + request.suggestions,
|
| + last));
|
| if (last) {
|
| controller.close();
|
| }
|
| @@ -182,6 +189,22 @@ class DartCompletionRequest {
|
| AstNode node;
|
|
|
| /**
|
| + * The offset of the start of the text to be replaced.
|
| + * This will be different than the offset used to request the completion
|
| + * suggestions if there was a portion of an identifier before the original
|
| + * offset. In particular, the replacementOffset will be the offset of the
|
| + * beginning of said identifier.
|
| + */
|
| + int replacementOffset;
|
| +
|
| + /**
|
| + * The length of the text to be replaced if the remainder of the identifier
|
| + * containing the cursor is to be replaced when the suggestion is applied
|
| + * (that is, the number of characters in the existing identifier).
|
| + */
|
| + int replacementLength;
|
| +
|
| + /**
|
| * The list of suggestions to be sent to the client.
|
| */
|
| final List<CompletionSuggestion> suggestions = [];
|
| @@ -189,3 +212,21 @@ class DartCompletionRequest {
|
| DartCompletionRequest(this.context, this.searchEngine, this.source,
|
| this.offset);
|
| }
|
| +
|
| +/**
|
| + * Visitor used to determine the replacement offset and length
|
| + * based upon the cursor location.
|
| + */
|
| +class _ReplacementOffsetBuilder extends SimpleAstVisitor {
|
| + final DartCompletionRequest request;
|
| +
|
| + _ReplacementOffsetBuilder(this.request) {
|
| + request.replacementOffset = request.offset;
|
| + request.replacementLength = 0;
|
| + }
|
| +
|
| + visitSimpleIdentifier(SimpleIdentifier node) {
|
| + request.replacementOffset = node.offset;
|
| + request.replacementLength = node.length;
|
| + }
|
| +}
|
|
|