| 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 aefb37dabd758b42d4635e3f4996045bd1a0df7f..e6a8c7adc3a93237c24ae4abba988dff23df3a62 100644
|
| --- a/pkg/analysis_server/lib/src/domain_completion.dart
|
| +++ b/pkg/analysis_server/lib/src/domain_completion.dart
|
| @@ -12,7 +12,9 @@ import 'package:analysis_server/src/constants.dart';
|
| import 'package:analysis_server/src/provisional/completion/completion_core.dart';
|
| import 'package:analysis_server/src/services/completion/completion_core.dart';
|
| import 'package:analysis_server/src/services/completion/completion_performance.dart';
|
| -import 'package:analyzer/src/generated/engine.dart';
|
| +import 'package:analyzer/src/dart/analysis/driver.dart';
|
| +import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
|
| +import 'package:analyzer/src/source/source_resource.dart';
|
| import 'package:analyzer/src/generated/source.dart';
|
|
|
| /**
|
| @@ -102,23 +104,14 @@ class CompletionDomainHandler implements RequestHandler {
|
|
|
| @override
|
| Response handleRequest(Request request) {
|
| - if (server.options.enableNewAnalysisDriver) {
|
| - // TODO(scheglov) implement for the new analysis driver
|
| - String completionId = (_nextCompletionId++).toString();
|
| - new Future(() {
|
| - sendCompletionNotification(completionId, 0, 0, []);
|
| - });
|
| - return new CompletionGetSuggestionsResult(completionId)
|
| - .toResponse(request.id);
|
| - }
|
| if (server.searchEngine == null) {
|
| return new Response.noIndexGenerated(request);
|
| }
|
| - return runZoned(() {
|
| + runZoned(() {
|
| try {
|
| String requestName = request.method;
|
| if (requestName == COMPLETION_GET_SUGGESTIONS) {
|
| - return processRequest(request);
|
| + processRequest(request);
|
| }
|
| } on RequestFailure catch (exception) {
|
| return exception.response;
|
| @@ -130,35 +123,67 @@ class CompletionDomainHandler implements RequestHandler {
|
| exception,
|
| stackTrace);
|
| });
|
| + return Response.DELAYED_RESPONSE;
|
| }
|
|
|
| /**
|
| * Process a `completion.getSuggestions` request.
|
| */
|
| - Response processRequest(Request request) {
|
| + Future<Null> processRequest(Request request) async {
|
| performance = new CompletionPerformance();
|
|
|
| // extract and validate params
|
| CompletionGetSuggestionsParams params =
|
| new CompletionGetSuggestionsParams.fromRequest(request);
|
| - ContextSourcePair contextSource = server.getContextSourcePair(params.file);
|
| - AnalysisContext context = contextSource.context;
|
| - Source source = contextSource.source;
|
| - if (context == null || !context.exists(source)) {
|
| - return new Response.unknownSource(request);
|
| - }
|
| - TimestampedData<String> contents = context.getContents(source);
|
| - if (params.offset < 0 || params.offset > contents.data.length) {
|
| - return new Response.invalidParameter(
|
| - request,
|
| - 'params.offset',
|
| - 'Expected offset between 0 and source length inclusive,'
|
| - ' but found ${params.offset}');
|
| +
|
| + AnalysisResult result;
|
| + AnalysisContext context;
|
| + Source source;
|
| + if (server.options.enableNewAnalysisDriver) {
|
| + result = await server.getAnalysisResult(params.file);
|
| +
|
| + if (result == null) {
|
| + server.sendResponse(new Response.unknownSource(request));
|
| + return;
|
| + }
|
| +
|
| + if (params.offset < 0 || params.offset > result.content.length) {
|
| + server.sendResponse(new Response.invalidParameter(
|
| + request,
|
| + 'params.offset',
|
| + 'Expected offset between 0 and source length inclusive,'
|
| + ' but found ${params.offset}'));
|
| + return;
|
| + }
|
| +
|
| + source = new FileSource(
|
| + server.resourceProvider.getFile(result.path), result.uri);
|
| + } else {
|
| + ContextSourcePair contextSource =
|
| + server.getContextSourcePair(params.file);
|
| +
|
| + context = contextSource.context;
|
| + source = contextSource.source;
|
| + if (context == null || !context.exists(source)) {
|
| + server.sendResponse(new Response.unknownSource(request));
|
| + return;
|
| + }
|
| +
|
| + TimestampedData<String> contents = context.getContents(source);
|
| + if (params.offset < 0 || params.offset > contents.data.length) {
|
| + server.sendResponse(new Response.invalidParameter(
|
| + request,
|
| + 'params.offset',
|
| + 'Expected offset between 0 and source length inclusive,'
|
| + ' but found ${params.offset}'));
|
| + return;
|
| + }
|
| }
|
|
|
| recordRequest(performance, context, source, params.offset);
|
|
|
| CompletionRequestImpl completionRequest = new CompletionRequestImpl(
|
| + result,
|
| context,
|
| server.resourceProvider,
|
| server.searchEngine,
|
| @@ -170,6 +195,10 @@ class CompletionDomainHandler implements RequestHandler {
|
| _abortCurrentRequest();
|
| _currentRequest = completionRequest;
|
|
|
| + // initial response without results
|
| + server.sendResponse(new CompletionGetSuggestionsResult(completionId)
|
| + .toResponse(request.id));
|
| +
|
| // Compute suggestions in the background
|
| computeSuggestions(completionRequest).then((CompletionResult result) {
|
| const SEND_NOTIFICATION_TAG = 'send notification';
|
| @@ -188,10 +217,6 @@ class CompletionDomainHandler implements RequestHandler {
|
| _currentRequest = null;
|
| }
|
| });
|
| -
|
| - // initial response without results
|
| - return new CompletionGetSuggestionsResult(completionId)
|
| - .toResponse(request.id);
|
| }
|
|
|
| /**
|
|
|