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

Unified Diff: pkg/analyzer/lib/src/dart/analysis/status.dart

Issue 2491183002: Add AnalysisDriverScheduler.status and extract status support. (Closed)
Patch Set: Created 4 years, 1 month 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/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);
+ }
+ }
+}
« no previous file with comments | « pkg/analyzer/lib/src/dart/analysis/driver.dart ('k') | pkg/analyzer/test/src/dart/analysis/driver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698