| Index: pkg/analyzer/lib/src/task/driver.dart
|
| diff --git a/pkg/analyzer/lib/src/task/driver.dart b/pkg/analyzer/lib/src/task/driver.dart
|
| index 70ebe3ba5a5e3d01c063baacdb98099b111ebef2..c17bec64c3776e17d0d8ed90335ab5243199ae82 100644
|
| --- a/pkg/analyzer/lib/src/task/driver.dart
|
| +++ b/pkg/analyzer/lib/src/task/driver.dart
|
| @@ -101,15 +101,18 @@ class AnalysisDriver {
|
| try {
|
| isTaskRunning = true;
|
| AnalysisTask task;
|
| - WorkOrder workOrder = createWorkOrderForResult(target, result);
|
| - if (workOrder != null) {
|
| - while (workOrder.moveNext()) {
|
| -// AnalysisTask previousTask = task;
|
| -// String message = workOrder.current.toString();
|
| - task = performWorkItem(workOrder.current);
|
| -// if (task == null) {
|
| -// throw new AnalysisException(message, previousTask.caughtException);
|
| -// }
|
| + while (true) {
|
| + try {
|
| + WorkOrder workOrder = createWorkOrderForResult(target, result);
|
| + if (workOrder != null) {
|
| + while (workOrder.moveNext()) {
|
| + task = performWorkItem(workOrder.current);
|
| + }
|
| + }
|
| + break;
|
| + } on ModificationTimeMismatchError {
|
| + // Cache inconsistency was detected and fixed by invalidating
|
| + // corresponding results in cache. Computation must be restarted.
|
| }
|
| }
|
| return task;
|
| @@ -248,7 +251,12 @@ class AnalysisDriver {
|
| if (currentWorkOrder == null) {
|
| currentWorkOrder = createNextWorkOrder();
|
| } else if (currentWorkOrder.moveNext()) {
|
| - performWorkItem(currentWorkOrder.current);
|
| + try {
|
| + performWorkItem(currentWorkOrder.current);
|
| + } on ModificationTimeMismatchError {
|
| + reset();
|
| + return true;
|
| + }
|
| } else {
|
| currentWorkOrder = createNextWorkOrder();
|
| }
|
|
|