Index: pkg/analyzer/lib/task/model.dart |
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart |
index 0a457661e8283f191e7ce78fd6e46a0ac4fd6bcf..ca3cf91a64a17693b3ee2ed6835085631d7353e8 100644 |
--- a/pkg/analyzer/lib/task/model.dart |
+++ b/pkg/analyzer/lib/task/model.dart |
@@ -7,8 +7,10 @@ library analyzer.task.model; |
import 'dart:collection'; |
import 'package:analyzer/src/generated/engine.dart' hide AnalysisTask; |
+import 'package:analyzer/src/generated/error.dart' show AnalysisError; |
import 'package:analyzer/src/generated/java_engine.dart'; |
import 'package:analyzer/src/generated/source.dart'; |
+import 'package:analyzer/src/generated/utilities_general.dart'; |
import 'package:analyzer/src/task/driver.dart'; |
import 'package:analyzer/src/task/model.dart'; |
@@ -390,6 +392,46 @@ abstract class ResultDescriptor<V> { |
} |
/** |
+ * A specification of the given [result] for the given [target]. |
Brian Wilkerson
2015/08/26 16:19:32
We should probably include the boilerplate for "cl
|
+ */ |
+class TargetedResult { |
+ /** |
+ * An empty list of results. |
+ */ |
+ static final List<TargetedResult> EMPTY_LIST = const <TargetedResult>[]; |
+ |
+ /** |
+ * The target with which the result is associated. |
+ */ |
+ final AnalysisTarget target; |
+ |
+ /** |
+ * The result associated with the target. |
+ */ |
+ final ResultDescriptor result; |
+ |
+ /** |
+ * Initialize a new targeted result. |
+ */ |
+ TargetedResult(this.target, this.result); |
+ |
+ @override |
+ int get hashCode { |
+ return JenkinsSmiHash.combine(target.hashCode, result.hashCode); |
+ } |
+ |
+ @override |
+ bool operator ==(other) { |
+ return other is TargetedResult && |
+ other.target == target && |
+ other.result == result; |
+ } |
+ |
+ @override |
+ String toString() => '$result for $target'; |
+} |
+ |
+/** |
* A description of an [AnalysisTask]. |
*/ |
abstract class TaskDescriptor { |
@@ -514,3 +556,88 @@ abstract class TaskInputBuilder<V> { |
*/ |
bool moveNext(); |
} |
+ |
+/** |
+ * [WorkManager]s are used to drive analysis. |
+ * |
+ * They know specific of the targets and results they care about, |
+ * so they can request analysis results in optimal order. |
Brian Wilkerson
2015/08/26 16:19:32
We should also have boilerplate here saying "only
|
+ */ |
+abstract class WorkManager { |
+ /** |
+ * Notifies the manager about changes in the explicit source list. |
+ */ |
+ void applyChange(List<Source> addedSources, List<Source> changedSources, |
+ List<Source> removedSources); |
+ |
+ /** |
+ * Notifies the managers that the given set of priority [targets] was set. |
+ */ |
+ void applyPriorityTargets(List<AnalysisTarget> targets); |
+ |
+ /** |
+ * Return a list of all of the errors associated with the given [source]. |
+ * The list of errors will be empty if the source is not known to the context |
+ * or if there are no errors in the source. The errors contained in the list |
+ * can be incomplete. |
+ */ |
+ List<AnalysisError> getErrors(Source source); |
+ |
+ /** |
+ * Return the next [TargetedResult] that this work manager wants to be |
+ * computed, or `null` if this manager doesn't need any new results. |
+ */ |
+ TargetedResult getNextResult(); |
+ |
+ /** |
+ * Return the priority if the next work order this work manager want to be |
+ * computed. The [AnalysisDriver] will perform the work order with |
+ * the highest priority. |
+ * |
+ * Even if the returned value is [WorkOrderPriority.NONE], it still does not |
+ * guarantee that [getNextResult] will return not `null`. |
+ */ |
+ WorkOrderPriority getNextResultPriority(); |
+ |
+ /** |
+ * Notifies the manager about analysis options changes. |
+ */ |
+ void onAnalysisOptionsChanged(); |
+ |
+ /** |
+ * Notifies the manager about [SourceFactory] changes. |
+ */ |
+ void onSourceFactoryChanged(); |
+ |
+ /** |
+ * Notifies the manager that the given [outputs] were produced for |
+ * the given [target]. |
+ */ |
+ void resultsComputed( |
+ AnalysisTarget target, Map<ResultDescriptor, dynamic> outputs); |
+} |
+ |
+/** |
+ * The priorities of work orders returned by [WorkManager]s. |
Brian Wilkerson
2015/08/26 16:19:32
Should we have a disclaimer about clients needing
|
+ */ |
+enum WorkOrderPriority { |
+ /** |
+ * Responding to an user's action. |
+ */ |
+ INTERACTIVE, |
+ |
+ /** |
+ * Computing information for priority sources. |
+ */ |
+ PRIORITY, |
+ |
+ /** |
+ * A work should be done, but without any special urgency. |
+ */ |
+ NORMAL, |
+ |
+ /** |
+ * Nothing to do. |
+ */ |
+ NONE |
+} |