Index: pkg/analyzer/lib/src/context/context.dart |
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart |
index f83c3497c0cb231f26e62d9d883a84678ce0db6d..ba82c4d21c5d0c7eef6ba1cb906246700de8447d 100644 |
--- a/pkg/analyzer/lib/src/context/context.dart |
+++ b/pkg/analyzer/lib/src/context/context.dart |
@@ -1888,20 +1888,31 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
.firstWhere((unit) => unit != null, orElse: () => null); |
// If we have the old unit, we can try to update it. |
if (oldUnit != null) { |
- CompilationUnit newUnit = parseCompilationUnit(source); |
- IncrementalCompilationUnitElementBuilder builder = |
- new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit); |
- builder.build(); |
- CompilationUnitElementDelta unitDelta = builder.unitDelta; |
- if (!unitDelta.hasDirectiveChange) { |
- unitEntry.setValueIncremental( |
- COMPILATION_UNIT_CONSTANTS, builder.unitConstants, false); |
- DartDelta dartDelta = new DartDelta(source); |
- unitDelta.addedDeclarations.forEach(dartDelta.elementChanged); |
- unitDelta.removedDeclarations.forEach(dartDelta.elementChanged); |
- unitDelta.classDeltas.values.forEach(dartDelta.classChanged); |
- entry.setState(CONTENT, CacheState.INVALID, delta: dartDelta); |
- return; |
+ // Safely parse the source. |
+ CompilationUnit newUnit; |
+ try { |
+ newUnit = parseCompilationUnit(source); |
+ } catch (_) { |
+ // The source might have been removed by this time. |
+ // We cannot perform incremental invalidation. |
+ } |
+ // If the new unit was parsed successfully, continue. |
+ if (newUnit != null) { |
+ IncrementalCompilationUnitElementBuilder builder = |
+ new IncrementalCompilationUnitElementBuilder( |
+ oldUnit, newUnit); |
+ builder.build(); |
+ CompilationUnitElementDelta unitDelta = builder.unitDelta; |
+ if (!unitDelta.hasDirectiveChange) { |
+ unitEntry.setValueIncremental( |
+ COMPILATION_UNIT_CONSTANTS, builder.unitConstants, false); |
+ DartDelta dartDelta = new DartDelta(source); |
+ unitDelta.addedDeclarations.forEach(dartDelta.elementChanged); |
+ unitDelta.removedDeclarations.forEach(dartDelta.elementChanged); |
+ unitDelta.classDeltas.values.forEach(dartDelta.classChanged); |
+ entry.setState(CONTENT, CacheState.INVALID, delta: dartDelta); |
+ return; |
+ } |
} |
} |
} |