| 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 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 541 @override | 541 @override |
| 542 List<Source> computeExportedLibraries(Source source) => | 542 List<Source> computeExportedLibraries(Source source) => |
| 543 _computeResult(source, EXPORTED_LIBRARIES); | 543 _computeResult(source, EXPORTED_LIBRARIES); |
| 544 | 544 |
| 545 @override | 545 @override |
| 546 // TODO(brianwilkerson) Implement this. | 546 // TODO(brianwilkerson) Implement this. |
| 547 HtmlElement computeHtmlElement(Source source) => null; | 547 HtmlElement computeHtmlElement(Source source) => null; |
| 548 | 548 |
| 549 @override | 549 @override |
| 550 List<Source> computeImportedLibraries(Source source) => | 550 List<Source> computeImportedLibraries(Source source) => |
| 551 _computeResult(source, IMPORTED_LIBRARIES); | 551 _computeResult(source, EXPLICITLY_IMPORTED_LIBRARIES); |
| 552 | 552 |
| 553 @override | 553 @override |
| 554 SourceKind computeKindOf(Source source) { | 554 SourceKind computeKindOf(Source source) { |
| 555 String name = source.shortName; | 555 String name = source.shortName; |
| 556 if (AnalysisEngine.isDartFileName(name)) { | 556 if (AnalysisEngine.isDartFileName(name)) { |
| 557 return _computeResult(source, SOURCE_KIND); | 557 return _computeResult(source, SOURCE_KIND); |
| 558 } else if (AnalysisEngine.isHtmlFileName(name)) { | 558 } else if (AnalysisEngine.isHtmlFileName(name)) { |
| 559 return SourceKind.HTML; | 559 return SourceKind.HTML; |
| 560 } | 560 } |
| 561 return SourceKind.UNKNOWN; | 561 return SourceKind.UNKNOWN; |
| (...skipping 846 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1408 */ | 1408 */ |
| 1409 cache.CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) { | 1409 cache.CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) { |
| 1410 cache.CacheEntry entry = new cache.CacheEntry(source); | 1410 cache.CacheEntry entry = new cache.CacheEntry(source); |
| 1411 entry.modificationTime = getModificationStamp(source); | 1411 entry.modificationTime = getModificationStamp(source); |
| 1412 entry.explicitlyAdded = explicitlyAdded; | 1412 entry.explicitlyAdded = explicitlyAdded; |
| 1413 _cache.put(entry); | 1413 _cache.put(entry); |
| 1414 return entry; | 1414 return entry; |
| 1415 } | 1415 } |
| 1416 | 1416 |
| 1417 /** | 1417 /** |
| 1418 * Return a list containing all of the cache entries for targets associated |
| 1419 * with the given [source]. |
| 1420 */ |
| 1421 List<cache.CacheEntry> _entriesFor(Source source) { |
| 1422 List<cache.CacheEntry> entries = <cache.CacheEntry>[]; |
| 1423 MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator(); |
| 1424 while (iterator.moveNext()) { |
| 1425 if (iterator.key.source == source) { |
| 1426 entries.add(iterator.value); |
| 1427 } |
| 1428 } |
| 1429 return entries; |
| 1430 } |
| 1431 |
| 1432 /** |
| 1418 * Return a list containing all of the change notices that are waiting to be | 1433 * Return a list containing all of the change notices that are waiting to be |
| 1419 * returned. If there are no notices, then return either `null` or an empty | 1434 * returned. If there are no notices, then return either `null` or an empty |
| 1420 * list, depending on the value of [nullIfEmpty]. | 1435 * list, depending on the value of [nullIfEmpty]. |
| 1421 */ | 1436 */ |
| 1422 List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) { | 1437 List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) { |
| 1423 if (_pendingNotices.isEmpty) { | 1438 if (_pendingNotices.isEmpty) { |
| 1424 if (nullIfEmpty) { | 1439 if (nullIfEmpty) { |
| 1425 return null; | 1440 return null; |
| 1426 } | 1441 } |
| 1427 return ChangeNoticeImpl.EMPTY_LIST; | 1442 return ChangeNoticeImpl.EMPTY_LIST; |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1744 return; | 1759 return; |
| 1745 } | 1760 } |
| 1746 // Check whether the content of the source is the same as it was the last | 1761 // Check whether the content of the source is the same as it was the last |
| 1747 // time. | 1762 // time. |
| 1748 String sourceContent = entry.getValue(CONTENT); | 1763 String sourceContent = entry.getValue(CONTENT); |
| 1749 if (sourceContent != null) { | 1764 if (sourceContent != null) { |
| 1750 entry.setState(CONTENT, CacheState.FLUSHED); | 1765 entry.setState(CONTENT, CacheState.FLUSHED); |
| 1751 try { | 1766 try { |
| 1752 TimestampedData<String> fileContents = getContents(source); | 1767 TimestampedData<String> fileContents = getContents(source); |
| 1753 if (fileContents.data == sourceContent) { | 1768 if (fileContents.data == sourceContent) { |
| 1769 int time = fileContents.modificationTime; |
| 1770 for (cache.CacheEntry entry in _entriesFor(source)) { |
| 1771 entry.modificationTime = time; |
| 1772 } |
| 1754 return; | 1773 return; |
| 1755 } | 1774 } |
| 1756 } catch (e) {} | 1775 } catch (e) {} |
| 1757 } | 1776 } |
| 1758 // We need to invalidate the cache. | 1777 // We need to invalidate the cache. |
| 1759 // TODO(brianwilkerson) Implement this. | 1778 // TODO(brianwilkerson) Implement this. |
| 1760 // _propagateInvalidation(source, entry); | 1779 // _propagateInvalidation(source, entry); |
| 1761 } | 1780 } |
| 1762 | 1781 |
| 1763 /** | 1782 /** |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1878 } | 1897 } |
| 1879 | 1898 |
| 1880 /** | 1899 /** |
| 1881 * Check the cache for any invalid entries (entries whose modification time | 1900 * Check the cache for any invalid entries (entries whose modification time |
| 1882 * does not match the modification time of the source associated with the | 1901 * does not match the modification time of the source associated with the |
| 1883 * entry). Invalid entries will be marked as invalid so that the source will | 1902 * entry). Invalid entries will be marked as invalid so that the source will |
| 1884 * be re-analyzed. Return `true` if at least one entry was invalid. | 1903 * be re-analyzed. Return `true` if at least one entry was invalid. |
| 1885 */ | 1904 */ |
| 1886 bool _validateCacheConsistency() { | 1905 bool _validateCacheConsistency() { |
| 1887 int consistencyCheckStart = JavaSystem.nanoTime(); | 1906 int consistencyCheckStart = JavaSystem.nanoTime(); |
| 1888 List<AnalysisTarget> changedTargets = new List<AnalysisTarget>(); | 1907 HashSet<Source> changedSources = new HashSet<Source>(); |
| 1889 List<AnalysisTarget> missingTargets = new List<AnalysisTarget>(); | 1908 HashSet<Source> missingSources = new HashSet<Source>(); |
| 1890 MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator(); | 1909 MapIterator<AnalysisTarget, cache.CacheEntry> iterator = _cache.iterator(); |
| 1891 while (iterator.moveNext()) { | 1910 while (iterator.moveNext()) { |
| 1892 AnalysisTarget target = iterator.key; | 1911 Source source = iterator.key.source; |
| 1893 cache.CacheEntry entry = iterator.value; | 1912 if (source != null) { |
| 1894 if (target is Source) { | 1913 cache.CacheEntry entry = iterator.value; |
| 1895 int sourceTime = getModificationStamp(target); | 1914 int sourceTime = getModificationStamp(source); |
| 1896 if (sourceTime != entry.modificationTime) { | 1915 if (sourceTime != entry.modificationTime) { |
| 1897 changedTargets.add(target); | 1916 changedSources.add(source); |
| 1898 } | 1917 } |
| 1899 } | 1918 if (entry.exception != null) { |
| 1900 if (entry.exception != null) { | 1919 if (!exists(source)) { |
| 1901 if (!exists(target)) { | 1920 missingSources.add(source); |
| 1902 missingTargets.add(target); | 1921 } |
| 1903 } | 1922 } |
| 1904 } | 1923 } |
| 1905 } | 1924 } |
| 1906 int count = changedTargets.length; | 1925 for (Source source in changedSources) { |
| 1907 for (int i = 0; i < count; i++) { | 1926 _sourceChanged(source); |
| 1908 _sourceChanged(changedTargets[i]); | |
| 1909 } | 1927 } |
| 1910 int removalCount = 0; | 1928 int removalCount = 0; |
| 1911 for (AnalysisTarget target in missingTargets) { | 1929 for (Source source in missingSources) { |
| 1912 if (target is Source && | 1930 if (getLibrariesContaining(source).isEmpty && |
| 1913 getLibrariesContaining(target).isEmpty && | 1931 getLibrariesDependingOn(source).isEmpty) { |
| 1914 getLibrariesDependingOn(target).isEmpty) { | 1932 _cache.remove(source); |
| 1915 _cache.remove(target); | |
| 1916 removalCount++; | 1933 removalCount++; |
| 1917 } | 1934 } |
| 1918 } | 1935 } |
| 1919 int consistencyCheckEnd = JavaSystem.nanoTime(); | 1936 int consistencyCheckEnd = JavaSystem.nanoTime(); |
| 1920 if (changedTargets.length > 0 || missingTargets.length > 0) { | 1937 if (changedSources.length > 0 || missingSources.length > 0) { |
| 1921 StringBuffer buffer = new StringBuffer(); | 1938 StringBuffer buffer = new StringBuffer(); |
| 1922 buffer.write("Consistency check took "); | 1939 buffer.write("Consistency check took "); |
| 1923 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); | 1940 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); |
| 1924 buffer.writeln(" ms and found"); | 1941 buffer.writeln(" ms and found"); |
| 1925 buffer.write(" "); | 1942 buffer.write(" "); |
| 1926 buffer.write(changedTargets.length); | 1943 buffer.write(changedSources.length); |
| 1927 buffer.writeln(" inconsistent entries"); | 1944 buffer.writeln(" inconsistent entries"); |
| 1928 buffer.write(" "); | 1945 buffer.write(" "); |
| 1929 buffer.write(missingTargets.length); | 1946 buffer.write(missingSources.length); |
| 1930 buffer.write(" missing sources ("); | 1947 buffer.write(" missing sources ("); |
| 1931 buffer.write(removalCount); | 1948 buffer.write(removalCount); |
| 1932 buffer.writeln(" removed"); | 1949 buffer.writeln(" removed"); |
| 1933 for (Source source in missingTargets) { | 1950 for (Source source in missingSources) { |
| 1934 buffer.write(" "); | 1951 buffer.write(" "); |
| 1935 buffer.writeln(source.fullName); | 1952 buffer.writeln(source.fullName); |
| 1936 } | 1953 } |
| 1937 _logInformation(buffer.toString()); | 1954 _logInformation(buffer.toString()); |
| 1938 } | 1955 } |
| 1939 return changedTargets.length > 0; | 1956 return changedSources.length > 0; |
| 1940 } | 1957 } |
| 1941 } | 1958 } |
| 1942 | 1959 |
| 1943 /** | 1960 /** |
| 1944 * An object that manages the partitions that can be shared between analysis | 1961 * An object that manages the partitions that can be shared between analysis |
| 1945 * contexts. | 1962 * contexts. |
| 1946 */ | 1963 */ |
| 1947 class PartitionManager { | 1964 class PartitionManager { |
| 1948 /** | 1965 /** |
| 1949 * A table mapping SDK's to the partitions used for those SDK's. | 1966 * A table mapping SDK's to the partitions used for those SDK's. |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2099 PendingFuture pendingFuture = | 2116 PendingFuture pendingFuture = |
| 2100 new PendingFuture<T>(_context, target, computeValue); | 2117 new PendingFuture<T>(_context, target, computeValue); |
| 2101 if (!pendingFuture.evaluate(entry)) { | 2118 if (!pendingFuture.evaluate(entry)) { |
| 2102 _context._pendingFutureTargets | 2119 _context._pendingFutureTargets |
| 2103 .putIfAbsent(target, () => <PendingFuture>[]) | 2120 .putIfAbsent(target, () => <PendingFuture>[]) |
| 2104 .add(pendingFuture); | 2121 .add(pendingFuture); |
| 2105 } | 2122 } |
| 2106 return pendingFuture.future; | 2123 return pendingFuture.future; |
| 2107 } | 2124 } |
| 2108 } | 2125 } |
| OLD | NEW |