Index: pkg/analyzer/lib/src/dart/analysis/status.dart |
diff --git a/pkg/analyzer/lib/src/dart/analysis/status.dart b/pkg/analyzer/lib/src/dart/analysis/status.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3e2d79c7d7879d0c4035302df29f94dc4c90d6c4 |
--- /dev/null |
+++ b/pkg/analyzer/lib/src/dart/analysis/status.dart |
@@ -0,0 +1,96 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+import 'dart:async'; |
+ |
+/** |
+ * The status of analysis. |
+ */ |
+class AnalysisStatus { |
+ static const IDLE = const AnalysisStatus._(false); |
+ static const ANALYZING = const AnalysisStatus._(true); |
+ |
+ final bool _analyzing; |
+ |
+ const AnalysisStatus._(this._analyzing); |
+ |
+ /** |
+ * Return `true` is the driver is analyzing. |
+ */ |
+ bool get isAnalyzing => _analyzing; |
+ |
+ /** |
+ * Return `true` is the driver is idle. |
+ */ |
+ bool get isIdle => !_analyzing; |
+} |
+ |
+/** |
+ * [Monitor] can be used to wait for a signal. |
+ * |
+ * Signals are not queued, the client will receive exactly one signal |
+ * regardless of the number of [notify] invocations. The [signal] is reset |
+ * after completion and will not complete until [notify] is called next time. |
+ */ |
+class Monitor { |
+ Completer<Null> _completer = new Completer<Null>(); |
+ |
+ /** |
+ * Return a [Future] that completes when [notify] is called at least once. |
+ */ |
+ Future<Null> get signal async { |
+ await _completer.future; |
+ _completer = new Completer<Null>(); |
+ } |
+ |
+ /** |
+ * Complete the [signal] future if it is not completed yet. It is safe to |
+ * call this method multiple times, but the [signal] will complete only once. |
+ */ |
+ void notify() { |
+ if (!_completer.isCompleted) { |
+ _completer.complete(null); |
+ } |
+ } |
+} |
+ |
+/** |
+ * Helper for managing transitioning [AnalysisStatus]. |
+ */ |
+class StatusSupport { |
+ /** |
+ * The controller for the [stream]. |
+ */ |
+ final _statusController = new StreamController<AnalysisStatus>(); |
+ |
+ /** |
+ * The last status sent to the [stream]. |
+ */ |
+ AnalysisStatus _currentStatus = AnalysisStatus.IDLE; |
+ |
+ /** |
+ * Return the stream that produces [AnalysisStatus] events. |
+ */ |
+ Stream<AnalysisStatus> get stream => _statusController.stream; |
+ |
+ /** |
+ * Send a notifications to the [stream] that the driver started analyzing. |
+ */ |
+ void transitionToAnalyzing() { |
+ if (_currentStatus != AnalysisStatus.ANALYZING) { |
+ _currentStatus = AnalysisStatus.ANALYZING; |
+ _statusController.add(AnalysisStatus.ANALYZING); |
+ } |
+ } |
+ |
+ /** |
+ * Send a notifications to the [stream] stream that the driver is idle. |
+ */ |
+ void transitionToIdle() { |
+ if (_currentStatus != AnalysisStatus.IDLE) { |
+ _currentStatus = AnalysisStatus.IDLE; |
+ _statusController.add(AnalysisStatus.IDLE); |
+ } |
+ } |
+} |