From 4d8ceb01a12bcbf39a3653d7253dd69d32e871cc Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Mon, 31 Oct 2016 11:04:49 -0700 Subject: [PATCH] Send highlight and navigation notifications on result. R=brianwilkerson@google.com BUG= Review URL: https://codereview.chromium.org/2469453002 . --- .../lib/src/analysis_server.dart | 41 +++++++++++-------- .../src/domains/analysis/navigation_dart.dart | 10 +++++ 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart index b0396660bf8..81bc1d947cf 100644 --- a/pkg/analysis_server/lib/src/analysis_server.dart +++ b/pkg/analysis_server/lib/src/analysis_server.dart @@ -16,6 +16,8 @@ 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'; @@ -1103,7 +1105,8 @@ class AnalysisServer { void setAnalysisSubscriptions( Map> subscriptions) { if (options.enableNewAnalysisDriver) { - // TODO(scheglov) implement for the new analysis driver + this.analysisServices = subscriptions; + // TODO(scheglov) send notifications for new files return; } // send notifications for already analyzed sources @@ -1541,6 +1544,10 @@ class AnalysisServer { }); } + bool _hasAnalysisServiceSubscription(AnalysisService service, String file) { + return analysisServices[service]?.contains(file) ?? false; + } + _scheduleAnalysisImplementedNotification() async { Set files = analysisServices[AnalysisService.IMPLEMENTED]; if (files != null) { @@ -1691,27 +1698,27 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks { }); analysisDriver.results.listen((result) { new_sendErrorNotification(analysisServer, result); + CompilationUnit unit = result.unit; + if (unit != null) { + if (analysisServer._hasAnalysisServiceSubscription( + AnalysisService.HIGHLIGHTS, result.path)) { + 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()); + } + } // TODO(scheglov) Implement more notifications. - // HIGHLIGHTS // IMPLEMENTED - // NAVIGATION // OVERRIDES // OCCURRENCES (not used in IDEA) // OUTLINE (not used in IDEA) -// { -// var unit = result.unit; -// if (unit != null) { -// print('[results][${analysisDriver.name}] ${result.path}'); -// sendAnalysisNotificationHighlights(analysisServer, result.path, unit); -// { -// NavigationCollectorImpl collector = -// computeSimpleDartNavigation(unit); -// var params = new protocol.AnalysisNavigationParams(result.path, -// collector.regions, collector.targets, collector.files); -// analysisServer.sendNotification(params.toNotification()); -// } -// } -// } }); analysisServer.driverMap[folder] = analysisDriver; return analysisDriver; diff --git a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart index 7a7a870e9b8..1ae319369aa 100644 --- a/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart +++ b/pkg/analysis_server/lib/src/domains/analysis/navigation_dart.dart @@ -15,6 +15,16 @@ import 'package:analyzer/src/dart/element/element.dart'; import 'package:analyzer/src/generated/engine.dart'; import 'package:analyzer/src/generated/source.dart'; +NavigationCollector computeSimpleDartNavigation( + NavigationCollector collector, CompilationUnit unit) { + _DartNavigationCollector dartCollector = + new _DartNavigationCollector(collector); + _DartNavigationComputerVisitor visitor = + new _DartNavigationComputerVisitor(dartCollector); + unit.accept(visitor); + return collector; +} + /** * A computer for navigation regions in a Dart [CompilationUnit]. */