Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1100)

Unified Diff: pkg/analysis_server/lib/src/analysis_server.dart

Issue 2713533003: Initial integration of NotificationManager into server (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 c46ca601bcaf58b953ed6a55469a612f8cab6ed7..24e1b53fe5561e79ac6b7a048016ab146242a126 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -14,12 +14,21 @@ import 'package:analysis_server/plugin/protocol/protocol.dart'
hide AnalysisOptions, Element;
import 'package:analysis_server/src/analysis_logger.dart';
import 'package:analysis_server/src/channel/channel.dart';
+import 'package:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/computer/computer_highlights2.dart';
+import 'package:analysis_server/src/computer/computer_outline.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/domains/analysis/occurrences.dart';
+import 'package:analysis_server/src/domains/analysis/occurrences_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';
+import 'package:analysis_server/src/plugin/notification_manager.dart';
import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:analysis_server/src/protocol_server.dart' as server;
import 'package:analysis_server/src/server/diagnostic_server.dart';
import 'package:analysis_server/src/services/correction/namespace.dart';
import 'package:analysis_server/src/services/index/index.dart';
@@ -113,6 +122,13 @@ class AnalysisServer {
final ServerCommunicationChannel channel;
/**
+ * The object used to manage sending a subset of notifications to the client.
+ * The subset of notifications are those to which plugins may contribute.
+ * This field is `null` when the new plugin support is disabled.
+ */
+ final NotificationManager notificationManager = null;
+
+ /**
* The [ResourceProvider] using which paths are converted into [Resource]s.
*/
final ResourceProvider resourceProvider;
@@ -1847,33 +1863,76 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
ContextBuilder builder = createContextBuilder(folder, options);
nd.AnalysisDriver analysisDriver = builder.buildDriver(folder.path);
analysisDriver.results.listen((result) {
- new_sendErrorNotification(analysisServer, result);
+ NotificationManager notificationManager =
+ analysisServer.notificationManager;
String path = result.path;
+ if (notificationManager != null) {
+ notificationManager.recordAnalysisErrors(
+ NotificationManager.serverId,
+ path,
+ server.doAnalysisError_listFromEngine(
+ result.driver.analysisOptions, result.lineInfo, result.errors));
+ } else {
+ new_sendErrorNotification(analysisServer, result);
+ }
CompilationUnit unit = result.unit;
if (unit != null) {
- if (analysisServer._hasAnalysisServiceSubscription(
- AnalysisService.HIGHLIGHTS, path)) {
- _runDelayed(() {
- sendAnalysisNotificationHighlights(analysisServer, path, unit);
- });
- }
- if (analysisServer._hasAnalysisServiceSubscription(
- AnalysisService.NAVIGATION, path)) {
- _runDelayed(() {
- new_sendDartNotificationNavigation(analysisServer, result);
- });
- }
- if (analysisServer._hasAnalysisServiceSubscription(
- AnalysisService.OCCURRENCES, path)) {
- _runDelayed(() {
- new_sendDartNotificationOccurrences(analysisServer, result);
- });
- }
- if (analysisServer._hasAnalysisServiceSubscription(
- AnalysisService.OVERRIDES, path)) {
- _runDelayed(() {
- sendAnalysisNotificationOverrides(analysisServer, path, unit);
- });
+ if (notificationManager != null) {
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.HIGHLIGHTS, path)) {
+ _runDelayed(() {
+ notificationManager.recordHighlightRegions(
+ NotificationManager.serverId,
+ path,
+ _computeHighlightRegions(unit));
+ });
+ }
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.NAVIGATION, path)) {
+ _runDelayed(() {
+ notificationManager.recordNavigationParams(
+ NotificationManager.serverId,
+ path,
+ _computeNavigationParams(path, unit));
+ });
+ }
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.OCCURRENCES, path)) {
+ _runDelayed(() {
+ notificationManager.recordOccurrences(
+ NotificationManager.serverId,
+ path,
+ _computeOccurrences(unit));
+ });
+ }
+// if (analysisServer._hasAnalysisServiceSubscription(
+// AnalysisService.OUTLINE, path)) {
+// _runDelayed(() {
+// // TODO(brianwilkerson) Change NotificationManager to store params
+// // so that fileKind and libraryName can be recorded / passed along.
+// notificationManager.recordOutlines(NotificationManager.serverId,
+// path, _computeOutlineParams(path, unit, result.lineInfo));
+// });
+// }
+ } else {
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.HIGHLIGHTS, path)) {
+ _runDelayed(() {
+ sendAnalysisNotificationHighlights(analysisServer, path, unit);
+ });
+ }
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.NAVIGATION, path)) {
+ _runDelayed(() {
+ new_sendDartNotificationNavigation(analysisServer, result);
+ });
+ }
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.OCCURRENCES, path)) {
+ _runDelayed(() {
+ new_sendDartNotificationOccurrences(analysisServer, result);
+ });
+ }
}
if (analysisServer._hasAnalysisServiceSubscription(
AnalysisService.OUTLINE, path)) {
@@ -1886,9 +1945,14 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
analysisServer, path, result.lineInfo, sourceKind, unit);
});
}
+ if (analysisServer._hasAnalysisServiceSubscription(
+ AnalysisService.OVERRIDES, path)) {
+ _runDelayed(() {
+ sendAnalysisNotificationOverrides(analysisServer, path, unit);
+ });
+ }
+ // TODO(scheglov) Implement notifications for AnalysisService.IMPLEMENTED.
}
- // TODO(scheglov) Implement more notifications.
- // IMPLEMENTED
});
analysisDriver.exceptions.listen((nd.ExceptionResult result) {
String message = 'Analysis failed: ${result.path}';
@@ -2020,6 +2084,65 @@ class ServerContextManagerCallbacks extends ContextManagerCallbacks {
analysisServer.schedulePerformAnalysisOperation(context);
}
+ List<server.HighlightRegion> _computeHighlightRegions(CompilationUnit unit) {
+ if (analysisServer.options.useAnalysisHighlight2) {
+ return new DartUnitHighlightsComputer2(unit).compute();
+ } else {
+ return new DartUnitHighlightsComputer(unit).compute();
+ }
+ }
+
+ String _computeLibraryName(CompilationUnit unit) {
+ for (Directive directive in unit.directives) {
+ if (directive is LibraryDirective && directive.name != null) {
+ return directive.name.name;
+ }
+ }
+ for (Directive directive in unit.directives) {
+ if (directive is PartOfDirective && directive.libraryName != null) {
+ return directive.libraryName.name;
+ }
+ }
+ return null;
+ }
+
+ server.AnalysisNavigationParams _computeNavigationParams(
+ String path, CompilationUnit unit) {
+ NavigationCollectorImpl collector = new NavigationCollectorImpl();
+ computeDartNavigation(collector, unit, null, null);
+ collector.createRegions();
+ return new server.AnalysisNavigationParams(
+ path, collector.regions, collector.targets, collector.files);
+ }
+
+ List<Occurrences> _computeOccurrences(CompilationUnit unit) {
+ OccurrencesCollectorImpl collector = new OccurrencesCollectorImpl();
+ addDartOccurrences(collector, unit);
+ return collector.allOccurrences;
+ }
+
+ server.AnalysisOutlineParams _computeOutlineParams(
+ String path, CompilationUnit unit, LineInfo lineInfo) {
+ // compute FileKind
+ SourceKind sourceKind = unit.directives.any((d) => d is PartOfDirective)
+ ? SourceKind.PART
+ : SourceKind.LIBRARY;
+ server.FileKind fileKind = server.FileKind.LIBRARY;
+ if (sourceKind == SourceKind.LIBRARY) {
+ fileKind = server.FileKind.LIBRARY;
+ } else if (sourceKind == SourceKind.PART) {
+ fileKind = server.FileKind.PART;
+ }
+ // compute library name
+ String libraryName = _computeLibraryName(unit);
+ // compute Outline
+ DartUnitOutlineComputer computer =
+ new DartUnitOutlineComputer(path, lineInfo, unit);
+ server.Outline outline = computer.compute();
+ return new server.AnalysisOutlineParams(path, fileKind, outline,
+ libraryName: libraryName);
+ }
+
/**
* Run [f] in a new [Future].
*
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698