blob: 40778cb120df602a797a9356134b189fe0ea3e19 [file] [log] [blame]
// Copyright (c) 2015, 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:collection';
import 'package:analyzer/exception/exception.dart';
import 'package:analyzer/src/task/api/model.dart';
/**
* An object that manages the information about the tasks that have been
* defined.
*/
class TaskManager {
/**
* A table mapping [ResultDescriptor]s to a list of [TaskDescriptor]s
* for the tasks that can be used to compute the result.
*/
Map<ResultDescriptor, List<TaskDescriptor>> taskMap =
new HashMap<ResultDescriptor, List<TaskDescriptor>>();
/**
* A list of the results that are to be computed for all sources within an
* analysis root.
*/
Set<ResultDescriptor> generalResults = new Set<ResultDescriptor>();
/**
* A list of the results that are to be computed for priority sources.
*/
Set<ResultDescriptor> priorityResults = new Set<ResultDescriptor>();
/**
* Add the given [result] to the list of results that are to be computed for
* all sources within an analysis root.
*/
void addGeneralResult(ResultDescriptor result) {
generalResults.add(result);
}
/**
* Add the given [result] to the list of results that are to be computed for
* priority sources.
*/
void addPriorityResult(ResultDescriptor result) {
priorityResults.add(result);
}
/**
* Add the given [descriptor] to the list of analysis task descriptors that
* can be used to compute analysis results.
*/
void addTaskDescriptor(TaskDescriptor descriptor) {
descriptor.results.forEach((ResultDescriptor result) {
//
// Add the result to the task map.
//
List<TaskDescriptor> descriptors = taskMap[result];
if (descriptors == null) {
descriptors = <TaskDescriptor>[];
taskMap[result] = descriptors;
}
descriptors.add(descriptor);
});
}
/**
* Add the task descriptors in the given list of [descriptors] to the list of
* analysis task descriptors that can be used to compute analysis results.
*/
void addTaskDescriptors(List<TaskDescriptor> descriptors) {
descriptors.forEach(addTaskDescriptor);
}
/**
* Find a task that will compute the given [result] for the given [target].
*/
TaskDescriptor findTask(AnalysisTarget target, ResultDescriptor result) {
List<TaskDescriptor> descriptors = taskMap[result];
if (descriptors == null) {
throw new AnalysisException(
'No tasks registered to compute $result for $target');
}
return _findBestTask(descriptors, target);
}
/**
* Remove the given [result] from the list of results that are to be computed
* for all sources within an analysis root.
*/
void removeGeneralResult(ResultDescriptor result) {
generalResults.remove(result);
}
/**
* Remove the given [result] from the list of results that are to be computed
* for priority sources.
*/
void removePriorityResult(ResultDescriptor result) {
priorityResults.remove(result);
}
/**
* Given a list of task [descriptors] that can be used to compute some
* unspecified result for the given [target], return the descriptor that
* should be used to compute the result.
*/
TaskDescriptor _findBestTask(
List<TaskDescriptor> descriptors, AnalysisTarget target) {
TaskDescriptor best = null;
for (TaskDescriptor descriptor in descriptors) {
TaskSuitability suitability = descriptor.suitabilityFor(target);
if (suitability == TaskSuitability.HIGHEST) {
return descriptor;
} else if (best == null && suitability == TaskSuitability.LOWEST) {
best = descriptor;
}
}
return best;
}
}