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

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

Issue 1195183002: Move cache consistency validation into Analysis Server. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 6 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
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/instrumentation/instrumentation.dart'; 10 import 'package:analyzer/instrumentation/instrumentation.dart';
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 if (source.isInSystemLibrary) { 1177 if (source.isInSystemLibrary) {
1181 return _options.generateSdkErrors; 1178 return _options.generateSdkErrors;
1182 } else if (!entry.explicitlyAdded) { 1179 } else if (!entry.explicitlyAdded) {
1183 return _options.generateImplicitErrors; 1180 return _options.generateImplicitErrors;
1184 } else { 1181 } else {
1185 return true; 1182 return true;
1186 } 1183 }
1187 } 1184 }
1188 1185
1189 @override 1186 @override
1187 bool validateSourceCacheConsistency(Source source) {
1188 CacheEntry entry = _cache.get(source);
1189 if (entry != null) {
1190 int sourceTime = getModificationStamp(source);
1191 if (sourceTime != entry.modificationTime) {
1192 _sourceChanged(source);
1193 return true;
1194 }
1195 if (entry.exception != null) {
1196 if (!exists(source)) {
1197 if (getLibrariesContaining(source).isEmpty &&
1198 getLibrariesDependingOn(source).isEmpty) {
1199 _cache.remove(source);
1200 }
1201 }
1202 }
1203 }
1204 return false;
1205 }
1206
1207 @override
1190 void visitCacheItems(void callback(Source source, SourceEntry dartEntry, 1208 void visitCacheItems(void callback(Source source, SourceEntry dartEntry,
1191 DataDescriptor rowDesc, CacheState state)) { 1209 DataDescriptor rowDesc, CacheState state)) {
1192 // TODO(brianwilkerson) Figure out where this is used and either remove it 1210 // TODO(brianwilkerson) Figure out where this is used and either remove it
1193 // or adjust the call sites to use CacheEntry's. 1211 // or adjust the call sites to use CacheEntry's.
1194 // bool hintsEnabled = _options.hint; 1212 // bool hintsEnabled = _options.hint;
1195 // bool lintsEnabled = _options.lint; 1213 // bool lintsEnabled = _options.lint;
1196 // MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator() ; 1214 // MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator() ;
1197 // while (iterator.moveNext()) { 1215 // while (iterator.moveNext()) {
1198 // Source source = iterator.key; 1216 // Source source = iterator.key;
1199 // cache.CacheEntry entry = iterator.value; 1217 // cache.CacheEntry entry = iterator.value;
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after
1576 // entry.getState(HtmlEntry.RESOLVED_UNIT); 1594 // entry.getState(HtmlEntry.RESOLVED_UNIT);
1577 // if (resolvedUnitState == CacheState.INVALID || 1595 // if (resolvedUnitState == CacheState.INVALID ||
1578 // (isPriority && resolvedUnitState == CacheState.FLUSHED)) { 1596 // (isPriority && resolvedUnitState == CacheState.FLUSHED)) {
1579 // sources.add(source); 1597 // sources.add(source);
1580 // return; 1598 // return;
1581 // } 1599 // }
1582 } 1600 }
1583 } 1601 }
1584 1602
1585 /** 1603 /**
1586 * Log the given debugging [message].
1587 */
1588 void _logInformation(String message) {
1589 AnalysisEngine.instance.logger.logInformation(message);
1590 }
1591
1592 /**
1593 * Notify all of the analysis listeners that the errors associated with the 1604 * Notify all of the analysis listeners that the errors associated with the
1594 * given [source] has been updated to the given [errors]. 1605 * given [source] has been updated to the given [errors].
1595 */ 1606 */
1596 void _notifyErrors( 1607 void _notifyErrors(
1597 Source source, List<AnalysisError> errors, LineInfo lineInfo) { 1608 Source source, List<AnalysisError> errors, LineInfo lineInfo) {
1598 int count = _listeners.length; 1609 int count = _listeners.length;
1599 for (int i = 0; i < count; i++) { 1610 for (int i = 0; i < count; i++) {
1600 _listeners[i].computedErrors(this, source, errors, lineInfo); 1611 _listeners[i].computedErrors(this, source, errors, lineInfo);
1601 } 1612 }
1602 } 1613 }
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 notice.resolvedDartUnit = oldUnit; 1774 notice.resolvedDartUnit = oldUnit;
1764 AnalysisErrorInfo errorInfo = getErrors(unitSource); 1775 AnalysisErrorInfo errorInfo = getErrors(unitSource);
1765 notice.setErrors(errorInfo.errors, errorInfo.lineInfo); 1776 notice.setErrors(errorInfo.errors, errorInfo.lineInfo);
1766 } 1777 }
1767 // schedule 1778 // schedule
1768 dartWorkManager.unitIncrementallyResolved(librarySource, unitSource); 1779 dartWorkManager.unitIncrementallyResolved(librarySource, unitSource);
1769 // OK 1780 // OK
1770 return true; 1781 return true;
1771 }); 1782 });
1772 } 1783 }
1773
1774 /**
1775 * Check the cache for any invalid entries (entries whose modification time
1776 * does not match the modification time of the source associated with the
1777 * entry). Invalid entries will be marked as invalid so that the source will
1778 * be re-analyzed. Return `true` if at least one entry was invalid.
1779 */
1780 bool _validateCacheConsistency() {
1781 int consistencyCheckStart = JavaSystem.nanoTime();
1782 HashSet<Source> changedSources = new HashSet<Source>();
1783 HashSet<Source> missingSources = new HashSet<Source>();
1784 for (Source source in _cache.sources) {
1785 CacheEntry entry = _cache.get(source);
1786 int sourceTime = getModificationStamp(source);
1787 if (sourceTime != entry.modificationTime) {
1788 changedSources.add(source);
1789 }
1790 if (entry.exception != null) {
1791 if (!exists(source)) {
1792 missingSources.add(source);
1793 }
1794 }
1795 }
1796 for (Source source in changedSources) {
1797 _sourceChanged(source);
1798 }
1799 int removalCount = 0;
1800 for (Source source in missingSources) {
1801 if (getLibrariesContaining(source).isEmpty &&
1802 getLibrariesDependingOn(source).isEmpty) {
1803 _cache.remove(source);
1804 removalCount++;
1805 }
1806 }
1807 int consistencyCheckEnd = JavaSystem.nanoTime();
1808 if (changedSources.length > 0 || missingSources.length > 0) {
1809 StringBuffer buffer = new StringBuffer();
1810 buffer.write("Consistency check took ");
1811 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
1812 buffer.writeln(" ms and found");
1813 buffer.write(" ");
1814 buffer.write(changedSources.length);
1815 buffer.writeln(" inconsistent entries");
1816 buffer.write(" ");
1817 buffer.write(missingSources.length);
1818 buffer.write(" missing sources (");
1819 buffer.write(removalCount);
1820 buffer.writeln(" removed");
1821 for (Source source in missingSources) {
1822 buffer.write(" ");
1823 buffer.writeln(source.fullName);
1824 }
1825 _logInformation(buffer.toString());
1826 }
1827 return changedSources.length > 0;
1828 }
1829 } 1784 }
1830 1785
1831 /** 1786 /**
1832 * An object that manages the partitions that can be shared between analysis 1787 * An object that manages the partitions that can be shared between analysis
1833 * contexts. 1788 * contexts.
1834 */ 1789 */
1835 class PartitionManager { 1790 class PartitionManager {
1836 /** 1791 /**
1837 * A table mapping SDK's to the partitions used for those SDK's. 1792 * A table mapping SDK's to the partitions used for those SDK's.
1838 */ 1793 */
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
2007 new PendingFuture<T>(_context, target, computeValue); 1962 new PendingFuture<T>(_context, target, computeValue);
2008 if (!pendingFuture.evaluate(entry)) { 1963 if (!pendingFuture.evaluate(entry)) {
2009 _context._pendingFutureTargets 1964 _context._pendingFutureTargets
2010 .putIfAbsent(target, () => <PendingFuture>[]) 1965 .putIfAbsent(target, () => <PendingFuture>[])
2011 .add(pendingFuture); 1966 .add(pendingFuture);
2012 scheduleComputation(); 1967 scheduleComputation();
2013 } 1968 }
2014 return pendingFuture.future; 1969 return pendingFuture.future;
2015 } 1970 }
2016 } 1971 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698