| Index: pkg/analysis_server/lib/src/analysis_server.dart
|
| diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
|
| index 99a0f7d72a862f6f1c9c18bbcfce92b568d69420..99f3724d6d46884b8ad1bb1a3c76a5fe56cbaaa6 100644
|
| --- a/pkg/analysis_server/lib/src/analysis_server.dart
|
| +++ b/pkg/analysis_server/lib/src/analysis_server.dart
|
| @@ -16,8 +16,6 @@ import 'package:analysis_server/src/analysis_logger.dart';
|
| import 'package:analysis_server/src/channel/channel.dart';
|
| import 'package:analysis_server/src/computer/new_notifications.dart';
|
| import 'package:analysis_server/src/context_manager.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.dart';
|
| import 'package:analysis_server/src/operation/operation_analysis.dart';
|
| import 'package:analysis_server/src/operation/operation_queue.dart';
|
| @@ -1764,21 +1762,23 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
|
| if (analysisServer.priorityFiles.contains(result.path)) {
|
| analysisServer.priorityFileResults[result.path] = result;
|
| }
|
| - new_sendErrorNotification(analysisServer, result);
|
| + _runDelayed(() {
|
| + new_sendErrorNotification(analysisServer, result);
|
| + });
|
| CompilationUnit unit = result.unit;
|
| if (unit != null) {
|
| if (analysisServer._hasAnalysisServiceSubscription(
|
| AnalysisService.HIGHLIGHTS, result.path)) {
|
| - sendAnalysisNotificationHighlights(analysisServer, result.path, unit);
|
| + _runDelayed(() {
|
| + sendAnalysisNotificationHighlights(
|
| + analysisServer, result.path, unit);
|
| + });
|
| }
|
| if (analysisServer._hasAnalysisServiceSubscription(
|
| AnalysisService.NAVIGATION, result.path)) {
|
| - NavigationCollectorImpl collector = new NavigationCollectorImpl();
|
| - computeSimpleDartNavigation(collector, unit);
|
| - collector.createRegions();
|
| - var params = new AnalysisNavigationParams(result.path,
|
| - collector.regions, collector.targets, collector.files);
|
| - analysisServer.sendNotification(params.toNotification());
|
| + _runDelayed(() {
|
| + new_sendDartNotificationNavigation(analysisServer, result);
|
| + });
|
| }
|
| }
|
| // TODO(scheglov) Implement more notifications.
|
| @@ -1896,6 +1896,25 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
|
| .add(new ContextsChangedEvent(changed: [context]));
|
| analysisServer.schedulePerformAnalysisOperation(context);
|
| }
|
| +
|
| + /**
|
| + * Run [f] in a new [Future].
|
| + *
|
| + * This method is used to delay sending notifications. If there is a more
|
| + * important consumer of an analysis results, specifically a code completion
|
| + * computer, we want it to run before spending time of sending notifications.
|
| + *
|
| + * TODO(scheglov) Consider replacing this with full priority based scheduler.
|
| + *
|
| + * TODO(scheglov) Alternatively, if code completion work in a way that does
|
| + * not produce (at first) fully resolved unit, but only part of it - a single
|
| + * method, or a top-level declaration, we would not have this problem - the
|
| + * completion computer would be the only consumer of the partial analysis
|
| + * result.
|
| + */
|
| + void _runDelayed(f()) {
|
| + new Future(f);
|
| + }
|
| }
|
|
|
| /**
|
|
|