| 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 2050 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2061 | 2061 |
| 2062 CacheConsistencyValidatorImpl(this.context); | 2062 CacheConsistencyValidatorImpl(this.context); |
| 2063 | 2063 |
| 2064 @override | 2064 @override |
| 2065 List<Source> getSourcesToComputeModificationTimes() { | 2065 List<Source> getSourcesToComputeModificationTimes() { |
| 2066 return context._privatePartition.sources.toList(); | 2066 return context._privatePartition.sources.toList(); |
| 2067 } | 2067 } |
| 2068 | 2068 |
| 2069 @override | 2069 @override |
| 2070 bool sourceModificationTimesComputed(List<Source> sources, List<int> times) { | 2070 bool sourceModificationTimesComputed(List<Source> sources, List<int> times) { |
| 2071 int consistencyCheckStart = JavaSystem.nanoTime(); | 2071 Stopwatch timer = new Stopwatch()..start(); |
| 2072 HashSet<Source> changedSources = new HashSet<Source>(); | 2072 HashSet<Source> changedSources = new HashSet<Source>(); |
| 2073 HashSet<Source> missingSources = new HashSet<Source>(); | 2073 HashSet<Source> removedSources = new HashSet<Source>(); |
| 2074 for (int i = 0; i < sources.length; i++) { | 2074 for (int i = 0; i < sources.length; i++) { |
| 2075 Source source = sources[i]; | 2075 Source source = sources[i]; |
| 2076 // When a source is in the content cache, | 2076 // When a source is in the content cache, |
| 2077 // its modification time in the file system does not matter. | 2077 // its modification time in the file system does not matter. |
| 2078 if (context._contentCache.getModificationStamp(source) != null) { | 2078 if (context._contentCache.getModificationStamp(source) != null) { |
| 2079 continue; | 2079 continue; |
| 2080 } | 2080 } |
| 2081 // When we were not able to compute the modification time in the | 2081 // When we were not able to compute the modification time in the |
| 2082 // file system, there is nothing to compare with, so skip the source. | 2082 // file system, there is nothing to compare with, so skip the source. |
| 2083 int sourceTime = times[i]; | 2083 int sourceTime = times[i]; |
| 2084 if (sourceTime == null) { | 2084 if (sourceTime == null) { |
| 2085 continue; | 2085 continue; |
| 2086 } | 2086 } |
| 2087 // Compare with the modification time in the cache entry. | 2087 // Compare with the modification time in the cache entry. |
| 2088 CacheEntry entry = context._privatePartition.get(source); | 2088 CacheEntry entry = context._privatePartition.get(source); |
| 2089 if (entry != null) { | 2089 if (entry != null) { |
| 2090 if (sourceTime != entry.modificationTime) { | 2090 if (entry.modificationTime != sourceTime) { |
| 2091 changedSources.add(source); | |
| 2092 PerformanceStatistics | |
| 2093 .cacheConsistencyValidationStatistics.numOfModified++; | |
| 2094 } | |
| 2095 if (entry.exception != null) { | |
| 2096 if (sourceTime == -1) { | 2091 if (sourceTime == -1) { |
| 2097 missingSources.add(source); | 2092 removedSources.add(source); |
| 2098 PerformanceStatistics | 2093 PerformanceStatistics |
| 2099 .cacheConsistencyValidationStatistics.numOfModified++; | 2094 .cacheConsistencyValidationStatistics.numOfRemoved++; |
| 2095 } else { |
| 2096 changedSources.add(source); |
| 2097 PerformanceStatistics |
| 2098 .cacheConsistencyValidationStatistics.numOfChanged++; |
| 2100 } | 2099 } |
| 2101 } | 2100 } |
| 2102 } | 2101 } |
| 2103 } | 2102 } |
| 2104 for (Source source in changedSources) { | 2103 for (Source source in changedSources) { |
| 2105 context._sourceChanged(source); | 2104 context._sourceChanged(source); |
| 2106 } | 2105 } |
| 2107 int removalCount = 0; | 2106 for (Source source in removedSources) { |
| 2108 for (Source source in missingSources) { | 2107 context._sourceRemoved(source); |
| 2109 if (context.getLibrariesContaining(source).isEmpty && | |
| 2110 context.getLibrariesDependingOn(source).isEmpty) { | |
| 2111 context._removeFromCache(source); | |
| 2112 removalCount++; | |
| 2113 } | |
| 2114 } | 2108 } |
| 2115 int consistencyCheckEnd = JavaSystem.nanoTime(); | 2109 if (changedSources.length > 0 || removedSources.length > 0) { |
| 2116 if (changedSources.length > 0 || missingSources.length > 0) { | |
| 2117 StringBuffer buffer = new StringBuffer(); | 2110 StringBuffer buffer = new StringBuffer(); |
| 2118 buffer.write("Consistency check took "); | 2111 buffer.write("Consistency check took "); |
| 2119 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); | 2112 buffer.write(timer.elapsedMilliseconds); |
| 2120 buffer.writeln(" ms and found"); | 2113 buffer.writeln(" ms and found"); |
| 2121 buffer.write(" "); | 2114 buffer.write(" "); |
| 2122 buffer.write(changedSources.length); | 2115 buffer.write(changedSources.length); |
| 2123 buffer.writeln(" inconsistent entries"); | 2116 buffer.writeln(" changed sources"); |
| 2124 buffer.write(" "); | 2117 buffer.write(" "); |
| 2125 buffer.write(missingSources.length); | 2118 buffer.write(removedSources.length); |
| 2126 buffer.write(" missing sources ("); | 2119 buffer.write(" removed sources."); |
| 2127 buffer.write(removalCount); | |
| 2128 buffer.writeln(" removed"); | |
| 2129 for (Source source in missingSources) { | |
| 2130 buffer.write(" "); | |
| 2131 buffer.writeln(source.fullName); | |
| 2132 } | |
| 2133 context._logInformation(buffer.toString()); | 2120 context._logInformation(buffer.toString()); |
| 2134 } | 2121 } |
| 2135 return changedSources.length > 0; | 2122 return changedSources.isNotEmpty || removedSources.isNotEmpty; |
| 2136 } | 2123 } |
| 2137 } | 2124 } |
| 2138 | 2125 |
| 2139 /** | 2126 /** |
| 2140 * An object that manages the partitions that can be shared between analysis | 2127 * An object that manages the partitions that can be shared between analysis |
| 2141 * contexts. | 2128 * contexts. |
| 2142 */ | 2129 */ |
| 2143 class PartitionManager { | 2130 class PartitionManager { |
| 2144 /** | 2131 /** |
| 2145 * A table mapping SDK's to the partitions used for those SDK's. | 2132 * A table mapping SDK's to the partitions used for those SDK's. |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2301 } | 2288 } |
| 2302 DartSdk sdk = factory.dartSdk; | 2289 DartSdk sdk = factory.dartSdk; |
| 2303 if (sdk == null) { | 2290 if (sdk == null) { |
| 2304 throw new IllegalArgumentException( | 2291 throw new IllegalArgumentException( |
| 2305 "The source factory for an SDK analysis context must have a DartUriRes
olver"); | 2292 "The source factory for an SDK analysis context must have a DartUriRes
olver"); |
| 2306 } | 2293 } |
| 2307 return new AnalysisCache( | 2294 return new AnalysisCache( |
| 2308 <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]); | 2295 <CachePartition>[AnalysisEngine.instance.partitionManager.forSdk(sdk)]); |
| 2309 } | 2296 } |
| 2310 } | 2297 } |
| OLD | NEW |