| 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/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 151 /** | 151 /** |
| 152 * The analysis driver used to perform analysis. | 152 * The analysis driver used to perform analysis. |
| 153 */ | 153 */ |
| 154 AnalysisDriver driver; | 154 AnalysisDriver driver; |
| 155 | 155 |
| 156 /** | 156 /** |
| 157 * A list containing sources for which data should not be flushed. | 157 * A list containing sources for which data should not be flushed. |
| 158 */ | 158 */ |
| 159 List<Source> _priorityOrder = <Source>[]; | 159 List<Source> _priorityOrder = <Source>[]; |
| 160 | 160 |
| 161 CacheConsistencyValidatorImpl _cacheConsistencyValidator; |
| 162 |
| 161 /** | 163 /** |
| 162 * A map from all sources for which there are futures pending to a list of | 164 * A map from all sources for which there are futures pending to a list of |
| 163 * the corresponding PendingFuture objects. These sources will be analyzed | 165 * the corresponding PendingFuture objects. These sources will be analyzed |
| 164 * in the same way as priority sources, except with higher priority. | 166 * in the same way as priority sources, except with higher priority. |
| 165 */ | 167 */ |
| 166 HashMap<AnalysisTarget, List<PendingFuture>> _pendingFutureTargets = | 168 HashMap<AnalysisTarget, List<PendingFuture>> _pendingFutureTargets = |
| 167 new HashMap<AnalysisTarget, List<PendingFuture>>(); | 169 new HashMap<AnalysisTarget, List<PendingFuture>>(); |
| 168 | 170 |
| 169 /** | 171 /** |
| 170 * A table mapping sources to the change notices that are waiting to be | 172 * A table mapping sources to the change notices that are waiting to be |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 } else { | 342 } else { |
| 341 _priorityOrder = sources; | 343 _priorityOrder = sources; |
| 342 } | 344 } |
| 343 } | 345 } |
| 344 for (WorkManager workManager in workManagers) { | 346 for (WorkManager workManager in workManagers) { |
| 345 workManager.applyPriorityTargets(_priorityOrder); | 347 workManager.applyPriorityTargets(_priorityOrder); |
| 346 } | 348 } |
| 347 driver.reset(); | 349 driver.reset(); |
| 348 } | 350 } |
| 349 | 351 |
| 352 CacheConsistencyValidator get cacheConsistencyValidator => |
| 353 _cacheConsistencyValidator ??= new CacheConsistencyValidatorImpl(this); |
| 354 |
| 350 @override | 355 @override |
| 351 set contentCache(ContentCache value) { | 356 set contentCache(ContentCache value) { |
| 352 _contentCache = value; | 357 _contentCache = value; |
| 353 } | 358 } |
| 354 | 359 |
| 355 @override | 360 @override |
| 356 DeclaredVariables get declaredVariables => _declaredVariables; | 361 DeclaredVariables get declaredVariables => _declaredVariables; |
| 357 | 362 |
| 358 @deprecated | 363 @deprecated |
| 359 @override | 364 @override |
| (...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1368 entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED); | 1373 entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED); |
| 1369 entry.setState(RESOLVED_UNIT9, CacheState.FLUSHED); | 1374 entry.setState(RESOLVED_UNIT9, CacheState.FLUSHED); |
| 1370 entry.setState(RESOLVED_UNIT10, CacheState.FLUSHED); | 1375 entry.setState(RESOLVED_UNIT10, CacheState.FLUSHED); |
| 1371 entry.setState(RESOLVED_UNIT11, CacheState.FLUSHED); | 1376 entry.setState(RESOLVED_UNIT11, CacheState.FLUSHED); |
| 1372 entry.setState(RESOLVED_UNIT12, CacheState.FLUSHED); | 1377 entry.setState(RESOLVED_UNIT12, CacheState.FLUSHED); |
| 1373 entry.setState(RESOLVED_UNIT13, CacheState.FLUSHED); | 1378 entry.setState(RESOLVED_UNIT13, CacheState.FLUSHED); |
| 1374 entry.setState(RESOLVED_UNIT, CacheState.FLUSHED); | 1379 entry.setState(RESOLVED_UNIT, CacheState.FLUSHED); |
| 1375 } | 1380 } |
| 1376 | 1381 |
| 1377 @override | 1382 @override |
| 1378 bool validateCacheConsistency() { | |
| 1379 int consistencyCheckStart = JavaSystem.nanoTime(); | |
| 1380 HashSet<Source> changedSources = new HashSet<Source>(); | |
| 1381 HashSet<Source> missingSources = new HashSet<Source>(); | |
| 1382 for (Source source in _privatePartition.sources) { | |
| 1383 CacheEntry entry = _privatePartition.get(source); | |
| 1384 int sourceTime = getModificationStamp(source); | |
| 1385 if (sourceTime != entry.modificationTime) { | |
| 1386 changedSources.add(source); | |
| 1387 PerformanceStatistics | |
| 1388 .cacheConsistencyValidationStatistics.numOfModified++; | |
| 1389 } | |
| 1390 if (entry.exception != null) { | |
| 1391 if (!exists(source)) { | |
| 1392 missingSources.add(source); | |
| 1393 PerformanceStatistics | |
| 1394 .cacheConsistencyValidationStatistics.numOfModified++; | |
| 1395 } | |
| 1396 } | |
| 1397 } | |
| 1398 for (Source source in changedSources) { | |
| 1399 _sourceChanged(source); | |
| 1400 } | |
| 1401 int removalCount = 0; | |
| 1402 for (Source source in missingSources) { | |
| 1403 if (getLibrariesContaining(source).isEmpty && | |
| 1404 getLibrariesDependingOn(source).isEmpty) { | |
| 1405 _removeFromCache(source); | |
| 1406 removalCount++; | |
| 1407 } | |
| 1408 } | |
| 1409 int consistencyCheckEnd = JavaSystem.nanoTime(); | |
| 1410 if (changedSources.length > 0 || missingSources.length > 0) { | |
| 1411 StringBuffer buffer = new StringBuffer(); | |
| 1412 buffer.write("Consistency check took "); | |
| 1413 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); | |
| 1414 buffer.writeln(" ms and found"); | |
| 1415 buffer.write(" "); | |
| 1416 buffer.write(changedSources.length); | |
| 1417 buffer.writeln(" inconsistent entries"); | |
| 1418 buffer.write(" "); | |
| 1419 buffer.write(missingSources.length); | |
| 1420 buffer.write(" missing sources ("); | |
| 1421 buffer.write(removalCount); | |
| 1422 buffer.writeln(" removed"); | |
| 1423 for (Source source in missingSources) { | |
| 1424 buffer.write(" "); | |
| 1425 buffer.writeln(source.fullName); | |
| 1426 } | |
| 1427 _logInformation(buffer.toString()); | |
| 1428 } | |
| 1429 return changedSources.length > 0; | |
| 1430 } | |
| 1431 | |
| 1432 @override | |
| 1433 void visitContentCache(ContentCacheVisitor visitor) { | 1383 void visitContentCache(ContentCacheVisitor visitor) { |
| 1434 _contentCache.accept(visitor); | 1384 _contentCache.accept(visitor); |
| 1435 } | 1385 } |
| 1436 | 1386 |
| 1437 /** | 1387 /** |
| 1438 * Add all of the sources contained in the given source [container] to the | 1388 * Add all of the sources contained in the given source [container] to the |
| 1439 * given list of [sources]. | 1389 * given list of [sources]. |
| 1440 */ | 1390 */ |
| 1441 void _addSourcesInContainer(List<Source> sources, SourceContainer container) { | 1391 void _addSourcesInContainer(List<Source> sources, SourceContainer container) { |
| 1442 for (Source source in _cache.sources) { | 1392 for (Source source in _cache.sources) { |
| (...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2094 if (!pendingFuture.evaluate(entry)) { | 2044 if (!pendingFuture.evaluate(entry)) { |
| 2095 _context._pendingFutureTargets | 2045 _context._pendingFutureTargets |
| 2096 .putIfAbsent(_target, () => <PendingFuture>[]) | 2046 .putIfAbsent(_target, () => <PendingFuture>[]) |
| 2097 .add(pendingFuture); | 2047 .add(pendingFuture); |
| 2098 _context.dartWorkManager.addPriorityResult(_target, _descriptor); | 2048 _context.dartWorkManager.addPriorityResult(_target, _descriptor); |
| 2099 } | 2049 } |
| 2100 return pendingFuture.future; | 2050 return pendingFuture.future; |
| 2101 } | 2051 } |
| 2102 } | 2052 } |
| 2103 | 2053 |
| 2054 class CacheConsistencyValidatorImpl implements CacheConsistencyValidator { |
| 2055 final AnalysisContextImpl context; |
| 2056 |
| 2057 CacheConsistencyValidatorImpl(this.context); |
| 2058 |
| 2059 @override |
| 2060 List<Source> getSourcesToComputeModificationTimes() { |
| 2061 List<Source> sources = <Source>[]; |
| 2062 for (Source source in context._privatePartition.sources) { |
| 2063 if (context._contentCache.getModificationStamp(source) == null) { |
| 2064 sources.add(source); |
| 2065 } |
| 2066 } |
| 2067 return sources; |
| 2068 } |
| 2069 |
| 2070 @override |
| 2071 bool sourceModificationTimesComputed(List<Source> sources, List<int> times) { |
| 2072 int consistencyCheckStart = JavaSystem.nanoTime(); |
| 2073 HashSet<Source> changedSources = new HashSet<Source>(); |
| 2074 HashSet<Source> missingSources = new HashSet<Source>(); |
| 2075 for (int i = 0; i < sources.length; i++) { |
| 2076 Source source = sources[i]; |
| 2077 int sourceTime = times[i]; |
| 2078 if (sourceTime != null) { |
| 2079 CacheEntry entry = context._privatePartition.get(source); |
| 2080 if (entry != null) { |
| 2081 if (sourceTime != entry.modificationTime) { |
| 2082 changedSources.add(source); |
| 2083 PerformanceStatistics |
| 2084 .cacheConsistencyValidationStatistics.numOfModified++; |
| 2085 } |
| 2086 if (entry.exception != null) { |
| 2087 if (sourceTime == -1) { |
| 2088 missingSources.add(source); |
| 2089 PerformanceStatistics |
| 2090 .cacheConsistencyValidationStatistics.numOfModified++; |
| 2091 } |
| 2092 } |
| 2093 } |
| 2094 } |
| 2095 } |
| 2096 for (Source source in changedSources) { |
| 2097 context._sourceChanged(source); |
| 2098 } |
| 2099 int removalCount = 0; |
| 2100 for (Source source in missingSources) { |
| 2101 if (context.getLibrariesContaining(source).isEmpty && |
| 2102 context.getLibrariesDependingOn(source).isEmpty) { |
| 2103 context._removeFromCache(source); |
| 2104 removalCount++; |
| 2105 } |
| 2106 } |
| 2107 int consistencyCheckEnd = JavaSystem.nanoTime(); |
| 2108 if (changedSources.length > 0 || missingSources.length > 0) { |
| 2109 StringBuffer buffer = new StringBuffer(); |
| 2110 buffer.write("Consistency check took "); |
| 2111 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); |
| 2112 buffer.writeln(" ms and found"); |
| 2113 buffer.write(" "); |
| 2114 buffer.write(changedSources.length); |
| 2115 buffer.writeln(" inconsistent entries"); |
| 2116 buffer.write(" "); |
| 2117 buffer.write(missingSources.length); |
| 2118 buffer.write(" missing sources ("); |
| 2119 buffer.write(removalCount); |
| 2120 buffer.writeln(" removed"); |
| 2121 for (Source source in missingSources) { |
| 2122 buffer.write(" "); |
| 2123 buffer.writeln(source.fullName); |
| 2124 } |
| 2125 context._logInformation(buffer.toString()); |
| 2126 } |
| 2127 return changedSources.length > 0; |
| 2128 } |
| 2129 } |
| 2130 |
| 2104 /** | 2131 /** |
| 2105 * An object that manages the partitions that can be shared between analysis | 2132 * An object that manages the partitions that can be shared between analysis |
| 2106 * contexts. | 2133 * contexts. |
| 2107 */ | 2134 */ |
| 2108 class PartitionManager { | 2135 class PartitionManager { |
| 2109 /** | 2136 /** |
| 2110 * A table mapping SDK's to the partitions used for those SDK's. | 2137 * A table mapping SDK's to the partitions used for those SDK's. |
| 2111 */ | 2138 */ |
| 2112 HashMap<DartSdk, SdkCachePartition> _sdkPartitions = | 2139 HashMap<DartSdk, SdkCachePartition> _sdkPartitions = |
| 2113 new HashMap<DartSdk, SdkCachePartition>(); | 2140 new HashMap<DartSdk, SdkCachePartition>(); |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2266 } | 2293 } |
| 2267 DartSdk sdk = factory.dartSdk; | 2294 DartSdk sdk = factory.dartSdk; |
| 2268 if (sdk == null) { | 2295 if (sdk == null) { |
| 2269 throw new IllegalArgumentException( | 2296 throw new IllegalArgumentException( |
| 2270 "The source factory for an SDK analysis context must have a DartUriRes
olver"); | 2297 "The source factory for an SDK analysis context must have a DartUriRes
olver"); |
| 2271 } | 2298 } |
| 2272 return new AnalysisCache( | 2299 return new AnalysisCache( |
| 2273 <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]); | 2300 <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]); |
| 2274 } | 2301 } |
| 2275 } | 2302 } |
| OLD | NEW |