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

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

Issue 1239863002: Add hook for listening to implicitly analyzed files (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 5 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 * The [TypeProvider] for this context, `null` if not yet created. 160 * The [TypeProvider] for this context, `null` if not yet created.
161 */ 161 */
162 TypeProvider _typeProvider; 162 TypeProvider _typeProvider;
163 163
164 /** 164 /**
165 * The controller for sending [SourcesChangedEvent]s. 165 * The controller for sending [SourcesChangedEvent]s.
166 */ 166 */
167 StreamController<SourcesChangedEvent> _onSourcesChangedController; 167 StreamController<SourcesChangedEvent> _onSourcesChangedController;
168 168
169 /** 169 /**
170 * A subscription for a stream of events indicating when files are (and are
171 * not) being implicitly analyzed.
172 */
173 StreamController<AnalyzedSourcesEvent> _analyzedSourcesController;
Paul Berry 2015/07/15 19:50:01 How about naming this "_implicitlyAnalyzedSourcesC
174
175 /**
170 * The listeners that are to be notified when various analysis results are 176 * The listeners that are to be notified when various analysis results are
171 * produced in this context. 177 * produced in this context.
172 */ 178 */
173 List<AnalysisListener> _listeners = new List<AnalysisListener>(); 179 List<AnalysisListener> _listeners = new List<AnalysisListener>();
174 180
175 /** 181 /**
176 * The most recently incrementally resolved source, or `null` when it was 182 * The most recently incrementally resolved source, or `null` when it was
177 * already validated, or the most recent change was not incrementally resolved . 183 * already validated, or the most recent change was not incrementally resolved .
178 */ 184 */
179 Source incrementalResolutionValidation_lastUnitSource; 185 Source incrementalResolutionValidation_lastUnitSource;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 _privatePartition = new UniversalCachePartition(this); 219 _privatePartition = new UniversalCachePartition(this);
214 _cache = createCacheFromSourceFactory(null); 220 _cache = createCacheFromSourceFactory(null);
215 _taskManager = AnalysisEngine.instance.taskManager; 221 _taskManager = AnalysisEngine.instance.taskManager;
216 // TODO(scheglov) Get WorkManager(Factory)(s) from plugins. 222 // TODO(scheglov) Get WorkManager(Factory)(s) from plugins.
217 dartWorkManager = new DartWorkManager(this); 223 dartWorkManager = new DartWorkManager(this);
218 htmlWorkManager = new HtmlWorkManager(this); 224 htmlWorkManager = new HtmlWorkManager(this);
219 driver = new AnalysisDriver( 225 driver = new AnalysisDriver(
220 _taskManager, <WorkManager>[dartWorkManager, htmlWorkManager], this); 226 _taskManager, <WorkManager>[dartWorkManager, htmlWorkManager], this);
221 _onSourcesChangedController = 227 _onSourcesChangedController =
222 new StreamController<SourcesChangedEvent>.broadcast(); 228 new StreamController<SourcesChangedEvent>.broadcast();
229 _analyzedSourcesController =
230 new StreamController<AnalyzedSourcesEvent>.broadcast();
223 } 231 }
224 232
225 @override 233 @override
226 AnalysisCache get analysisCache => _cache; 234 AnalysisCache get analysisCache => _cache;
227 235
228 @override 236 @override
229 AnalysisOptions get analysisOptions => _options; 237 AnalysisOptions get analysisOptions => _options;
230 238
231 @override 239 @override
232 void set analysisOptions(AnalysisOptions options) { 240 void set analysisOptions(AnalysisOptions options) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 _priorityOrder = Source.EMPTY_LIST; 282 _priorityOrder = Source.EMPTY_LIST;
275 } else { 283 } else {
276 _priorityOrder = sources; 284 _priorityOrder = sources;
277 } 285 }
278 } 286 }
279 dartWorkManager.applyPriorityTargets(_priorityOrder); 287 dartWorkManager.applyPriorityTargets(_priorityOrder);
280 htmlWorkManager.applyPriorityTargets(_priorityOrder); 288 htmlWorkManager.applyPriorityTargets(_priorityOrder);
281 } 289 }
282 290
283 @override 291 @override
292 Stream<AnalyzedSourcesEvent> get analyzedSources =>
293 _analyzedSourcesController.stream;
294
295 @override
284 set contentCache(ContentCache value) { 296 set contentCache(ContentCache value) {
285 _contentCache = value; 297 _contentCache = value;
286 } 298 }
287 299
288 @override 300 @override
289 DeclaredVariables get declaredVariables => _declaredVariables; 301 DeclaredVariables get declaredVariables => _declaredVariables;
290 302
291 @override 303 @override
292 List<AnalysisTarget> get explicitTargets { 304 List<AnalysisTarget> get explicitTargets {
293 List<AnalysisTarget> targets = <AnalysisTarget>[]; 305 List<AnalysisTarget> targets = <AnalysisTarget>[];
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 733
722 @override 734 @override
723 CacheEntry getCacheEntry(AnalysisTarget target) { 735 CacheEntry getCacheEntry(AnalysisTarget target) {
724 CacheEntry entry = _cache.get(target); 736 CacheEntry entry = _cache.get(target);
725 if (entry == null) { 737 if (entry == null) {
726 entry = new CacheEntry(target); 738 entry = new CacheEntry(target);
727 if (target is Source) { 739 if (target is Source) {
728 entry.modificationTime = getModificationStamp(target); 740 entry.modificationTime = getModificationStamp(target);
729 } 741 }
730 _cache.put(entry); 742 _cache.put(entry);
743 if (target is Source) {
744 _analyzedSourcesController.add(new AnalyzedSourcesEvent(target, true));
745 }
731 } 746 }
732 return entry; 747 return entry;
733 } 748 }
734 749
735 @override 750 @override
736 CompilationUnitElement getCompilationUnitElement( 751 CompilationUnitElement getCompilationUnitElement(
737 Source unitSource, Source librarySource) { 752 Source unitSource, Source librarySource) {
738 AnalysisTarget target = new LibrarySpecificUnit(librarySource, unitSource); 753 AnalysisTarget target = new LibrarySpecificUnit(librarySource, unitSource);
739 return _cache.getValue(target, COMPILATION_UNIT_ELEMENT); 754 return _cache.getValue(target, COMPILATION_UNIT_ELEMENT);
740 } 755 }
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 } 1227 }
1213 } 1228 }
1214 } 1229 }
1215 for (Source source in changedSources) { 1230 for (Source source in changedSources) {
1216 _sourceChanged(source); 1231 _sourceChanged(source);
1217 } 1232 }
1218 int removalCount = 0; 1233 int removalCount = 0;
1219 for (Source source in missingSources) { 1234 for (Source source in missingSources) {
1220 if (getLibrariesContaining(source).isEmpty && 1235 if (getLibrariesContaining(source).isEmpty &&
1221 getLibrariesDependingOn(source).isEmpty) { 1236 getLibrariesDependingOn(source).isEmpty) {
1222 _cache.remove(source); 1237 _removeFromCache(source);
1223 removalCount++; 1238 removalCount++;
1224 } 1239 }
1225 } 1240 }
1226 int consistencyCheckEnd = JavaSystem.nanoTime(); 1241 int consistencyCheckEnd = JavaSystem.nanoTime();
1227 if (changedSources.length > 0 || missingSources.length > 0) { 1242 if (changedSources.length > 0 || missingSources.length > 0) {
1228 StringBuffer buffer = new StringBuffer(); 1243 StringBuffer buffer = new StringBuffer();
1229 buffer.write("Consistency check took "); 1244 buffer.write("Consistency check took ");
1230 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); 1245 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
1231 buffer.writeln(" ms and found"); 1246 buffer.writeln(" ms and found");
1232 buffer.write(" "); 1247 buffer.write(" ");
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 /** 1435 /**
1421 * Create a cache entry for the given [source]. The source was explicitly 1436 * Create a cache entry for the given [source]. The source was explicitly
1422 * added to this context if [explicitlyAdded] is `true`. Return the cache 1437 * added to this context if [explicitlyAdded] is `true`. Return the cache
1423 * entry that was created. 1438 * entry that was created.
1424 */ 1439 */
1425 CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) { 1440 CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) {
1426 CacheEntry entry = new CacheEntry(source); 1441 CacheEntry entry = new CacheEntry(source);
1427 entry.modificationTime = getModificationStamp(source); 1442 entry.modificationTime = getModificationStamp(source);
1428 entry.explicitlyAdded = explicitlyAdded; 1443 entry.explicitlyAdded = explicitlyAdded;
1429 _cache.put(entry); 1444 _cache.put(entry);
1445 if (!explicitlyAdded) {
1446 _analyzedSourcesController.add(new AnalyzedSourcesEvent(source, true));
1447 }
1430 return entry; 1448 return entry;
1431 } 1449 }
1432 1450
1433 /** 1451 /**
1434 * Return a list containing all of the cache entries for targets associated 1452 * Return a list containing all of the cache entries for targets associated
1435 * with the given [source]. 1453 * with the given [source].
1436 */ 1454 */
1437 List<CacheEntry> _entriesFor(Source source) { 1455 List<CacheEntry> _entriesFor(Source source) {
1438 List<CacheEntry> entries = <CacheEntry>[]; 1456 List<CacheEntry> entries = <CacheEntry>[];
1439 MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator(); 1457 MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator();
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 * given [source] has been updated to the given [errors]. 1648 * given [source] has been updated to the given [errors].
1631 */ 1649 */
1632 void _notifyErrors( 1650 void _notifyErrors(
1633 Source source, List<AnalysisError> errors, LineInfo lineInfo) { 1651 Source source, List<AnalysisError> errors, LineInfo lineInfo) {
1634 int count = _listeners.length; 1652 int count = _listeners.length;
1635 for (int i = 0; i < count; i++) { 1653 for (int i = 0; i < count; i++) {
1636 _listeners[i].computedErrors(this, source, errors, lineInfo); 1654 _listeners[i].computedErrors(this, source, errors, lineInfo);
1637 } 1655 }
1638 } 1656 }
1639 1657
1658 void _removeFromCache(Source source) {
1659 CacheEntry entry = _cache.remove(source);
1660 if (entry != null && entry.explicitlyAdded) {
1661 _analyzedSourcesController.add(new AnalyzedSourcesEvent(source, false));
1662 }
1663 }
1664
1640 /** 1665 /**
1641 * Remove the given [source] from the priority order if it is in the list. 1666 * Remove the given [source] from the priority order if it is in the list.
1642 */ 1667 */
1643 void _removeFromPriorityOrder(Source source) { 1668 void _removeFromPriorityOrder(Source source) {
1644 int count = _priorityOrder.length; 1669 int count = _priorityOrder.length;
1645 List<Source> newOrder = <Source>[]; 1670 List<Source> newOrder = <Source>[];
1646 for (int i = 0; i < count; i++) { 1671 for (int i = 0; i < count; i++) {
1647 if (_priorityOrder[i] != source) { 1672 if (_priorityOrder[i] != source) {
1648 newOrder.add(_priorityOrder[i]); 1673 newOrder.add(_priorityOrder[i]);
1649 } 1674 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 // new AnalysisException("This source was marked as being deleted"), 1787 // new AnalysisException("This source was marked as being deleted"),
1763 // null)); 1788 // null));
1764 // } 1789 // }
1765 _removeFromPriorityOrder(source); 1790 _removeFromPriorityOrder(source);
1766 } 1791 }
1767 1792
1768 /** 1793 /**
1769 * Record that the given [source] has been removed. 1794 * Record that the given [source] has been removed.
1770 */ 1795 */
1771 void _sourceRemoved(Source source) { 1796 void _sourceRemoved(Source source) {
1772 _cache.remove(source); 1797 _removeFromCache(source);
1773 _removeFromPriorityOrder(source); 1798 _removeFromPriorityOrder(source);
1774 } 1799 }
1775 1800
1776 /** 1801 /**
1777 * TODO(scheglov) A hackish, limited incremental resolution implementation. 1802 * TODO(scheglov) A hackish, limited incremental resolution implementation.
1778 */ 1803 */
1779 bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) { 1804 bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
1780 return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() { 1805 return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
1781 incrementalResolutionValidation_lastUnitSource = null; 1806 incrementalResolutionValidation_lastUnitSource = null;
1782 incrementalResolutionValidation_lastLibrarySource = null; 1807 incrementalResolutionValidation_lastLibrarySource = null;
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
2022 new PendingFuture<T>(_context, target, computeValue); 2047 new PendingFuture<T>(_context, target, computeValue);
2023 if (!pendingFuture.evaluate(entry)) { 2048 if (!pendingFuture.evaluate(entry)) {
2024 _context._pendingFutureTargets 2049 _context._pendingFutureTargets
2025 .putIfAbsent(target, () => <PendingFuture>[]) 2050 .putIfAbsent(target, () => <PendingFuture>[])
2026 .add(pendingFuture); 2051 .add(pendingFuture);
2027 scheduleComputation(); 2052 scheduleComputation();
2028 } 2053 }
2029 return pendingFuture.future; 2054 return pendingFuture.future;
2030 } 2055 }
2031 } 2056 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698