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

Unified Diff: pkg/analyzer/lib/src/generated/incremental_resolver.dart

Issue 1331223003: Keep known valid Dart results and invalidate all the other results during incremental resolution. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/src/context/cache.dart ('k') | pkg/analyzer/test/src/context/cache_test.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/incremental_resolver.dart
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 3e4cc5438322320d5befbd068222edfb5bfceec0..863336fc2d29718db9c7aba2ddfb72ddb63562ee 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -8,30 +8,26 @@ import 'dart:collection';
import 'dart:math' as math;
import 'package:analyzer/src/context/cache.dart'
- show CacheEntry, TargetedResult;
+ show CacheEntry, Delta, DeltaResult, TargetedResult;
import 'package:analyzer/src/generated/constant.dart';
-import 'package:analyzer/src/task/dart.dart'
- show
- HINTS,
- INFER_STATIC_VARIABLE_TYPES_ERRORS,
- LIBRARY_UNIT_ERRORS,
- PARSE_ERRORS,
- PARTIALLY_RESOLVE_REFERENCES_ERRORS,
- RESOLVE_FUNCTION_BODIES_ERRORS,
- RESOLVE_TYPE_NAMES_ERRORS,
- SCAN_ERRORS,
- USED_IMPORTED_ELEMENTS,
- USED_LOCAL_ELEMENTS,
- VARIABLE_REFERENCE_ERRORS,
- VERIFY_ERRORS;
-import 'package:analyzer/task/dart.dart'
- show DART_ERRORS, LibrarySpecificUnit, PARSED_UNIT, TOKEN_STREAM;
+import 'package:analyzer/src/task/dart.dart';
+import 'package:analyzer/task/dart.dart';
import 'package:analyzer/task/general.dart' show CONTENT, LINE_INFO;
-import 'package:analyzer/task/model.dart' show ResultDescriptor, TargetedResult;
+import 'package:analyzer/task/model.dart'
+ show AnalysisTarget, ResultDescriptor, TargetedResult, TaskDescriptor;
import 'ast.dart';
import 'element.dart';
-import 'engine.dart';
+import 'engine.dart'
+ show
+ AnalysisContext,
+ AnalysisOptions,
+ CacheState,
+ DartEntry,
+ DataDescriptor,
+ InternalAnalysisContext,
+ RecordingErrorListener,
+ SourceEntry;
import 'error.dart';
import 'error_verifier.dart';
import 'incremental_logger.dart' show logger, LoggingTimer;
@@ -830,6 +826,75 @@ class DeclarationMatchKind {
}
/**
+ * The [Delta] implementation used by incremental resolver.
+ * It keeps Dart results that are either don't change or are updated.
+ */
+class IncrementalBodyDelta extends Delta {
+ /**
+ * The offset of the changed contents.
+ */
+ final int updateOffset;
+
+ /**
+ * The end of the changed contents in the old unit.
+ */
+ final int updateEndOld;
+
+ /**
+ * The end of the changed contents in the new unit.
+ */
+ final int updateEndNew;
+
+ /**
+ * The delta between [updateEndNew] and [updateEndOld].
+ */
+ final int updateDelta;
+
+ IncrementalBodyDelta(Source source, this.updateOffset, this.updateEndOld,
+ this.updateEndNew, this.updateDelta)
+ : super(source);
+
+ @override
+ DeltaResult validate(InternalAnalysisContext context, AnalysisTarget target,
+ ResultDescriptor descriptor) {
+ // don't invalidate results of standard Dart tasks
+ bool isByTask(TaskDescriptor taskDescriptor) {
+ return taskDescriptor.results.contains(descriptor);
+ }
+ if (descriptor == CONTENT) {
+ return DeltaResult.KEEP_CONTINUE;
+ }
+ if (isByTask(BuildCompilationUnitElementTask.DESCRIPTOR) ||
+ isByTask(BuildDirectiveElementsTask.DESCRIPTOR) ||
+ isByTask(BuildEnumMemberElementsTask.DESCRIPTOR) ||
+ isByTask(BuildExportNamespaceTask.DESCRIPTOR) ||
+ isByTask(BuildLibraryElementTask.DESCRIPTOR) ||
+ isByTask(BuildPublicNamespaceTask.DESCRIPTOR) ||
+ isByTask(BuildSourceExportClosureTask.DESCRIPTOR) ||
+ isByTask(BuildSourceImportExportClosureTask.DESCRIPTOR) ||
+ isByTask(ComputeConstantDependenciesTask.DESCRIPTOR) ||
+ isByTask(ComputeConstantValueTask.DESCRIPTOR) ||
+ isByTask(EvaluateUnitConstantsTask.DESCRIPTOR) ||
+ isByTask(InferInstanceMembersInUnitTask.DESCRIPTOR) ||
+ isByTask(InferStaticVariableTypesInUnitTask.DESCRIPTOR) ||
+ isByTask(ParseDartTask.DESCRIPTOR) ||
+ isByTask(PartiallyResolveUnitReferencesTask.DESCRIPTOR) ||
+ isByTask(ScanDartTask.DESCRIPTOR) ||
+ isByTask(ResolveFunctionBodiesInUnitTask.DESCRIPTOR) ||
+ isByTask(ResolveLibraryReferencesTask.DESCRIPTOR) ||
+ isByTask(ResolveLibraryTypeNamesTask.DESCRIPTOR) ||
+ isByTask(ResolveUnitTypeNamesTask.DESCRIPTOR) ||
+ isByTask(ResolveVariableReferencesTask.DESCRIPTOR) ||
+ isByTask(VerifyUnitTask.DESCRIPTOR) ||
+ false) {
Brian Wilkerson 2015/09/10 20:06:51 ???
+ return DeltaResult.KEEP_CONTINUE;
+ }
+ // invalidate all the other results
+ return DeltaResult.INVALIDATE;
+ }
+}
+
+/**
* Instances of the class [IncrementalResolver] resolve the smallest portion of
* an AST structure that we currently know how to resolve.
*/
@@ -894,6 +959,9 @@ class IncrementalResolver {
*/
final int _updateEndNew;
+ /**
+ * The delta between [_updateEndNew] and [_updateEndOld].
+ */
int _updateDelta;
/**
@@ -940,6 +1008,7 @@ class IncrementalResolver {
AstNode rootNode = _findResolutionRoot(node);
_prepareResolutionContext(rootNode);
// update elements
+ _updateCache();
_updateElementNameOffsets();
_buildElements(rootNode);
if (!_canBeIncrementallyResolved(rootNode)) {
@@ -1171,6 +1240,14 @@ class IncrementalResolver {
_shiftErrors(errors);
}
+ void _updateCache() {
+ if (newSourceEntry != null) {
+ newSourceEntry.setState(CONTENT, CacheState.INVALID,
+ delta: new IncrementalBodyDelta(_source, _updateOffset, _updateEndOld,
+ _updateEndNew, _updateDelta));
+ }
+ }
+
void _updateElementNameOffsets() {
LoggingTimer timer = logger.startTimer();
try {
@@ -1374,6 +1451,7 @@ class PoorMansIncrementalResolver {
_updateOffset,
_updateEndOld,
_updateEndNew);
+ incrementalResolver._updateCache();
incrementalResolver._updateElementNameOffsets();
incrementalResolver._shiftEntryErrors();
}
@@ -1541,6 +1619,7 @@ class PoorMansIncrementalResolver {
_updateOffset,
_updateEndOld,
_updateEndNew);
+ incrementalResolver._updateCache();
incrementalResolver._updateElementNameOffsets();
incrementalResolver._shiftEntryErrors();
_updateEntry();
@@ -1609,12 +1688,12 @@ class PoorMansIncrementalResolver {
void _updateEntry_NEW() {
_newSourceEntry.setState(DART_ERRORS, CacheState.INVALID);
// scan results
- _newSourceEntry.setState(SCAN_ERRORS, CacheState.INVALID);
List<TargetedResult> scanDeps = <TargetedResult>[
new TargetedResult(_unitSource, CONTENT)
];
- _newSourceEntry.setValue(LINE_INFO, _newLineInfo, scanDeps);
+ _newSourceEntry.setState(SCAN_ERRORS, CacheState.INVALID);
_newSourceEntry.setValue(SCAN_ERRORS, _newScanErrors, scanDeps);
+ _newSourceEntry.setValue(LINE_INFO, _newLineInfo, scanDeps);
// parse results
List<TargetedResult> parseDeps = <TargetedResult>[
new TargetedResult(_unitSource, TOKEN_STREAM)
« no previous file with comments | « pkg/analyzer/lib/src/context/cache.dart ('k') | pkg/analyzer/test/src/context/cache_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698