AnalysisDriver.createWorkOrderForResult() should check AnalysisContext.aboutToComputeResult() first.

So, if there is a result provider, it will be asked for root results,
such as DART_ERRORS or LIBRARY_ELEMENT too.

R=brianwilkerson@google.com
BUG=

Review URL: https://codereview.chromium.org/1806563003 .
This commit is contained in:
Konstantin Shcheglov
2016-03-16 09:20:43 -07:00
parent e8a79c4f91
commit 2a4dbe248c
2 changed files with 80 additions and 51 deletions
+3
View File
@@ -165,6 +165,9 @@ class AnalysisDriver {
state == CacheState.IN_PROCESS) {
return null;
}
if (context.aboutToComputeResult(entry, result)) {
return null;
}
TaskDescriptor taskDescriptor = taskManager.findTask(target, result);
if (taskDescriptor == null) {
return null;
+77 -51
View File
@@ -124,6 +124,32 @@ class AnalysisDriverTest extends AbstractDriverTest {
expect(analysisDriver.createNextWorkOrder(), isNull);
}
test_createWorkOrderForResult_aboutToComputeResult() {
AnalysisTarget target = new TestSource();
ResultDescriptor result = new ResultDescriptor('result', null);
TaskDescriptor descriptor = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {},
[result]);
taskManager.addTaskDescriptor(descriptor);
context.getCacheEntry(target).setState(result, CacheState.INVALID);
// has result
{
when(context.aboutToComputeResult(anyObject, result)).thenReturn(true);
WorkOrder workOrder =
analysisDriver.createWorkOrderForResult(target, result);
expect(workOrder, isNull);
}
// no result
{
when(context.aboutToComputeResult(anyObject, result)).thenReturn(false);
WorkOrder workOrder =
analysisDriver.createWorkOrderForResult(target, result);
expect(workOrder, isNotNull);
}
}
test_createWorkOrderForResult_error() {
AnalysisTarget target = new TestSource();
ResultDescriptor result = new ResultDescriptor('result', null);
@@ -649,57 +675,6 @@ class WorkItemTest extends AbstractDriverTest {
expect(item.target, target);
}
test_gatherInputs_complete() {
AnalysisTarget target = new TestSource();
TaskDescriptor descriptor = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {},
[new ResultDescriptor('output', null)]);
WorkItem item = new WorkItem(context, target, descriptor, null, 0, null);
WorkItem result = item.gatherInputs(taskManager, []);
expect(result, isNull);
expect(item.exception, isNull);
}
test_gatherInputs_incomplete() {
AnalysisTarget target = new TestSource();
ResultDescriptor resultA = new ResultDescriptor('resultA', null);
ResultDescriptor resultB = new ResultDescriptor('resultB', null);
// prepare tasks
TaskDescriptor task1 = new TaskDescriptor(
'task',
(context, target) =>
new TestAnalysisTask(context, target, results: [resultA]),
(target) => {},
[resultA]);
TaskDescriptor task2 = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {'one': resultA.of(target)},
[resultB]);
taskManager.addTaskDescriptor(task1);
taskManager.addTaskDescriptor(task2);
// gather inputs
WorkItem item = new WorkItem(context, target, task2, null, 0, null);
WorkItem inputItem = item.gatherInputs(taskManager, []);
expect(inputItem, isNotNull);
}
test_gatherInputs_invalid() {
AnalysisTarget target = new TestSource();
ResultDescriptor inputResult = new ResultDescriptor('input', null);
TaskDescriptor descriptor = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {'one': inputResult.of(target)},
[new ResultDescriptor('output', null)]);
WorkItem item = new WorkItem(context, target, descriptor, null, 0, null);
WorkItem result = item.gatherInputs(taskManager, []);
expect(result, isNull);
expect(item.exception, isNotNull);
}
test_gatherInputs_aboutToComputeResult_hasResult() {
AnalysisTarget target = new TestSource();
ResultDescriptor resultA = new ResultDescriptor('resultA', null);
@@ -754,6 +729,57 @@ class WorkItemTest extends AbstractDriverTest {
expect(inputItem.target, target);
expect(inputItem.descriptor, task1);
}
test_gatherInputs_complete() {
AnalysisTarget target = new TestSource();
TaskDescriptor descriptor = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {},
[new ResultDescriptor('output', null)]);
WorkItem item = new WorkItem(context, target, descriptor, null, 0, null);
WorkItem result = item.gatherInputs(taskManager, []);
expect(result, isNull);
expect(item.exception, isNull);
}
test_gatherInputs_incomplete() {
AnalysisTarget target = new TestSource();
ResultDescriptor resultA = new ResultDescriptor('resultA', null);
ResultDescriptor resultB = new ResultDescriptor('resultB', null);
// prepare tasks
TaskDescriptor task1 = new TaskDescriptor(
'task',
(context, target) =>
new TestAnalysisTask(context, target, results: [resultA]),
(target) => {},
[resultA]);
TaskDescriptor task2 = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {'one': resultA.of(target)},
[resultB]);
taskManager.addTaskDescriptor(task1);
taskManager.addTaskDescriptor(task2);
// gather inputs
WorkItem item = new WorkItem(context, target, task2, null, 0, null);
WorkItem inputItem = item.gatherInputs(taskManager, []);
expect(inputItem, isNotNull);
}
test_gatherInputs_invalid() {
AnalysisTarget target = new TestSource();
ResultDescriptor inputResult = new ResultDescriptor('input', null);
TaskDescriptor descriptor = new TaskDescriptor(
'task',
(context, target) => new TestAnalysisTask(context, target),
(target) => {'one': inputResult.of(target)},
[new ResultDescriptor('output', null)]);
WorkItem item = new WorkItem(context, target, descriptor, null, 0, null);
WorkItem result = item.gatherInputs(taskManager, []);
expect(result, isNull);
expect(item.exception, isNotNull);
}
}
@reflectiveTest