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/instrumentation/instrumentation.dart'; | 10 import 'package:analyzer/instrumentation/instrumentation.dart'; |
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1044 // model. | 1044 // model. |
1045 throw new UnimplementedError( | 1045 throw new UnimplementedError( |
1046 'Not supported in the new task model; use parseHtmlDocument instead.'); | 1046 'Not supported in the new task model; use parseHtmlDocument instead.'); |
1047 } | 1047 } |
1048 | 1048 |
1049 @override | 1049 @override |
1050 AnalysisResult performAnalysisTask() { | 1050 AnalysisResult performAnalysisTask() { |
1051 return PerformanceStatistics.performAnaysis.makeCurrentWhile(() { | 1051 return PerformanceStatistics.performAnaysis.makeCurrentWhile(() { |
1052 _evaluatePendingFutures(); | 1052 _evaluatePendingFutures(); |
1053 bool done = !driver.performAnalysisTask(); | 1053 bool done = !driver.performAnalysisTask(); |
1054 if (done) { | |
1055 done = !_validateCacheConsistency(); | |
1056 } | |
1057 List<ChangeNotice> notices = _getChangeNotices(done); | 1054 List<ChangeNotice> notices = _getChangeNotices(done); |
1058 if (notices != null) { | 1055 if (notices != null) { |
1059 int noticeCount = notices.length; | 1056 int noticeCount = notices.length; |
1060 for (int i = 0; i < noticeCount; i++) { | 1057 for (int i = 0; i < noticeCount; i++) { |
1061 ChangeNotice notice = notices[i]; | 1058 ChangeNotice notice = notices[i]; |
1062 _notifyErrors(notice.source, notice.errors, notice.lineInfo); | 1059 _notifyErrors(notice.source, notice.errors, notice.lineInfo); |
1063 } | 1060 } |
1064 } | 1061 } |
1065 return new AnalysisResult(notices, -1, '', -1); | 1062 return new AnalysisResult(notices, -1, '', -1); |
1066 }); | 1063 }); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 if (source.isInSystemLibrary) { | 1178 if (source.isInSystemLibrary) { |
1182 return _options.generateSdkErrors; | 1179 return _options.generateSdkErrors; |
1183 } else if (!entry.explicitlyAdded) { | 1180 } else if (!entry.explicitlyAdded) { |
1184 return _options.generateImplicitErrors; | 1181 return _options.generateImplicitErrors; |
1185 } else { | 1182 } else { |
1186 return true; | 1183 return true; |
1187 } | 1184 } |
1188 } | 1185 } |
1189 | 1186 |
1190 @override | 1187 @override |
| 1188 bool validateCacheConsistency() { |
| 1189 int consistencyCheckStart = JavaSystem.nanoTime(); |
| 1190 HashSet<Source> changedSources = new HashSet<Source>(); |
| 1191 HashSet<Source> missingSources = new HashSet<Source>(); |
| 1192 for (Source source in _cache.sources) { |
| 1193 CacheEntry entry = _cache.get(source); |
| 1194 int sourceTime = getModificationStamp(source); |
| 1195 if (sourceTime != entry.modificationTime) { |
| 1196 changedSources.add(source); |
| 1197 } |
| 1198 if (entry.exception != null) { |
| 1199 if (!exists(source)) { |
| 1200 missingSources.add(source); |
| 1201 } |
| 1202 } |
| 1203 } |
| 1204 for (Source source in changedSources) { |
| 1205 _sourceChanged(source); |
| 1206 } |
| 1207 int removalCount = 0; |
| 1208 for (Source source in missingSources) { |
| 1209 if (getLibrariesContaining(source).isEmpty && |
| 1210 getLibrariesDependingOn(source).isEmpty) { |
| 1211 _cache.remove(source); |
| 1212 removalCount++; |
| 1213 } |
| 1214 } |
| 1215 int consistencyCheckEnd = JavaSystem.nanoTime(); |
| 1216 if (changedSources.length > 0 || missingSources.length > 0) { |
| 1217 StringBuffer buffer = new StringBuffer(); |
| 1218 buffer.write("Consistency check took "); |
| 1219 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); |
| 1220 buffer.writeln(" ms and found"); |
| 1221 buffer.write(" "); |
| 1222 buffer.write(changedSources.length); |
| 1223 buffer.writeln(" inconsistent entries"); |
| 1224 buffer.write(" "); |
| 1225 buffer.write(missingSources.length); |
| 1226 buffer.write(" missing sources ("); |
| 1227 buffer.write(removalCount); |
| 1228 buffer.writeln(" removed"); |
| 1229 for (Source source in missingSources) { |
| 1230 buffer.write(" "); |
| 1231 buffer.writeln(source.fullName); |
| 1232 } |
| 1233 _logInformation(buffer.toString()); |
| 1234 } |
| 1235 return changedSources.length > 0; |
| 1236 } |
| 1237 |
| 1238 @override |
1191 void visitCacheItems(void callback(Source source, SourceEntry dartEntry, | 1239 void visitCacheItems(void callback(Source source, SourceEntry dartEntry, |
1192 DataDescriptor rowDesc, CacheState state)) { | 1240 DataDescriptor rowDesc, CacheState state)) { |
1193 // TODO(brianwilkerson) Figure out where this is used and either remove it | 1241 // TODO(brianwilkerson) Figure out where this is used and either remove it |
1194 // or adjust the call sites to use CacheEntry's. | 1242 // or adjust the call sites to use CacheEntry's. |
1195 // bool hintsEnabled = _options.hint; | 1243 // bool hintsEnabled = _options.hint; |
1196 // bool lintsEnabled = _options.lint; | 1244 // bool lintsEnabled = _options.lint; |
1197 // MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator()
; | 1245 // MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator()
; |
1198 // while (iterator.moveNext()) { | 1246 // while (iterator.moveNext()) { |
1199 // Source source = iterator.key; | 1247 // Source source = iterator.key; |
1200 // cache.CacheEntry entry = iterator.value; | 1248 // cache.CacheEntry entry = iterator.value; |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 notice.resolvedDartUnit = oldUnit; | 1812 notice.resolvedDartUnit = oldUnit; |
1765 AnalysisErrorInfo errorInfo = getErrors(unitSource); | 1813 AnalysisErrorInfo errorInfo = getErrors(unitSource); |
1766 notice.setErrors(errorInfo.errors, errorInfo.lineInfo); | 1814 notice.setErrors(errorInfo.errors, errorInfo.lineInfo); |
1767 } | 1815 } |
1768 // schedule | 1816 // schedule |
1769 dartWorkManager.unitIncrementallyResolved(librarySource, unitSource); | 1817 dartWorkManager.unitIncrementallyResolved(librarySource, unitSource); |
1770 // OK | 1818 // OK |
1771 return true; | 1819 return true; |
1772 }); | 1820 }); |
1773 } | 1821 } |
1774 | |
1775 /** | |
1776 * Check the cache for any invalid entries (entries whose modification time | |
1777 * does not match the modification time of the source associated with the | |
1778 * entry). Invalid entries will be marked as invalid so that the source will | |
1779 * be re-analyzed. Return `true` if at least one entry was invalid. | |
1780 */ | |
1781 bool _validateCacheConsistency() { | |
1782 int consistencyCheckStart = JavaSystem.nanoTime(); | |
1783 HashSet<Source> changedSources = new HashSet<Source>(); | |
1784 HashSet<Source> missingSources = new HashSet<Source>(); | |
1785 for (Source source in _cache.sources) { | |
1786 CacheEntry entry = _cache.get(source); | |
1787 int sourceTime = getModificationStamp(source); | |
1788 if (sourceTime != entry.modificationTime) { | |
1789 changedSources.add(source); | |
1790 } | |
1791 if (entry.exception != null) { | |
1792 if (!exists(source)) { | |
1793 missingSources.add(source); | |
1794 } | |
1795 } | |
1796 } | |
1797 for (Source source in changedSources) { | |
1798 _sourceChanged(source); | |
1799 } | |
1800 int removalCount = 0; | |
1801 for (Source source in missingSources) { | |
1802 if (getLibrariesContaining(source).isEmpty && | |
1803 getLibrariesDependingOn(source).isEmpty) { | |
1804 _cache.remove(source); | |
1805 removalCount++; | |
1806 } | |
1807 } | |
1808 int consistencyCheckEnd = JavaSystem.nanoTime(); | |
1809 if (changedSources.length > 0 || missingSources.length > 0) { | |
1810 StringBuffer buffer = new StringBuffer(); | |
1811 buffer.write("Consistency check took "); | |
1812 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); | |
1813 buffer.writeln(" ms and found"); | |
1814 buffer.write(" "); | |
1815 buffer.write(changedSources.length); | |
1816 buffer.writeln(" inconsistent entries"); | |
1817 buffer.write(" "); | |
1818 buffer.write(missingSources.length); | |
1819 buffer.write(" missing sources ("); | |
1820 buffer.write(removalCount); | |
1821 buffer.writeln(" removed"); | |
1822 for (Source source in missingSources) { | |
1823 buffer.write(" "); | |
1824 buffer.writeln(source.fullName); | |
1825 } | |
1826 _logInformation(buffer.toString()); | |
1827 } | |
1828 return changedSources.length > 0; | |
1829 } | |
1830 } | 1822 } |
1831 | 1823 |
1832 /** | 1824 /** |
1833 * An object that manages the partitions that can be shared between analysis | 1825 * An object that manages the partitions that can be shared between analysis |
1834 * contexts. | 1826 * contexts. |
1835 */ | 1827 */ |
1836 class PartitionManager { | 1828 class PartitionManager { |
1837 /** | 1829 /** |
1838 * A table mapping SDK's to the partitions used for those SDK's. | 1830 * A table mapping SDK's to the partitions used for those SDK's. |
1839 */ | 1831 */ |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2008 new PendingFuture<T>(_context, target, computeValue); | 2000 new PendingFuture<T>(_context, target, computeValue); |
2009 if (!pendingFuture.evaluate(entry)) { | 2001 if (!pendingFuture.evaluate(entry)) { |
2010 _context._pendingFutureTargets | 2002 _context._pendingFutureTargets |
2011 .putIfAbsent(target, () => <PendingFuture>[]) | 2003 .putIfAbsent(target, () => <PendingFuture>[]) |
2012 .add(pendingFuture); | 2004 .add(pendingFuture); |
2013 scheduleComputation(); | 2005 scheduleComputation(); |
2014 } | 2006 } |
2015 return pendingFuture.future; | 2007 return pendingFuture.future; |
2016 } | 2008 } |
2017 } | 2009 } |
OLD | NEW |