| Index: pkg/analysis_server/lib/src/domain_analysis.dart
|
| diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
|
| index df1be9bca86e321063b8623fe3d3843392ab342c..512a2a9ea4f9ebae08c25b8c5dd9e799a10607d6 100644
|
| --- a/pkg/analysis_server/lib/src/domain_analysis.dart
|
| +++ b/pkg/analysis_server/lib/src/domain_analysis.dart
|
| @@ -10,11 +10,14 @@ import 'package:analysis_server/src/analysis_server.dart';
|
| import 'package:analysis_server/src/computer/computer_hover.dart';
|
| import 'package:analysis_server/src/constants.dart';
|
| import 'package:analysis_server/src/context_manager.dart';
|
| +import 'package:analysis_server/src/domain_abstract.dart';
|
| import 'package:analysis_server/src/domains/analysis/navigation.dart';
|
| import 'package:analysis_server/src/domains/analysis/navigation_dart.dart';
|
| import 'package:analysis_server/src/operation/operation_analysis.dart'
|
| show NavigationOperation, OccurrencesOperation;
|
| +import 'package:analysis_server/src/plugin/plugin_manager.dart';
|
| import 'package:analysis_server/src/plugin/request_converter.dart';
|
| +import 'package:analysis_server/src/plugin/result_merger.dart';
|
| import 'package:analysis_server/src/protocol/protocol_internal.dart';
|
| import 'package:analysis_server/src/protocol_server.dart';
|
| import 'package:analysis_server/src/services/dependencies/library_dependencies.dart';
|
| @@ -28,21 +31,20 @@ import 'package:analyzer/src/dart/analysis/driver.dart';
|
| import 'package:analyzer/src/generated/engine.dart' as engine;
|
| import 'package:analyzer/src/generated/source.dart';
|
| import 'package:analyzer/task/model.dart' show ResultDescriptor;
|
| +import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
|
| +import 'package:analyzer_plugin/protocol/protocol_common.dart';
|
| +import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
|
| +import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
|
|
|
| /**
|
| * Instances of the class [AnalysisDomainHandler] implement a [RequestHandler]
|
| * that handles requests in the `analysis` domain.
|
| */
|
| -class AnalysisDomainHandler implements RequestHandler {
|
| - /**
|
| - * The analysis server that is using this handler to process requests.
|
| - */
|
| - final AnalysisServer server;
|
| -
|
| +class AnalysisDomainHandler extends AbstractRequestHandler {
|
| /**
|
| * Initialize a newly created handler to handle requests for the given [server].
|
| */
|
| - AnalysisDomainHandler(this.server) {
|
| + AnalysisDomainHandler(AnalysisServer server) : super(server) {
|
| _callAnalysisDomainReceivers();
|
| }
|
|
|
| @@ -158,22 +160,66 @@ class AnalysisDomainHandler implements RequestHandler {
|
| Future<Null> getNavigation(Request request) async {
|
| var params = new AnalysisGetNavigationParams.fromRequest(request);
|
| String file = params.file;
|
| + int offset = params.offset;
|
| + int length = params.length;
|
|
|
| if (server.options.enableNewAnalysisDriver) {
|
| AnalysisDriver driver = server.getAnalysisDriver(file);
|
| if (driver == null) {
|
| server.sendResponse(new Response.getNavigationInvalidFile(request));
|
| } else {
|
| + //
|
| + // Allow plugins to start computing navigation data.
|
| + //
|
| + plugin.AnalysisGetNavigationParams requestParams =
|
| + new plugin.AnalysisGetNavigationParams(file, offset, length);
|
| + Map<PluginInfo, Future<plugin.Response>> pluginFutures = server
|
| + .pluginManager
|
| + .broadcastRequest(requestParams, contextRoot: driver.contextRoot);
|
| + //
|
| + // Compute navigation data generated by server.
|
| + //
|
| + List<AnalysisNavigationParams> allResults =
|
| + <AnalysisNavigationParams>[];
|
| AnalysisResult result = await server.getAnalysisResult(file);
|
| CompilationUnit unit = result?.unit;
|
| - if (unit == null || !result.exists) {
|
| - server.sendResponse(new Response.getNavigationInvalidFile(request));
|
| - } else {
|
| + if (unit != null && result.exists) {
|
| NavigationCollectorImpl collector = new NavigationCollectorImpl();
|
| - computeDartNavigation(collector, unit, params.offset, params.length);
|
| + computeDartNavigation(collector, unit, offset, length);
|
| collector.createRegions();
|
| + allResults.add(new AnalysisNavigationParams(
|
| + file, collector.regions, collector.targets, collector.files));
|
| + }
|
| + //
|
| + // Add the navigation data produced by plugins to the server-generated
|
| + // navigation data.
|
| + //
|
| + if (pluginFutures != null) {
|
| + List<plugin.Response> responses = await waitForResponses(
|
| + pluginFutures,
|
| + requestParameters: requestParams);
|
| + for (plugin.Response response in responses) {
|
| + plugin.AnalysisGetNavigationResult result =
|
| + new plugin.AnalysisGetNavigationResult.fromResponse(response);
|
| + allResults.add(new AnalysisNavigationParams(
|
| + file, result.regions, result.targets, result.files));
|
| + }
|
| + }
|
| + //
|
| + // Return the result.
|
| + //
|
| + ResultMerger merger = new ResultMerger();
|
| + AnalysisNavigationParams mergedResults =
|
| + merger.mergeNavigation(allResults);
|
| + if (mergedResults == null) {
|
| + server.sendResponse(new AnalysisGetNavigationResult(
|
| + <String>[], <NavigationTarget>[], <NavigationRegion>[])
|
| + .toResponse(request.id));
|
| + } else {
|
| server.sendResponse(new AnalysisGetNavigationResult(
|
| - collector.files, collector.targets, collector.regions)
|
| + mergedResults.files,
|
| + mergedResults.targets,
|
| + mergedResults.regions)
|
| .toResponse(request.id));
|
| }
|
| }
|
|
|