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

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

Issue 1133513003: Cache flushing implementation for the task model. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fixes for review comments. Created 5 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « pkg/analyzer/lib/src/context/cache.dart ('k') | pkg/analyzer/lib/src/task/dart.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/src/cancelable_future.dart'; 10 import 'package:analyzer/src/cancelable_future.dart';
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 174
175 /** 175 /**
176 * A factory to override how [LibraryResolver] is created. 176 * A factory to override how [LibraryResolver] is created.
177 */ 177 */
178 LibraryResolverFactory libraryResolverFactory; 178 LibraryResolverFactory libraryResolverFactory;
179 179
180 /** 180 /**
181 * Initialize a newly created analysis context. 181 * Initialize a newly created analysis context.
182 */ 182 */
183 AnalysisContextImpl() { 183 AnalysisContextImpl() {
184 _privatePartition = new cache.UniversalCachePartition(this, 184 _privatePartition = new cache.UniversalCachePartition(this);
185 AnalysisOptionsImpl.DEFAULT_CACHE_SIZE,
186 new ContextRetentionPolicy(this));
187 _cache = createCacheFromSourceFactory(null); 185 _cache = createCacheFromSourceFactory(null);
188 _taskManager = AnalysisEngine.instance.taskManager; 186 _taskManager = AnalysisEngine.instance.taskManager;
189 _driver = new AnalysisDriver(_taskManager, this); 187 _driver = new AnalysisDriver(_taskManager, this);
190 _onSourcesChangedController = 188 _onSourcesChangedController =
191 new StreamController<SourcesChangedEvent>.broadcast(); 189 new StreamController<SourcesChangedEvent>.broadcast();
192 } 190 }
193 191
194 @override 192 @override
195 AnalysisOptions get analysisOptions => _options; 193 AnalysisOptions get analysisOptions => _options;
196 194
197 @override 195 @override
198 void set analysisOptions(AnalysisOptions options) { 196 void set analysisOptions(AnalysisOptions options) {
199 bool needsRecompute = this._options.analyzeFunctionBodiesPredicate != 197 bool needsRecompute = this._options.analyzeFunctionBodiesPredicate !=
200 options.analyzeFunctionBodiesPredicate || 198 options.analyzeFunctionBodiesPredicate ||
201 this._options.generateImplicitErrors != 199 this._options.generateImplicitErrors !=
202 options.generateImplicitErrors || 200 options.generateImplicitErrors ||
203 this._options.generateSdkErrors != options.generateSdkErrors || 201 this._options.generateSdkErrors != options.generateSdkErrors ||
204 this._options.dart2jsHint != options.dart2jsHint || 202 this._options.dart2jsHint != options.dart2jsHint ||
205 (this._options.hint && !options.hint) || 203 (this._options.hint && !options.hint) ||
206 this._options.preserveComments != options.preserveComments || 204 this._options.preserveComments != options.preserveComments ||
207 this._options.enableNullAwareOperators != 205 this._options.enableNullAwareOperators !=
208 options.enableNullAwareOperators || 206 options.enableNullAwareOperators ||
209 this._options.enableStrictCallChecks != options.enableStrictCallChecks; 207 this._options.enableStrictCallChecks != options.enableStrictCallChecks;
210 int cacheSize = options.cacheSize; 208 int cacheSize = options.cacheSize;
211 if (this._options.cacheSize != cacheSize) { 209 if (this._options.cacheSize != cacheSize) {
212 this._options.cacheSize = cacheSize; 210 this._options.cacheSize = cacheSize;
213 _privatePartition.maxCacheSize = cacheSize;
214 } 211 }
215 this._options.analyzeFunctionBodiesPredicate = 212 this._options.analyzeFunctionBodiesPredicate =
216 options.analyzeFunctionBodiesPredicate; 213 options.analyzeFunctionBodiesPredicate;
217 this._options.generateImplicitErrors = options.generateImplicitErrors; 214 this._options.generateImplicitErrors = options.generateImplicitErrors;
218 this._options.generateSdkErrors = options.generateSdkErrors; 215 this._options.generateSdkErrors = options.generateSdkErrors;
219 this._options.dart2jsHint = options.dart2jsHint; 216 this._options.dart2jsHint = options.dart2jsHint;
220 this._options.enableNullAwareOperators = options.enableNullAwareOperators; 217 this._options.enableNullAwareOperators = options.enableNullAwareOperators;
221 this._options.enableStrictCallChecks = options.enableStrictCallChecks; 218 this._options.enableStrictCallChecks = options.enableStrictCallChecks;
222 this._options.hint = options.hint; 219 this._options.hint = options.hint;
223 this._options.incremental = options.incremental; 220 this._options.incremental = options.incremental;
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 * Return a list of the sources that would be processed by 359 * Return a list of the sources that would be processed by
363 * [performAnalysisTask]. This method duplicates, and must therefore be kept 360 * [performAnalysisTask]. This method duplicates, and must therefore be kept
364 * in sync with, [getNextAnalysisTask]. This method is intended to be used for 361 * in sync with, [getNextAnalysisTask]. This method is intended to be used for
365 * testing purposes only. 362 * testing purposes only.
366 */ 363 */
367 List<Source> get sourcesNeedingProcessing { 364 List<Source> get sourcesNeedingProcessing {
368 HashSet<Source> sources = new HashSet<Source>(); 365 HashSet<Source> sources = new HashSet<Source>();
369 bool hintsEnabled = _options.hint; 366 bool hintsEnabled = _options.hint;
370 bool lintsEnabled = _options.lint; 367 bool lintsEnabled = _options.lint;
371 368
372 MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _privatePartition.i terator(); 369 MapIterator<AnalysisTarget, cache.CacheEntry> iterator =
370 _privatePartition.iterator();
373 while (iterator.moveNext()) { 371 while (iterator.moveNext()) {
374 AnalysisTarget target = iterator.key; 372 AnalysisTarget target = iterator.key;
375 if (target is Source) { 373 if (target is Source) {
376 _getSourcesNeedingProcessing( 374 _getSourcesNeedingProcessing(
377 target, iterator.value, false, hintsEnabled, lintsEnabled, sources); 375 target, iterator.value, false, hintsEnabled, lintsEnabled, sources);
378 } 376 }
379 } 377 }
380 return new List<Source>.from(sources); 378 return new List<Source>.from(sources);
381 } 379 }
382 380
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 return SourceKind.UNKNOWN; 832 return SourceKind.UNKNOWN;
835 } 833 }
836 834
837 @override 835 @override
838 List<Source> getLibrariesContaining(Source source) { 836 List<Source> getLibrariesContaining(Source source) {
839 SourceKind kind = getKindOf(source); 837 SourceKind kind = getKindOf(source);
840 if (kind == SourceKind.LIBRARY) { 838 if (kind == SourceKind.LIBRARY) {
841 return <Source>[source]; 839 return <Source>[source];
842 } else if (kind == SourceKind.PART) { 840 } else if (kind == SourceKind.PART) {
843 List<Source> libraries = <Source>[]; 841 List<Source> libraries = <Source>[];
844 MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator() ; 842 MapIterator<AnalysisTarget, cache.CacheEntry> iterator =
843 _cache.iterator();
845 while (iterator.moveNext()) { 844 while (iterator.moveNext()) {
846 AnalysisTarget target = iterator.key; 845 AnalysisTarget target = iterator.key;
847 if (target is Source && getKindOf(target) == SourceKind.LIBRARY) { 846 if (target is Source && getKindOf(target) == SourceKind.LIBRARY) {
848 List<Source> parts = _getResult(target, INCLUDED_PARTS); 847 List<Source> parts = _getResult(target, INCLUDED_PARTS);
849 if (parts.contains(source)) { 848 if (parts.contains(source)) {
850 libraries.add(target); 849 libraries.add(target);
851 } 850 }
852 } 851 }
853 } 852 }
854 if (libraries.isNotEmpty) { 853 if (libraries.isNotEmpty) {
(...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1958 buffer.write(" "); 1957 buffer.write(" ");
1959 buffer.writeln(source.fullName); 1958 buffer.writeln(source.fullName);
1960 } 1959 }
1961 _logInformation(buffer.toString()); 1960 _logInformation(buffer.toString());
1962 } 1961 }
1963 return changedTargets.length > 0; 1962 return changedTargets.length > 0;
1964 } 1963 }
1965 } 1964 }
1966 1965
1967 /** 1966 /**
1968 * A retention policy used by an analysis context.
1969 */
1970 class ContextRetentionPolicy implements cache.CacheRetentionPolicy {
1971 /**
1972 * The context associated with this policy.
1973 */
1974 final AnalysisContextImpl context;
1975
1976 /**
1977 * Initialize a newly created policy to be associated with the given
1978 * [context].
1979 */
1980 ContextRetentionPolicy(this.context);
1981
1982 @override
1983 RetentionPriority getAstPriority(
1984 AnalysisTarget target, cache.CacheEntry entry) {
1985 int priorityCount = context._priorityOrder.length;
1986 for (int i = 0; i < priorityCount; i++) {
1987 if (target == context._priorityOrder[i]) {
1988 return RetentionPriority.HIGH;
1989 }
1990 }
1991 if (_astIsNeeded(entry)) {
1992 return RetentionPriority.MEDIUM;
1993 }
1994 return RetentionPriority.LOW;
1995 }
1996
1997 bool _astIsNeeded(cache.CacheEntry entry) =>
1998 entry.isInvalid(BUILD_FUNCTION_TYPE_ALIASES_ERRORS) ||
1999 entry.isInvalid(BUILD_LIBRARY_ERRORS) ||
2000 entry.isInvalid(CONSTRUCTORS_ERRORS) ||
2001 entry.isInvalid(HINTS) ||
2002 //entry.isInvalid(LINTS) ||
2003 entry.isInvalid(RESOLVE_REFERENCES_ERRORS) ||
2004 entry.isInvalid(RESOLVE_TYPE_NAMES_ERRORS) ||
2005 entry.isInvalid(VERIFY_ERRORS);
2006 }
2007
2008 /**
2009 * An object that manages the partitions that can be shared between analysis 1967 * An object that manages the partitions that can be shared between analysis
2010 * contexts. 1968 * contexts.
2011 */ 1969 */
2012 class PartitionManager { 1970 class PartitionManager {
2013 /** 1971 /**
2014 * The default cache size for a Dart SDK partition.
2015 */
2016 static int _DEFAULT_SDK_CACHE_SIZE = 256;
2017
2018 /**
2019 * A table mapping SDK's to the partitions used for those SDK's. 1972 * A table mapping SDK's to the partitions used for those SDK's.
2020 */ 1973 */
2021 HashMap<DartSdk, cache.SdkCachePartition> _sdkPartitions = 1974 HashMap<DartSdk, cache.SdkCachePartition> _sdkPartitions =
2022 new HashMap<DartSdk, cache.SdkCachePartition>(); 1975 new HashMap<DartSdk, cache.SdkCachePartition>();
2023 1976
2024 /** 1977 /**
2025 * Clear any cached data being maintained by this manager. 1978 * Clear any cached data being maintained by this manager.
2026 */ 1979 */
2027 void clearCache() { 1980 void clearCache() {
2028 _sdkPartitions.clear(); 1981 _sdkPartitions.clear();
2029 } 1982 }
2030 1983
2031 /** 1984 /**
2032 * Return the partition being used for the given [sdk], creating the partition 1985 * Return the partition being used for the given [sdk], creating the partition
2033 * if necessary. 1986 * if necessary.
2034 */ 1987 */
2035 cache.SdkCachePartition forSdk(DartSdk sdk) { 1988 cache.SdkCachePartition forSdk(DartSdk sdk) {
2036 // Call sdk.context now, because when it creates a new 1989 // Call sdk.context now, because when it creates a new
2037 // InternalAnalysisContext instance, it calls forSdk() again, so creates an 1990 // InternalAnalysisContext instance, it calls forSdk() again, so creates an
2038 // SdkCachePartition instance. 1991 // SdkCachePartition instance.
2039 // So, if we initialize context after "partition == null", we end up 1992 // So, if we initialize context after "partition == null", we end up
2040 // with two SdkCachePartition instances. 1993 // with two SdkCachePartition instances.
2041 InternalAnalysisContext sdkContext = sdk.context; 1994 InternalAnalysisContext sdkContext = sdk.context;
2042 // Check cache for an existing partition. 1995 // Check cache for an existing partition.
2043 cache.SdkCachePartition partition = _sdkPartitions[sdk]; 1996 cache.SdkCachePartition partition = _sdkPartitions[sdk];
2044 if (partition == null) { 1997 if (partition == null) {
2045 partition = 1998 partition = new cache.SdkCachePartition(sdkContext);
2046 new cache.SdkCachePartition(sdkContext, _DEFAULT_SDK_CACHE_SIZE);
2047 _sdkPartitions[sdk] = partition; 1999 _sdkPartitions[sdk] = partition;
2048 } 2000 }
2049 return partition; 2001 return partition;
2050 } 2002 }
2051 } 2003 }
2052 2004
2053 /** 2005 /**
2054 * Representation of a pending computation which is based on the results of 2006 * Representation of a pending computation which is based on the results of
2055 * analysis that may or may not have been completed. 2007 * analysis that may or may not have been completed.
2056 */ 2008 */
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
2170 PendingFuture pendingFuture = 2122 PendingFuture pendingFuture =
2171 new PendingFuture<T>(_context, target, computeValue); 2123 new PendingFuture<T>(_context, target, computeValue);
2172 if (!pendingFuture.evaluate(entry)) { 2124 if (!pendingFuture.evaluate(entry)) {
2173 _context._pendingFutureTargets 2125 _context._pendingFutureTargets
2174 .putIfAbsent(target, () => <PendingFuture>[]) 2126 .putIfAbsent(target, () => <PendingFuture>[])
2175 .add(pendingFuture); 2127 .add(pendingFuture);
2176 } 2128 }
2177 return pendingFuture.future; 2129 return pendingFuture.future;
2178 } 2130 }
2179 } 2131 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/context/cache.dart ('k') | pkg/analyzer/lib/src/task/dart.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698