| 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 384387f2b82355d9013c5f404812a90ec8194ba2..d23fe8fa45a4ae9cbecb6295ae9f7f51069851ea 100644
|
| --- a/pkg/analysis_server/lib/src/analysis_server.dart
|
| +++ b/pkg/analysis_server/lib/src/analysis_server.dart
|
| @@ -23,9 +23,7 @@ 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/plugin_manager.dart';
|
| import 'package:analysis_server/src/plugin/plugin_watcher.dart';
|
| @@ -104,13 +102,6 @@ class AnalysisServer {
|
| static final String VERSION = '1.18.1';
|
|
|
| /**
|
| - * The number of milliseconds to perform operations before inserting
|
| - * a 1 millisecond delay so that the VM and dart:io can deliver content
|
| - * to stdin. This should be removed once the underlying problem is fixed.
|
| - */
|
| - static int performOperationDelayFrequency = 25;
|
| -
|
| - /**
|
| * The options of this server instance.
|
| */
|
| AnalysisServerOptions options;
|
| @@ -195,16 +186,6 @@ class AnalysisServer {
|
| final InstrumentationService instrumentationService;
|
|
|
| /**
|
| - * A queue of the operations to perform in this server.
|
| - */
|
| - ServerOperationQueue operationQueue;
|
| -
|
| - /**
|
| - * True if there is a pending future which will execute [performOperation].
|
| - */
|
| - bool performOperationPending = false;
|
| -
|
| - /**
|
| * A set of the [ServerService]s to send notifications for.
|
| */
|
| Set<ServerService> serverServices = new HashSet<ServerService>();
|
| @@ -223,14 +204,6 @@ class AnalysisServer {
|
| new HashMap<AnalysisService, Set<String>>();
|
|
|
| /**
|
| - * A table mapping [AnalysisContext]s to the completers that should be
|
| - * completed when analysis of this context is finished.
|
| - */
|
| - Map<AnalysisContext, Completer<AnalysisDoneReason>>
|
| - contextAnalysisDoneCompleters =
|
| - new HashMap<AnalysisContext, Completer<AnalysisDoneReason>>();
|
| -
|
| - /**
|
| * Performance information before initial analysis is complete.
|
| */
|
| ServerPerformance performanceDuringStartup = new ServerPerformance();
|
| @@ -260,11 +233,6 @@ class AnalysisServer {
|
| Completer _onAnalysisCompleteCompleter;
|
|
|
| /**
|
| - * The [Completer] that completes when the next operation is performed.
|
| - */
|
| - Completer _test_onOperationPerformedCompleter;
|
| -
|
| - /**
|
| * The controller that is notified when analysis is started.
|
| */
|
| StreamController<bool> _onAnalysisStartedController;
|
| @@ -275,20 +243,6 @@ class AnalysisServer {
|
| StreamController<ChangeNotice> _onFileAnalyzedController;
|
|
|
| /**
|
| - * True if any exceptions thrown by analysis should be propagated up the call
|
| - * stack.
|
| - */
|
| - bool rethrowExceptions;
|
| -
|
| - /**
|
| - * The next time (milliseconds since epoch) after which the analysis server
|
| - * should pause so that pending requests can be fetched by the system.
|
| - */
|
| - // Add 1 sec to prevent delay from impacting short running tests
|
| - int _nextPerformOperationDelayTime =
|
| - new DateTime.now().millisecondsSinceEpoch + 1000;
|
| -
|
| - /**
|
| * The content overlay for all analysis drivers.
|
| */
|
| final nd.FileContentOverlay fileContentOverlay = new nd.FileContentOverlay();
|
| @@ -397,8 +351,7 @@ class AnalysisServer {
|
| this.instrumentationService,
|
| {this.diagnosticServer,
|
| ResolverProvider fileResolverProvider: null,
|
| - ResolverProvider packageResolverProvider: null,
|
| - this.rethrowExceptions: true})
|
| + ResolverProvider packageResolverProvider: null})
|
| : notificationManager =
|
| new NotificationManager(channel, resourceProvider) {
|
| _performance = performanceDuringStartup;
|
| @@ -418,7 +371,6 @@ class AnalysisServer {
|
| defaultContextOptions.incrementalValidation =
|
| options.enableIncrementalResolutionValidation;
|
| defaultContextOptions.generateImplicitErrors = false;
|
| - operationQueue = new ServerOperationQueue();
|
|
|
| {
|
| String name = options.newAnalysisDriverLog;
|
| @@ -543,16 +495,6 @@ class AnalysisServer {
|
| Stream get onFileChanged => _onFileChangedController.stream;
|
|
|
| /**
|
| - * The [Future] that completes when the next operation is performed.
|
| - */
|
| - Future get test_onOperationPerformed {
|
| - if (_test_onOperationPerformedCompleter == null) {
|
| - _test_onOperationPerformedCompleter = new Completer();
|
| - }
|
| - return _test_onOperationPerformedCompleter.future;
|
| - }
|
| -
|
| - /**
|
| * Return the total time the server's been alive.
|
| */
|
| Duration get uptime {
|
| @@ -562,14 +504,6 @@ class AnalysisServer {
|
| }
|
|
|
| /**
|
| - * Adds the given [ServerOperation] to the queue, but does not schedule
|
| - * operations execution.
|
| - */
|
| - void addOperation(ServerOperation operation) {
|
| - operationQueue.add(operation);
|
| - }
|
| -
|
| - /**
|
| * The socket from which requests are being read has been closed.
|
| */
|
| void done() {
|
| @@ -788,7 +722,7 @@ class AnalysisServer {
|
| * Return `true` if analysis is complete.
|
| */
|
| bool isAnalysisComplete() {
|
| - return operationQueue.isEmpty && !analysisDriverScheduler.isAnalyzing;
|
| + return !analysisDriverScheduler.isAnalyzing;
|
| }
|
|
|
| /**
|
| @@ -801,142 +735,16 @@ class AnalysisServer {
|
| }
|
|
|
| /**
|
| - * Perform the next available [ServerOperation].
|
| - */
|
| - void performOperation() {
|
| - assert(performOperationPending);
|
| - PerformanceTag.unknown.makeCurrent();
|
| - performOperationPending = false;
|
| - if (!running) {
|
| - // An error has occurred, or the connection to the client has been
|
| - // closed, since this method was scheduled on the event queue. So
|
| - // don't do anything. Instead clear the operation queue.
|
| - operationQueue.clear();
|
| - return;
|
| - }
|
| - // prepare next operation
|
| - ServerOperation operation = operationQueue.take();
|
| - if (operation == null) {
|
| - // This can happen if the operation queue is cleared while the operation
|
| - // loop is in progress. No problem; we just need to exit the operation
|
| - // loop and wait for the next operation to be added.
|
| - ServerPerformanceStatistics.idle.makeCurrent();
|
| - return;
|
| - }
|
| - sendStatusNotification(operation);
|
| - // perform the operation
|
| - try {
|
| - operation.perform(this);
|
| - } catch (exception, stackTrace) {
|
| - sendServerErrorNotification(
|
| - 'Failed to perform operation: $operation', exception, stackTrace,
|
| - fatal: true);
|
| - if (rethrowExceptions) {
|
| - throw new AnalysisException('Unexpected exception during analysis',
|
| - new CaughtException(exception, stackTrace));
|
| - }
|
| - shutdown();
|
| - } finally {
|
| - if (_test_onOperationPerformedCompleter != null) {
|
| - _test_onOperationPerformedCompleter.complete(operation);
|
| - _test_onOperationPerformedCompleter = null;
|
| - }
|
| - if (!operationQueue.isEmpty) {
|
| - ServerPerformanceStatistics.intertask.makeCurrent();
|
| - _schedulePerformOperation();
|
| - } else {
|
| - if (generalAnalysisServices
|
| - .contains(GeneralAnalysisService.ANALYZED_FILES)) {
|
| - sendAnalysisNotificationAnalyzedFiles(this);
|
| - }
|
| - sendStatusNotification(null);
|
| - _scheduleAnalysisImplementedNotification();
|
| - if (_onAnalysisCompleteCompleter != null) {
|
| - _onAnalysisCompleteCompleter.complete();
|
| - _onAnalysisCompleteCompleter = null;
|
| - }
|
| - ServerPerformanceStatistics.idle.makeCurrent();
|
| - }
|
| - }
|
| - }
|
| -
|
| - /**
|
| * Trigger reanalysis of all files in the given list of analysis [roots], or
|
| * everything if the analysis roots is `null`.
|
| */
|
| void reanalyze(List<Resource> roots) {
|
| - // Clear any operations that are pending.
|
| - if (roots == null) {
|
| - operationQueue.clear();
|
| - } else {
|
| - // TODO(brianwilkerson) All of the contexts returned by _getContexts will
|
| - // be null. If we are still using the operation queue, then this needs to
|
| - // be changed to use drivers.
|
| -// for (AnalysisContext context in _getContexts(roots)) {
|
| -// operationQueue.contextRemoved(context);
|
| -// }
|
| - }
|
| // Instruct the contextDirectoryManager to rebuild all contexts from
|
| // scratch.
|
| contextManager.refresh(roots);
|
| }
|
|
|
| /**
|
| - * Schedule cache consistency validation in [context].
|
| - * The most of the validation must be done asynchronously.
|
| - */
|
| - void scheduleCacheConsistencyValidation(AnalysisContext context) {
|
| - if (context is InternalAnalysisContext) {
|
| - CacheConsistencyValidator validator = context.cacheConsistencyValidator;
|
| - List<Source> sources = validator.getSourcesToComputeModificationTimes();
|
| - // Compute modification times and notify the validator asynchronously.
|
| - new Future(() async {
|
| - try {
|
| - List<int> modificationTimes =
|
| - await resourceProvider.getModificationTimes(sources);
|
| - bool cacheInconsistencyFixed = validator
|
| - .sourceModificationTimesComputed(sources, modificationTimes);
|
| - if (cacheInconsistencyFixed) {
|
| - scheduleOperation(new PerformAnalysisOperation(context, false));
|
| - }
|
| - } catch (exception, stackTrace) {
|
| - sendServerErrorNotification(
|
| - 'Failed to check cache consistency', exception, stackTrace);
|
| - }
|
| - });
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Schedules execution of the given [ServerOperation].
|
| - */
|
| - void scheduleOperation(ServerOperation operation) {
|
| - addOperation(operation);
|
| - _schedulePerformOperation();
|
| - }
|
| -
|
| - /**
|
| - * Schedules analysis of the given context.
|
| - */
|
| - void schedulePerformAnalysisOperation(AnalysisContext context) {
|
| - _onAnalysisStartedController.add(true);
|
| - scheduleOperation(new PerformAnalysisOperation(context, false));
|
| - }
|
| -
|
| - /**
|
| - * This method is called when analysis of the given [AnalysisContext] is
|
| - * done.
|
| - */
|
| - void sendContextAnalysisDoneNotifications(
|
| - AnalysisContext context, AnalysisDoneReason reason) {
|
| - Completer<AnalysisDoneReason> completer =
|
| - contextAnalysisDoneCompleters.remove(context);
|
| - if (completer != null) {
|
| - completer.complete(reason);
|
| - }
|
| - }
|
| -
|
| - /**
|
| * Send the given [notification] to the client.
|
| */
|
| void sendNotification(Notification notification) {
|
| @@ -979,26 +787,6 @@ class AnalysisServer {
|
| }
|
|
|
| /**
|
| - * Send status notification to the client. The `operation` is the operation
|
| - * being performed or `null` if analysis is complete.
|
| - */
|
| - void sendStatusNotification(ServerOperation operation) {
|
| - // Only send status when subscribed.
|
| - if (!serverServices.contains(ServerService.STATUS)) {
|
| - return;
|
| - }
|
| - // Only send status when it changes
|
| - bool isAnalyzing = operation != null;
|
| - if (statusAnalyzing == isAnalyzing) {
|
| - return;
|
| - }
|
| - statusAnalyzing = isAnalyzing;
|
| - AnalysisStatus analysis = new AnalysisStatus(isAnalyzing);
|
| - channel.sendNotification(
|
| - new ServerStatusParams(analysis: analysis).toNotification());
|
| - }
|
| -
|
| - /**
|
| * Send status notification to the client. The state of analysis is given by
|
| * the [status] information.
|
| */
|
| @@ -1131,21 +919,6 @@ class AnalysisServer {
|
| }
|
|
|
| /**
|
| - * Performs all scheduled analysis operations.
|
| - */
|
| - void test_performAllAnalysisOperations() {
|
| - while (true) {
|
| - ServerOperation operation = operationQueue.takeIf((operation) {
|
| - return operation is PerformAnalysisOperation;
|
| - });
|
| - if (operation == null) {
|
| - break;
|
| - }
|
| - operation.perform(this);
|
| - }
|
| - }
|
| -
|
| - /**
|
| * Implementation for `analysis.updateContent`.
|
| */
|
| void updateContent(String id, Map<String, dynamic> changes) {
|
| @@ -1274,34 +1047,6 @@ class AnalysisServer {
|
| }
|
|
|
| /**
|
| - * Schedules [performOperation] execution.
|
| - */
|
| - void _schedulePerformOperation() {
|
| - if (performOperationPending) {
|
| - return;
|
| - }
|
| - /*
|
| - * TODO (danrubel) Rip out this workaround once the underlying problem
|
| - * is fixed. Currently, the VM and dart:io do not deliver content
|
| - * on stdin in a timely manner if the event loop is busy.
|
| - * To work around this problem, we delay for 1 millisecond
|
| - * every 25 milliseconds.
|
| - *
|
| - * To disable this workaround and see the underlying problem,
|
| - * set performOperationDelayFrequency to zero
|
| - */
|
| - int now = new DateTime.now().millisecondsSinceEpoch;
|
| - if (now > _nextPerformOperationDelayTime &&
|
| - performOperationDelayFrequency > 0) {
|
| - _nextPerformOperationDelayTime = now + performOperationDelayFrequency;
|
| - new Future.delayed(new Duration(milliseconds: 1), performOperation);
|
| - } else {
|
| - new Future(performOperation);
|
| - }
|
| - performOperationPending = true;
|
| - }
|
| -
|
| - /**
|
| * Listen for context events and invalidate index.
|
| *
|
| * It is possible that this method will do more in the future, e.g. listening
|
|
|