Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(407)

Side by Side Diff: pkg/analyzer/lib/src/context/context.dart

Issue 2337073003: Safe handle removed file while incremental invalidation. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | pkg/analyzer/test/src/context/context_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.context.context; 5 library analyzer.src.context.context;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 1870 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 Source librarySource = source; 1881 Source librarySource = source;
1882 // Try to find an old unit which has element model. 1882 // Try to find an old unit which has element model.
1883 CacheEntry unitEntry = 1883 CacheEntry unitEntry =
1884 getCacheEntry(new LibrarySpecificUnit(librarySource, source)); 1884 getCacheEntry(new LibrarySpecificUnit(librarySource, source));
1885 CompilationUnit oldUnit = RESOLVED_UNIT_RESULTS 1885 CompilationUnit oldUnit = RESOLVED_UNIT_RESULTS
1886 .skipWhile((result) => result != RESOLVED_UNIT2) 1886 .skipWhile((result) => result != RESOLVED_UNIT2)
1887 .map(unitEntry.getValue) 1887 .map(unitEntry.getValue)
1888 .firstWhere((unit) => unit != null, orElse: () => null); 1888 .firstWhere((unit) => unit != null, orElse: () => null);
1889 // If we have the old unit, we can try to update it. 1889 // If we have the old unit, we can try to update it.
1890 if (oldUnit != null) { 1890 if (oldUnit != null) {
1891 CompilationUnit newUnit = parseCompilationUnit(source); 1891 // Safely parse the source.
1892 IncrementalCompilationUnitElementBuilder builder = 1892 CompilationUnit newUnit;
1893 new IncrementalCompilationUnitElementBuilder(oldUnit, newUnit); 1893 try {
1894 builder.build(); 1894 newUnit = parseCompilationUnit(source);
1895 CompilationUnitElementDelta unitDelta = builder.unitDelta; 1895 } catch (_) {
1896 if (!unitDelta.hasDirectiveChange) { 1896 // The source might have been removed by this time.
1897 unitEntry.setValueIncremental( 1897 // We cannot perform incremental invalidation.
1898 COMPILATION_UNIT_CONSTANTS, builder.unitConstants, false); 1898 }
1899 DartDelta dartDelta = new DartDelta(source); 1899 // If the new unit was parsed successfully, continue.
1900 unitDelta.addedDeclarations.forEach(dartDelta.elementChanged); 1900 if (newUnit != null) {
1901 unitDelta.removedDeclarations.forEach(dartDelta.elementChanged); 1901 IncrementalCompilationUnitElementBuilder builder =
1902 unitDelta.classDeltas.values.forEach(dartDelta.classChanged); 1902 new IncrementalCompilationUnitElementBuilder(
1903 entry.setState(CONTENT, CacheState.INVALID, delta: dartDelta); 1903 oldUnit, newUnit);
1904 return; 1904 builder.build();
1905 CompilationUnitElementDelta unitDelta = builder.unitDelta;
1906 if (!unitDelta.hasDirectiveChange) {
1907 unitEntry.setValueIncremental(
1908 COMPILATION_UNIT_CONSTANTS, builder.unitConstants, false);
1909 DartDelta dartDelta = new DartDelta(source);
1910 unitDelta.addedDeclarations.forEach(dartDelta.elementChanged);
1911 unitDelta.removedDeclarations.forEach(dartDelta.elementChanged);
1912 unitDelta.classDeltas.values.forEach(dartDelta.classChanged);
1913 entry.setState(CONTENT, CacheState.INVALID, delta: dartDelta);
1914 return;
1915 }
1905 } 1916 }
1906 } 1917 }
1907 } 1918 }
1908 } 1919 }
1909 entry.setState(CONTENT, CacheState.INVALID); 1920 entry.setState(CONTENT, CacheState.INVALID);
1910 entry.setState(MODIFICATION_TIME, CacheState.INVALID); 1921 entry.setState(MODIFICATION_TIME, CacheState.INVALID);
1911 entry.setState(SOURCE_KIND, CacheState.INVALID); 1922 entry.setState(SOURCE_KIND, CacheState.INVALID);
1912 } 1923 }
1913 for (WorkManager workManager in workManagers) { 1924 for (WorkManager workManager in workManagers) {
1914 workManager.applyChange( 1925 workManager.applyChange(
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
2276 } 2287 }
2277 DartSdk sdk = factory.dartSdk; 2288 DartSdk sdk = factory.dartSdk;
2278 if (sdk == null) { 2289 if (sdk == null) {
2279 throw new ArgumentError( 2290 throw new ArgumentError(
2280 "The source factory for an SDK analysis context must have a DartUriRes olver"); 2291 "The source factory for an SDK analysis context must have a DartUriRes olver");
2281 } 2292 }
2282 return new AnalysisCache( 2293 return new AnalysisCache(
2283 <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]); 2294 <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]);
2284 } 2295 }
2285 } 2296 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/src/context/context_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698