| Index: pkg/analysis_server/lib/src/domain_completion.dart
|
| diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
|
| index 916b20e7f4e4f2a72b50166864c236d1d00a4c1c..0bc5c9c0403c031eb7714b7eebdf1bbefe19f06a 100644
|
| --- a/pkg/analysis_server/lib/src/domain_completion.dart
|
| +++ b/pkg/analysis_server/lib/src/domain_completion.dart
|
| @@ -91,7 +91,6 @@ class CompletionDomainHandler implements RequestHandler {
|
| }
|
| performance.logElapseTime(contributorTag);
|
| }
|
| -
|
| performance.logElapseTime(COMPUTE_SUGGESTIONS_TAG);
|
|
|
| // TODO (danrubel) if request is obsolete
|
| @@ -139,8 +138,15 @@ class CompletionDomainHandler implements RequestHandler {
|
| result = await server.getAnalysisResult(params.file);
|
|
|
| if (result == null || !result.exists) {
|
| - server.sendResponse(new Response.unknownSource(request));
|
| - return;
|
| + if (server.onNoAnalysisCompletion != null) {
|
| + String completionId = (_nextCompletionId++).toString();
|
| + await server.onNoAnalysisCompletion(
|
| + request, this, params, performance, completionId);
|
| + return;
|
| + } else {
|
| + server.sendResponse(new Response.unknownSource(request));
|
| + return;
|
| + }
|
| }
|
|
|
| if (params.offset < 0 || params.offset > result.content.length) {
|
| @@ -187,10 +193,10 @@ class CompletionDomainHandler implements RequestHandler {
|
| params.offset,
|
| performance,
|
| server.ideOptions);
|
| +
|
| String completionId = (_nextCompletionId++).toString();
|
|
|
| - _abortCurrentRequest();
|
| - _currentRequest = completionRequest;
|
| + setNewRequest(completionRequest);
|
|
|
| // initial response without results
|
| server.sendResponse(new CompletionGetSuggestionsResult(completionId)
|
| @@ -203,19 +209,27 @@ class CompletionDomainHandler implements RequestHandler {
|
| sendCompletionNotification(completionId, result.replacementOffset,
|
| result.replacementLength, result.suggestions);
|
| performance.logElapseTime(SEND_NOTIFICATION_TAG);
|
| -
|
| performance.notificationCount = 1;
|
| performance.logFirstNotificationComplete('notification 1 complete');
|
| performance.suggestionCountFirst = result.suggestions.length;
|
| performance.suggestionCountLast = result.suggestions.length;
|
| performance.complete();
|
| }).whenComplete(() {
|
| - if (_currentRequest == completionRequest) {
|
| - _currentRequest = null;
|
| - }
|
| + ifMatchesRequestClear(completionRequest);
|
| });
|
| }
|
|
|
| + void setNewRequest(CompletionRequest completionRequest) {
|
| + _abortCurrentRequest();
|
| + _currentRequest = completionRequest;
|
| + }
|
| +
|
| + void ifMatchesRequestClear(CompletionRequest completionRequest) {
|
| + if (_currentRequest == completionRequest) {
|
| + _currentRequest = null;
|
| + }
|
| + }
|
| +
|
| /**
|
| * If tracking code completion performance over time, then
|
| * record addition information about the request in the performance record.
|
|
|