OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
7 | 7 |
8 library engine; | 8 library engine; |
9 | 9 |
10 import 'dart:async'; | 10 import 'dart:async'; |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 void setChangedContents( | 856 void setChangedContents( |
857 Source source, String contents, int offset, int oldLength, int newLength); | 857 Source source, String contents, int offset, int oldLength, int newLength); |
858 | 858 |
859 /** | 859 /** |
860 * Set the contents of the given [source] to the given [contents] and mark the | 860 * Set the contents of the given [source] to the given [contents] and mark the |
861 * source as having changed. This has the effect of overriding the default | 861 * source as having changed. This has the effect of overriding the default |
862 * contents of the source. If the contents are `null` the override is removed | 862 * contents of the source. If the contents are `null` the override is removed |
863 * so that the default contents will be returned. | 863 * so that the default contents will be returned. |
864 */ | 864 */ |
865 void setContents(Source source, String contents); | 865 void setContents(Source source, String contents); |
| 866 |
| 867 /** |
| 868 * Check the cache for any invalid entries (entries whose modification time |
| 869 * does not match the modification time of the source associated with the |
| 870 * entry). Invalid entries will be marked as invalid so that the source will |
| 871 * be re-analyzed. Return `true` if at least one entry was invalid. |
| 872 */ |
| 873 bool validateCacheConsistency(); |
866 } | 874 } |
867 | 875 |
868 /** | 876 /** |
869 * An [AnalysisContext]. | 877 * An [AnalysisContext]. |
870 */ | 878 */ |
871 class AnalysisContextImpl implements InternalAnalysisContext { | 879 class AnalysisContextImpl implements InternalAnalysisContext { |
872 /** | 880 /** |
873 * The difference between the maximum cache size and the maximum priority | 881 * The difference between the maximum cache size and the maximum priority |
874 * order size. The priority list must be capped so that it is less than the | 882 * order size. The priority list must be capped so that it is less than the |
875 * cache size. Failure to do so can result in an infinite loop in | 883 * cache size. Failure to do so can result in an infinite loop in |
(...skipping 1387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2263 @override | 2271 @override |
2264 AnalysisResult performAnalysisTask() { | 2272 AnalysisResult performAnalysisTask() { |
2265 if (_TRACE_PERFORM_TASK) { | 2273 if (_TRACE_PERFORM_TASK) { |
2266 print("----------------------------------------"); | 2274 print("----------------------------------------"); |
2267 } | 2275 } |
2268 return PerformanceStatistics.performAnaysis.makeCurrentWhile(() { | 2276 return PerformanceStatistics.performAnaysis.makeCurrentWhile(() { |
2269 int getStart = JavaSystem.currentTimeMillis(); | 2277 int getStart = JavaSystem.currentTimeMillis(); |
2270 AnalysisTask task = PerformanceStatistics.nextTask | 2278 AnalysisTask task = PerformanceStatistics.nextTask |
2271 .makeCurrentWhile(() => nextAnalysisTask); | 2279 .makeCurrentWhile(() => nextAnalysisTask); |
2272 int getEnd = JavaSystem.currentTimeMillis(); | 2280 int getEnd = JavaSystem.currentTimeMillis(); |
2273 if (task == null && _validateCacheConsistency()) { | |
2274 task = nextAnalysisTask; | |
2275 } | |
2276 if (task == null) { | 2281 if (task == null) { |
2277 _validateLastIncrementalResolutionResult(); | 2282 _validateLastIncrementalResolutionResult(); |
2278 if (_performAnalysisTaskStopwatch != null) { | 2283 if (_performAnalysisTaskStopwatch != null) { |
2279 AnalysisEngine.instance.instrumentationService.logPerformance( | 2284 AnalysisEngine.instance.instrumentationService.logPerformance( |
2280 AnalysisPerformanceKind.FULL, _performAnalysisTaskStopwatch, | 2285 AnalysisPerformanceKind.FULL, _performAnalysisTaskStopwatch, |
2281 'context_id=$_id'); | 2286 'context_id=$_id'); |
2282 _performAnalysisTaskStopwatch = null; | 2287 _performAnalysisTaskStopwatch = null; |
2283 } | 2288 } |
2284 return new AnalysisResult( | 2289 return new AnalysisResult( |
2285 _getChangeNotices(true), getEnd - getStart, null, -1); | 2290 _getChangeNotices(true), getEnd - getStart, null, -1); |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2560 if (source.isInSystemLibrary) { | 2565 if (source.isInSystemLibrary) { |
2561 return _generateSdkErrors; | 2566 return _generateSdkErrors; |
2562 } else if (!dartEntry.explicitlyAdded) { | 2567 } else if (!dartEntry.explicitlyAdded) { |
2563 return _generateImplicitErrors; | 2568 return _generateImplicitErrors; |
2564 } else { | 2569 } else { |
2565 return true; | 2570 return true; |
2566 } | 2571 } |
2567 } | 2572 } |
2568 | 2573 |
2569 @override | 2574 @override |
| 2575 bool validateCacheConsistency() { |
| 2576 int consistencyCheckStart = JavaSystem.nanoTime(); |
| 2577 List<Source> changedSources = new List<Source>(); |
| 2578 List<Source> missingSources = new List<Source>(); |
| 2579 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
| 2580 while (iterator.moveNext()) { |
| 2581 Source source = iterator.key; |
| 2582 SourceEntry sourceEntry = iterator.value; |
| 2583 int sourceTime = getModificationStamp(source); |
| 2584 if (sourceTime != sourceEntry.modificationTime) { |
| 2585 changedSources.add(source); |
| 2586 } |
| 2587 if (sourceEntry.exception != null) { |
| 2588 if (!exists(source)) { |
| 2589 missingSources.add(source); |
| 2590 } |
| 2591 } |
| 2592 } |
| 2593 int count = changedSources.length; |
| 2594 for (int i = 0; i < count; i++) { |
| 2595 _sourceChanged(changedSources[i]); |
| 2596 } |
| 2597 int removalCount = 0; |
| 2598 for (Source source in missingSources) { |
| 2599 if (getLibrariesContaining(source).isEmpty && |
| 2600 getLibrariesDependingOn(source).isEmpty) { |
| 2601 _cache.remove(source); |
| 2602 removalCount++; |
| 2603 } |
| 2604 } |
| 2605 int consistencyCheckEnd = JavaSystem.nanoTime(); |
| 2606 if (changedSources.length > 0 || missingSources.length > 0) { |
| 2607 StringBuffer buffer = new StringBuffer(); |
| 2608 buffer.write("Consistency check took "); |
| 2609 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); |
| 2610 buffer.writeln(" ms and found"); |
| 2611 buffer.write(" "); |
| 2612 buffer.write(changedSources.length); |
| 2613 buffer.writeln(" inconsistent entries"); |
| 2614 buffer.write(" "); |
| 2615 buffer.write(missingSources.length); |
| 2616 buffer.write(" missing sources ("); |
| 2617 buffer.write(removalCount); |
| 2618 buffer.writeln(" removed"); |
| 2619 for (Source source in missingSources) { |
| 2620 buffer.write(" "); |
| 2621 buffer.writeln(source.fullName); |
| 2622 } |
| 2623 _logInformation(buffer.toString()); |
| 2624 } |
| 2625 return changedSources.length > 0; |
| 2626 } |
| 2627 |
| 2628 @override |
2570 void visitCacheItems(void callback(Source source, SourceEntry dartEntry, | 2629 void visitCacheItems(void callback(Source source, SourceEntry dartEntry, |
2571 DataDescriptor rowDesc, CacheState state)) { | 2630 DataDescriptor rowDesc, CacheState state)) { |
2572 bool hintsEnabled = _options.hint; | 2631 bool hintsEnabled = _options.hint; |
2573 bool lintsEnabled = _options.lint; | 2632 bool lintsEnabled = _options.lint; |
2574 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); | 2633 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); |
2575 while (iterator.moveNext()) { | 2634 while (iterator.moveNext()) { |
2576 Source source = iterator.key; | 2635 Source source = iterator.key; |
2577 SourceEntry sourceEntry = iterator.value; | 2636 SourceEntry sourceEntry = iterator.value; |
2578 for (DataDescriptor descriptor in sourceEntry.descriptors) { | 2637 for (DataDescriptor descriptor in sourceEntry.descriptors) { |
2579 if (descriptor == DartEntry.SOURCE_KIND) { | 2638 if (descriptor == DartEntry.SOURCE_KIND) { |
(...skipping 1446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4026 bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) => | 4085 bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) => |
4027 false; | 4086 false; |
4028 | 4087 |
4029 /** | 4088 /** |
4030 * Log the given debugging [message]. | 4089 * Log the given debugging [message]. |
4031 */ | 4090 */ |
4032 void _logInformation(String message) { | 4091 void _logInformation(String message) { |
4033 AnalysisEngine.instance.logger.logInformation(message); | 4092 AnalysisEngine.instance.logger.logInformation(message); |
4034 } | 4093 } |
4035 | 4094 |
4036 /** | |
4037 * Notify all of the analysis listeners that a task is about to be performed. | |
4038 */ | |
4039 void _notifyAboutToPerformTask(String taskDescription) { | |
4040 int count = _listeners.length; | |
4041 for (int i = 0; i < count; i++) { | |
4042 _listeners[i].aboutToPerformTask(this, taskDescription); | |
4043 } | |
4044 } | |
4045 | |
4046 // /** | 4095 // /** |
4047 // * Notify all of the analysis listeners that the given source is no longer i
ncluded in the set of | 4096 // * Notify all of the analysis listeners that the given source is no longer i
ncluded in the set of |
4048 // * sources that are being analyzed. | 4097 // * sources that are being analyzed. |
4049 // * | 4098 // * |
4050 // * @param source the source that is no longer being analyzed | 4099 // * @param source the source that is no longer being analyzed |
4051 // */ | 4100 // */ |
4052 // void _notifyExcludedSource(Source source) { | 4101 // void _notifyExcludedSource(Source source) { |
4053 // int count = _listeners.length; | 4102 // int count = _listeners.length; |
4054 // for (int i = 0; i < count; i++) { | 4103 // for (int i = 0; i < count; i++) { |
4055 // _listeners[i].excludedSource(this, source); | 4104 // _listeners[i].excludedSource(this, source); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4115 // * @param unit the result of resolving the source | 4164 // * @param unit the result of resolving the source |
4116 // */ | 4165 // */ |
4117 // void _notifyResolvedHtml(Source source, ht.HtmlUnit unit) { | 4166 // void _notifyResolvedHtml(Source source, ht.HtmlUnit unit) { |
4118 // int count = _listeners.length; | 4167 // int count = _listeners.length; |
4119 // for (int i = 0; i < count; i++) { | 4168 // for (int i = 0; i < count; i++) { |
4120 // _listeners[i].resolvedHtml(this, source, unit); | 4169 // _listeners[i].resolvedHtml(this, source, unit); |
4121 // } | 4170 // } |
4122 // } | 4171 // } |
4123 | 4172 |
4124 /** | 4173 /** |
| 4174 * Notify all of the analysis listeners that a task is about to be performed. |
| 4175 */ |
| 4176 void _notifyAboutToPerformTask(String taskDescription) { |
| 4177 int count = _listeners.length; |
| 4178 for (int i = 0; i < count; i++) { |
| 4179 _listeners[i].aboutToPerformTask(this, taskDescription); |
| 4180 } |
| 4181 } |
| 4182 |
| 4183 /** |
4125 * Notify all of the analysis listeners that the errors associated with the | 4184 * Notify all of the analysis listeners that the errors associated with the |
4126 * given [source] has been updated to the given [errors]. | 4185 * given [source] has been updated to the given [errors]. |
4127 */ | 4186 */ |
4128 void _notifyErrors( | 4187 void _notifyErrors( |
4129 Source source, List<AnalysisError> errors, LineInfo lineInfo) { | 4188 Source source, List<AnalysisError> errors, LineInfo lineInfo) { |
4130 int count = _listeners.length; | 4189 int count = _listeners.length; |
4131 for (int i = 0; i < count; i++) { | 4190 for (int i = 0; i < count; i++) { |
4132 _listeners[i].computedErrors(this, source, errors, lineInfo); | 4191 _listeners[i].computedErrors(this, source, errors, lineInfo); |
4133 } | 4192 } |
4134 } | 4193 } |
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4725 LineInfo lineInfo = getLineInfo(unitSource); | 4784 LineInfo lineInfo = getLineInfo(unitSource); |
4726 ChangeNoticeImpl notice = getNotice(unitSource); | 4785 ChangeNoticeImpl notice = getNotice(unitSource); |
4727 notice.resolvedDartUnit = oldUnit; | 4786 notice.resolvedDartUnit = oldUnit; |
4728 notice.setErrors(dartEntry.allErrors, lineInfo); | 4787 notice.setErrors(dartEntry.allErrors, lineInfo); |
4729 } | 4788 } |
4730 // OK | 4789 // OK |
4731 return true; | 4790 return true; |
4732 }); | 4791 }); |
4733 } | 4792 } |
4734 | 4793 |
4735 /** | |
4736 * Check the cache for any invalid entries (entries whose modification time | |
4737 * does not match the modification time of the source associated with the | |
4738 * entry). Invalid entries will be marked as invalid so that the source will | |
4739 * be re-analyzed. Return `true` if at least one entry was invalid. | |
4740 */ | |
4741 bool _validateCacheConsistency() { | |
4742 int consistencyCheckStart = JavaSystem.nanoTime(); | |
4743 List<Source> changedSources = new List<Source>(); | |
4744 List<Source> missingSources = new List<Source>(); | |
4745 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); | |
4746 while (iterator.moveNext()) { | |
4747 Source source = iterator.key; | |
4748 SourceEntry sourceEntry = iterator.value; | |
4749 int sourceTime = getModificationStamp(source); | |
4750 if (sourceTime != sourceEntry.modificationTime) { | |
4751 changedSources.add(source); | |
4752 } | |
4753 if (sourceEntry.exception != null) { | |
4754 if (!exists(source)) { | |
4755 missingSources.add(source); | |
4756 } | |
4757 } | |
4758 } | |
4759 int count = changedSources.length; | |
4760 for (int i = 0; i < count; i++) { | |
4761 _sourceChanged(changedSources[i]); | |
4762 } | |
4763 int removalCount = 0; | |
4764 for (Source source in missingSources) { | |
4765 if (getLibrariesContaining(source).isEmpty && | |
4766 getLibrariesDependingOn(source).isEmpty) { | |
4767 _cache.remove(source); | |
4768 removalCount++; | |
4769 } | |
4770 } | |
4771 int consistencyCheckEnd = JavaSystem.nanoTime(); | |
4772 if (changedSources.length > 0 || missingSources.length > 0) { | |
4773 StringBuffer buffer = new StringBuffer(); | |
4774 buffer.write("Consistency check took "); | |
4775 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); | |
4776 buffer.writeln(" ms and found"); | |
4777 buffer.write(" "); | |
4778 buffer.write(changedSources.length); | |
4779 buffer.writeln(" inconsistent entries"); | |
4780 buffer.write(" "); | |
4781 buffer.write(missingSources.length); | |
4782 buffer.write(" missing sources ("); | |
4783 buffer.write(removalCount); | |
4784 buffer.writeln(" removed"); | |
4785 for (Source source in missingSources) { | |
4786 buffer.write(" "); | |
4787 buffer.writeln(source.fullName); | |
4788 } | |
4789 _logInformation(buffer.toString()); | |
4790 } | |
4791 return changedSources.length > 0; | |
4792 } | |
4793 | |
4794 void _validateLastIncrementalResolutionResult() { | 4794 void _validateLastIncrementalResolutionResult() { |
4795 if (incrementalResolutionValidation_lastUnitSource == null || | 4795 if (incrementalResolutionValidation_lastUnitSource == null || |
4796 incrementalResolutionValidation_lastLibrarySource == null || | 4796 incrementalResolutionValidation_lastLibrarySource == null || |
4797 incrementalResolutionValidation_lastUnit == null) { | 4797 incrementalResolutionValidation_lastUnit == null) { |
4798 return; | 4798 return; |
4799 } | 4799 } |
4800 CompilationUnit fullUnit = getResolvedCompilationUnit2( | 4800 CompilationUnit fullUnit = getResolvedCompilationUnit2( |
4801 incrementalResolutionValidation_lastUnitSource, | 4801 incrementalResolutionValidation_lastUnitSource, |
4802 incrementalResolutionValidation_lastLibrarySource); | 4802 incrementalResolutionValidation_lastLibrarySource); |
4803 if (fullUnit != null) { | 4803 if (fullUnit != null) { |
(...skipping 7017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11821 PendingFuture pendingFuture = | 11821 PendingFuture pendingFuture = |
11822 new PendingFuture<T>(_context, source, computeValue); | 11822 new PendingFuture<T>(_context, source, computeValue); |
11823 if (!pendingFuture.evaluate(sourceEntry)) { | 11823 if (!pendingFuture.evaluate(sourceEntry)) { |
11824 _context._pendingFutureSources | 11824 _context._pendingFutureSources |
11825 .putIfAbsent(source, () => <PendingFuture>[]) | 11825 .putIfAbsent(source, () => <PendingFuture>[]) |
11826 .add(pendingFuture); | 11826 .add(pendingFuture); |
11827 } | 11827 } |
11828 return pendingFuture.future; | 11828 return pendingFuture.future; |
11829 } | 11829 } |
11830 } | 11830 } |
OLD | NEW |