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 |