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

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

Issue 1303343008: Extension point for AnalysisResultListener(s). (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Replace with SetAnalysisDomain() function. Created 5 years, 3 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
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 655ca2fc571b7f81554ebb302bbe81888f09cb50..5dd9feb36d3ad3edcf75194702f2b0764fdeedd8 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -7,16 +7,23 @@ library domain.analysis;
import 'dart:async';
import 'dart:core' hide Resource;
+import 'package:analysis_server/analysis/analysis_domain.dart';
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/domains/analysis/navigation.dart';
+import 'package:analysis_server/src/operation/operation_analysis.dart'
+ show sendAnalysisNotificationNavigation;
import 'package:analysis_server/src/protocol_server.dart';
import 'package:analysis_server/src/services/dependencies/library_dependencies.dart';
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/engine.dart' as engine;
+import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/task/model.dart' show ResultDescriptor;
/**
* Instances of the class [AnalysisDomainHandler] implement a [RequestHandler]
@@ -31,7 +38,9 @@ class AnalysisDomainHandler implements RequestHandler {
/**
* Initialize a newly created handler to handle requests for the given [server].
*/
- AnalysisDomainHandler(this.server);
+ AnalysisDomainHandler(this.server) {
+ _callAnalysisDomainReceivers();
+ }
/**
* Implement the `analysis.getErrors` request.
@@ -290,4 +299,72 @@ class AnalysisDomainHandler implements RequestHandler {
server.updateOptions(updaters);
return new AnalysisUpdateOptionsResult().toResponse(request.id);
}
+
+ /**
+ * Call all the registered [SetAnalysisDomain] functions.
+ */
+ void _callAnalysisDomainReceivers() {
+ AnalysisDomain analysisDomain = new AnalysisDomainImpl(server);
+ for (SetAnalysisDomain function
+ in server.serverPlugin.setAnalysisDomainFunctions) {
+ try {
+ function(analysisDomain);
+ } catch (exception, stackTrace) {
+ engine.AnalysisEngine.instance.logger.logError(
+ 'Exception from analysis domain receiver: ${function.runtimeType}',
+ new CaughtException(exception, stackTrace));
+ }
+ }
+ }
+}
+
+/**
+ * An implementation of [AnalysisDomain] for [AnalysisServer].
+ */
+class AnalysisDomainImpl implements AnalysisDomain {
+ final AnalysisServer server;
+
+ final Map<ResultDescriptor,
+ StreamController<engine.ComputedResult>> controllers =
+ <ResultDescriptor, StreamController<engine.ComputedResult>>{};
+
+ AnalysisDomainImpl(this.server) {
+ server.onContextsChanged.listen((ContextsChangedEvent event) {
+ event.added.forEach(_subscribeForContext);
+ });
+ }
+
+ @override
+ Stream<engine.ComputedResult> onResultComputed(ResultDescriptor descriptor) {
+ Stream<engine.ComputedResult> stream = controllers
+ .putIfAbsent(descriptor,
+ () => new StreamController<engine.ComputedResult>.broadcast())
+ .stream;
+ server.getAnalysisContexts().forEach(_subscribeForContext);
+ return stream;
+ }
+
+ @override
+ void scheduleNotification(
+ engine.AnalysisContext context, Source source, AnalysisService service) {
+ // TODO(scheglov) schedule, don't do it right now
+ String file = source.fullName;
+ if (server.hasAnalysisSubscription(service, file)) {
+ if (service == AnalysisService.NAVIGATION) {
+ sendAnalysisNotificationNavigation(server, context, source);
+ }
+ }
+ }
+
+ void _subscribeForContext(engine.AnalysisContext context) {
+ for (ResultDescriptor descriptor in controllers.keys) {
+ context.onResultComputed(descriptor).listen((result) {
+ StreamController<engine.ComputedResult> controller =
+ controllers[result.descriptor];
+ if (controller != null) {
+ controller.add(result);
+ }
+ });
+ }
+ }
}

Powered by Google App Engine
This is Rietveld 408576698