| OLD | NEW |
| 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 Loading... |
| 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 1705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1929 buffer.write(" "); | 1926 buffer.write(" "); |
| 1930 buffer.writeln(source.fullName); | 1927 buffer.writeln(source.fullName); |
| 1931 } | 1928 } |
| 1932 _logInformation(buffer.toString()); | 1929 _logInformation(buffer.toString()); |
| 1933 } | 1930 } |
| 1934 return changedTargets.length > 0; | 1931 return changedTargets.length > 0; |
| 1935 } | 1932 } |
| 1936 } | 1933 } |
| 1937 | 1934 |
| 1938 /** | 1935 /** |
| 1939 * A retention policy used by an analysis context. | |
| 1940 */ | |
| 1941 class ContextRetentionPolicy implements cache.CacheRetentionPolicy { | |
| 1942 /** | |
| 1943 * The context associated with this policy. | |
| 1944 */ | |
| 1945 final AnalysisContextImpl context; | |
| 1946 | |
| 1947 /** | |
| 1948 * Initialize a newly created policy to be associated with the given | |
| 1949 * [context]. | |
| 1950 */ | |
| 1951 ContextRetentionPolicy(this.context); | |
| 1952 | |
| 1953 @override | |
| 1954 RetentionPriority getAstPriority( | |
| 1955 AnalysisTarget target, cache.CacheEntry entry) { | |
| 1956 int priorityCount = context._priorityOrder.length; | |
| 1957 for (int i = 0; i < priorityCount; i++) { | |
| 1958 if (target == context._priorityOrder[i]) { | |
| 1959 return RetentionPriority.HIGH; | |
| 1960 } | |
| 1961 } | |
| 1962 if (_astIsNeeded(entry)) { | |
| 1963 return RetentionPriority.MEDIUM; | |
| 1964 } | |
| 1965 return RetentionPriority.LOW; | |
| 1966 } | |
| 1967 | |
| 1968 bool _astIsNeeded(cache.CacheEntry entry) => | |
| 1969 entry.isInvalid(BUILD_FUNCTION_TYPE_ALIASES_ERRORS) || | |
| 1970 entry.isInvalid(BUILD_LIBRARY_ERRORS) || | |
| 1971 entry.isInvalid(CONSTRUCTORS_ERRORS) || | |
| 1972 entry.isInvalid(HINTS) || | |
| 1973 //entry.isInvalid(LINTS) || | |
| 1974 entry.isInvalid(RESOLVE_REFERENCES_ERRORS) || | |
| 1975 entry.isInvalid(RESOLVE_TYPE_NAMES_ERRORS) || | |
| 1976 entry.isInvalid(VERIFY_ERRORS); | |
| 1977 } | |
| 1978 | |
| 1979 /** | |
| 1980 * An object that manages the partitions that can be shared between analysis | 1936 * An object that manages the partitions that can be shared between analysis |
| 1981 * contexts. | 1937 * contexts. |
| 1982 */ | 1938 */ |
| 1983 class PartitionManager { | 1939 class PartitionManager { |
| 1984 /** | 1940 /** |
| 1985 * The default cache size for a Dart SDK partition. | |
| 1986 */ | |
| 1987 static int _DEFAULT_SDK_CACHE_SIZE = 256; | |
| 1988 | |
| 1989 /** | |
| 1990 * A table mapping SDK's to the partitions used for those SDK's. | 1941 * A table mapping SDK's to the partitions used for those SDK's. |
| 1991 */ | 1942 */ |
| 1992 HashMap<DartSdk, cache.SdkCachePartition> _sdkPartitions = | 1943 HashMap<DartSdk, cache.SdkCachePartition> _sdkPartitions = |
| 1993 new HashMap<DartSdk, cache.SdkCachePartition>(); | 1944 new HashMap<DartSdk, cache.SdkCachePartition>(); |
| 1994 | 1945 |
| 1995 /** | 1946 /** |
| 1996 * Clear any cached data being maintained by this manager. | 1947 * Clear any cached data being maintained by this manager. |
| 1997 */ | 1948 */ |
| 1998 void clearCache() { | 1949 void clearCache() { |
| 1999 _sdkPartitions.clear(); | 1950 _sdkPartitions.clear(); |
| 2000 } | 1951 } |
| 2001 | 1952 |
| 2002 /** | 1953 /** |
| 2003 * Return the partition being used for the given [sdk], creating the partition | 1954 * Return the partition being used for the given [sdk], creating the partition |
| 2004 * if necessary. | 1955 * if necessary. |
| 2005 */ | 1956 */ |
| 2006 cache.SdkCachePartition forSdk(DartSdk sdk) { | 1957 cache.SdkCachePartition forSdk(DartSdk sdk) { |
| 2007 // Call sdk.context now, because when it creates a new | 1958 // Call sdk.context now, because when it creates a new |
| 2008 // InternalAnalysisContext instance, it calls forSdk() again, so creates an | 1959 // InternalAnalysisContext instance, it calls forSdk() again, so creates an |
| 2009 // SdkCachePartition instance. | 1960 // SdkCachePartition instance. |
| 2010 // So, if we initialize context after "partition == null", we end up | 1961 // So, if we initialize context after "partition == null", we end up |
| 2011 // with two SdkCachePartition instances. | 1962 // with two SdkCachePartition instances. |
| 2012 InternalAnalysisContext sdkContext = sdk.context; | 1963 InternalAnalysisContext sdkContext = sdk.context; |
| 2013 // Check cache for an existing partition. | 1964 // Check cache for an existing partition. |
| 2014 cache.SdkCachePartition partition = _sdkPartitions[sdk]; | 1965 cache.SdkCachePartition partition = _sdkPartitions[sdk]; |
| 2015 if (partition == null) { | 1966 if (partition == null) { |
| 2016 partition = | 1967 partition = new cache.SdkCachePartition(sdkContext); |
| 2017 new cache.SdkCachePartition(sdkContext, _DEFAULT_SDK_CACHE_SIZE); | |
| 2018 _sdkPartitions[sdk] = partition; | 1968 _sdkPartitions[sdk] = partition; |
| 2019 } | 1969 } |
| 2020 return partition; | 1970 return partition; |
| 2021 } | 1971 } |
| 2022 } | 1972 } |
| 2023 | 1973 |
| 2024 /** | 1974 /** |
| 2025 * Representation of a pending computation which is based on the results of | 1975 * Representation of a pending computation which is based on the results of |
| 2026 * analysis that may or may not have been completed. | 1976 * analysis that may or may not have been completed. |
| 2027 */ | 1977 */ |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2141 PendingFuture pendingFuture = | 2091 PendingFuture pendingFuture = |
| 2142 new PendingFuture<T>(_context, target, computeValue); | 2092 new PendingFuture<T>(_context, target, computeValue); |
| 2143 if (!pendingFuture.evaluate(entry)) { | 2093 if (!pendingFuture.evaluate(entry)) { |
| 2144 _context._pendingFutureTargets | 2094 _context._pendingFutureTargets |
| 2145 .putIfAbsent(target, () => <PendingFuture>[]) | 2095 .putIfAbsent(target, () => <PendingFuture>[]) |
| 2146 .add(pendingFuture); | 2096 .add(pendingFuture); |
| 2147 } | 2097 } |
| 2148 return pendingFuture.future; | 2098 return pendingFuture.future; |
| 2149 } | 2099 } |
| 2150 } | 2100 } |
| OLD | NEW |