From 2a4dbe248c347f5a36bae3201e3f646bbdf397f0 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Wed, 16 Mar 2016 09:20:43 -0700 Subject: [PATCH] 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 . --- pkg/analyzer/lib/src/task/driver.dart | 3 + pkg/analyzer/test/src/task/driver_test.dart | 128 ++++++++++++-------- 2 files changed, 80 insertions(+), 51 deletions(-) diff --git a/pkg/analyzer/lib/src/task/driver.dart b/pkg/analyzer/lib/src/task/driver.dart index cb4da98ff0c..7ff82876dc0 100644 --- a/pkg/analyzer/lib/src/task/driver.dart +++ b/pkg/analyzer/lib/src/task/driver.dart @@ -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; diff --git a/pkg/analyzer/test/src/task/driver_test.dart b/pkg/analyzer/test/src/task/driver_test.dart index 221636a2c5e..bd216758d77 100644 --- a/pkg/analyzer/test/src/task/driver_test.dart +++ b/pkg/analyzer/test/src/task/driver_test.dart @@ -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