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

Side by Side Diff: pkg/analyzer/lib/src/generated/engine.dart

Issue 197213036: New analyzer snapshot. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove marker Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
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 'java_core.dart'; 10 import 'java_core.dart';
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 * @return all of the errors associated with the given source 232 * @return all of the errors associated with the given source
233 * @throws AnalysisException if the errors could not be determined because the analysis could not 233 * @throws AnalysisException if the errors could not be determined because the analysis could not
234 * be performed 234 * be performed
235 * @see #getErrors(Source) 235 * @see #getErrors(Source)
236 */ 236 */
237 List<AnalysisError> computeErrors(Source source); 237 List<AnalysisError> computeErrors(Source source);
238 238
239 /** 239 /**
240 * Return the element model corresponding to the HTML file defined by the give n source. If the 240 * Return the element model corresponding to the HTML file defined by the give n source. If the
241 * element model does not yet exist it will be created. The process of creatin g an element model 241 * element model does not yet exist it will be created. The process of creatin g an element model
242 * for an HTML file can long-running, depending on the size of the file and th e number of 242 * for an HTML file can be long-running, depending on the size of the file and the number of
243 * libraries that are defined in it (via script tags) that also need to have a model built for 243 * libraries that are defined in it (via script tags) that also need to have a model built for
244 * them. 244 * them.
245 * 245 *
246 * <b>Note:</b> This method cannot be used in an async environment. 246 * <b>Note:</b> This method cannot be used in an async environment.
247 * 247 *
248 * @param source the source defining the HTML file whose element model is to b e returned 248 * @param source the source defining the HTML file whose element model is to b e returned
249 * @return the element model corresponding to the HTML file defined by the giv en source 249 * @return the element model corresponding to the HTML file defined by the giv en source
250 * @throws AnalysisException if the element model could not be determined beca use the analysis 250 * @throws AnalysisException if the element model could not be determined beca use the analysis
251 * could not be performed 251 * could not be performed
252 * @see #getHtmlElement(Source) 252 * @see #getHtmlElement(Source)
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 /** 327 /**
328 * Return the set of analysis options controlling the behavior of this context . Clients should not 328 * Return the set of analysis options controlling the behavior of this context . Clients should not
329 * modify the returned set of options. The options should only be set by invok ing the method 329 * modify the returned set of options. The options should only be set by invok ing the method
330 * [setAnalysisOptions]. 330 * [setAnalysisOptions].
331 * 331 *
332 * @return the set of analysis options controlling the behavior of this contex t 332 * @return the set of analysis options controlling the behavior of this contex t
333 */ 333 */
334 AnalysisOptions get analysisOptions; 334 AnalysisOptions get analysisOptions;
335 335
336 /** 336 /**
337 * Return the Angular application that contains the HTML file defined by the g iven source, or
338 * `null` if the source does not represent an HTML file, the Angular applicati on containing
339 * the file has not yet been resolved, or the analysis of the HTML file failed for some reason.
340 *
341 * @param htmlSource the source defining the HTML file
342 * @return the Angular application that contains the HTML file defined by the given source
343 */
344 AngularApplication getAngularApplicationWithHtml(Source htmlSource);
345
346 /**
337 * Return the element model corresponding to the compilation unit defined by t he given source in 347 * Return the element model corresponding to the compilation unit defined by t he given source in
338 * the library defined by the given source, or `null` if the element model doe s not 348 * the library defined by the given source, or `null` if the element model doe s not
339 * currently exist or if the library cannot be analyzed for some reason. 349 * currently exist or if the library cannot be analyzed for some reason.
340 * 350 *
341 * @param unitSource the source of the compilation unit 351 * @param unitSource the source of the compilation unit
342 * @param librarySource the source of the defining compilation unit of the lib rary containing the 352 * @param librarySource the source of the defining compilation unit of the lib rary containing the
343 * compilation unit 353 * compilation unit
344 * @return the element model corresponding to the compilation unit defined by the given source 354 * @return the element model corresponding to the compilation unit defined by the given source
345 */ 355 */
346 CompilationUnitElement getCompilationUnitElement(Source unitSource, Source lib rarySource); 356 CompilationUnitElement getCompilationUnitElement(Source unitSource, Source lib rarySource);
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
459 * Return the sources for the defining compilation units of any libraries that depend on the given 469 * Return the sources for the defining compilation units of any libraries that depend on the given
460 * library. One library depends on another if it either imports or exports tha t library. 470 * library. One library depends on another if it either imports or exports tha t library.
461 * 471 *
462 * @param librarySource the source for the defining compilation unit of the li brary being depended 472 * @param librarySource the source for the defining compilation unit of the li brary being depended
463 * on 473 * on
464 * @return the sources for the libraries that depend on the given library 474 * @return the sources for the libraries that depend on the given library
465 */ 475 */
466 List<Source> getLibrariesDependingOn(Source librarySource); 476 List<Source> getLibrariesDependingOn(Source librarySource);
467 477
468 /** 478 /**
479 * Return the sources for the defining compilation units of any libraries that are referenced from
480 * the given HTML file.
481 *
482 * @param htmlSource the source for the HTML file
483 * @return the sources for the libraries that are referenced by the given HTML file
484 */
485 List<Source> getLibrariesReferencedFromHtml(Source htmlSource);
486
487 /**
469 * Return the element model corresponding to the library defined by the given source, or 488 * Return the element model corresponding to the library defined by the given source, or
470 * `null` if the element model does not currently exist or if the library cann ot be analyzed 489 * `null` if the element model does not currently exist or if the library cann ot be analyzed
471 * for some reason. 490 * for some reason.
472 * 491 *
473 * @param source the source defining the library whose element model is to be returned 492 * @param source the source defining the library whose element model is to be returned
474 * @return the element model corresponding to the library defined by the given source 493 * @return the element model corresponding to the library defined by the given source
475 */ 494 */
476 LibraryElement getLibraryElement(Source source); 495 LibraryElement getLibraryElement(Source source);
477 496
478 /** 497 /**
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 * information about the consequent changes to the analysis results. This meth od can be long 652 * information about the consequent changes to the analysis results. This meth od can be long
634 * running. 653 * running.
635 * 654 *
636 * @return the results of performing the analysis 655 * @return the results of performing the analysis
637 */ 656 */
638 AnalysisResult performAnalysisTask(); 657 AnalysisResult performAnalysisTask();
639 658
640 /** 659 /**
641 * Parse and resolve a single source within the given context to produce a ful ly resolved AST. 660 * Parse and resolve a single source within the given context to produce a ful ly resolved AST.
642 * 661 *
662 * <b>Note:</b> This method cannot be used in an async environment.
663 *
643 * @param unitSource the source to be parsed and resolved 664 * @param unitSource the source to be parsed and resolved
644 * @param library the library containing the source to be resolved 665 * @param library the library containing the source to be resolved
645 * @return the result of resolving the AST structure representing the content of the source in the 666 * @return the result of resolving the AST structure representing the content of the source in the
646 * context of the given library 667 * context of the given library
647 * @throws AnalysisException if the analysis could not be performed 668 * @throws AnalysisException if the analysis could not be performed
648 * @see #getResolvedCompilationUnit(Source, LibraryElement) 669 * @see #getResolvedCompilationUnit(Source, LibraryElement)
649 */ 670 */
650 CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement libra ry); 671 CompilationUnit resolveCompilationUnit(Source unitSource, LibraryElement libra ry);
651 672
652 /** 673 /**
653 * Parse and resolve a single source within the given context to produce a ful ly resolved AST. 674 * Parse and resolve a single source within the given context to produce a ful ly resolved AST.
654 * Return the resolved AST structure, or `null` if the source could not be eit her parsed or 675 * Return the resolved AST structure, or `null` if the source could not be eit her parsed or
655 * resolved. 676 * resolved.
656 * 677 *
678 * <b>Note:</b> This method cannot be used in an async environment.
679 *
657 * @param unitSource the source to be parsed and resolved 680 * @param unitSource the source to be parsed and resolved
658 * @param librarySource the source of the defining compilation unit of the lib rary containing the 681 * @param librarySource the source of the defining compilation unit of the lib rary containing the
659 * source to be resolved 682 * source to be resolved
660 * @return the result of resolving the AST structure representing the content of the source in the 683 * @return the result of resolving the AST structure representing the content of the source in the
661 * context of the given library 684 * context of the given library
662 * @throws AnalysisException if the analysis could not be performed 685 * @throws AnalysisException if the analysis could not be performed
663 * @see #getResolvedCompilationUnit(Source, Source) 686 * @see #getResolvedCompilationUnit(Source, Source)
664 */ 687 */
665 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e); 688 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e);
666 689
667 /** 690 /**
668 * Parse and resolve a single source within the given context to produce a ful ly resolved AST. 691 * Parse and resolve a single source within the given context to produce a ful ly resolved AST.
669 * 692 *
693 * <b>Note:</b> This method cannot be used in an async environment.
694 *
670 * @param htmlSource the source to be parsed and resolved 695 * @param htmlSource the source to be parsed and resolved
671 * @return the result of resolving the AST structure representing the content of the source 696 * @return the result of resolving the AST structure representing the content of the source
672 * @throws AnalysisException if the analysis could not be performed 697 * @throws AnalysisException if the analysis could not be performed
673 */ 698 */
674 ht.HtmlUnit resolveHtmlUnit(Source htmlSource); 699 ht.HtmlUnit resolveHtmlUnit(Source htmlSource);
675 700
676 /** 701 /**
677 * Set the set of analysis options controlling the behavior of this context to the given options. 702 * Set the set of analysis options controlling the behavior of this context to the given options.
678 * Clients can safely assume that all necessary analysis results have been inv alidated. 703 * Clients can safely assume that all necessary analysis results have been inv alidated.
679 * 704 *
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
1271 _sourceMap[removedSource] = dartCopy; 1296 _sourceMap[removedSource] = dartCopy;
1272 } 1297 }
1273 return true; 1298 return true;
1274 } 1299 }
1275 1300
1276 /** 1301 /**
1277 * Remove and return one source from the list of recently used sources whose A ST structure can be 1302 * Remove and return one source from the list of recently used sources whose A ST structure can be
1278 * flushed from the cache. The source that will be returned will be the source that has been 1303 * flushed from the cache. The source that will be returned will be the source that has been
1279 * unreferenced for the longest period of time but that is not a priority for analysis. 1304 * unreferenced for the longest period of time but that is not a priority for analysis.
1280 * 1305 *
1306 * It is possible for there to be no AST that can be flushed, in which case `n ull` will be
1307 * returned. This happens, for example, if the context is reserving the AST's needed to resolve a
1308 * cycle of libraries and the number of AST's being reserved is larger than th e current cache
1309 * size.
1310 *
1281 * @return the source that was removed 1311 * @return the source that was removed
1282 */ 1312 */
1283 Source _removeAstToFlush() { 1313 Source _removeAstToFlush() {
1284 int sourceToRemove = -1; 1314 int sourceToRemove = -1;
1285 for (int i = 0; i < _recentlyUsed.length; i++) { 1315 for (int i = 0; i < _recentlyUsed.length; i++) {
1286 Source source = _recentlyUsed[i]; 1316 Source source = _recentlyUsed[i];
1287 RetentionPriority priority = _retentionPolicy.getAstPriority(source, _sour ceMap[source]); 1317 RetentionPriority priority = _retentionPolicy.getAstPriority(source, _sour ceMap[source]);
1288 if (identical(priority, RetentionPriority.LOW)) { 1318 if (identical(priority, RetentionPriority.LOW)) {
1289 return _recentlyUsed.removeAt(i); 1319 return _recentlyUsed.removeAt(i);
1290 } else if (identical(priority, RetentionPriority.MEDIUM) && sourceToRemove < 0) { 1320 } else if (identical(priority, RetentionPriority.MEDIUM) && sourceToRemove < 0) {
1291 sourceToRemove = i; 1321 sourceToRemove = i;
1292 } 1322 }
1293 } 1323 }
1294 if (sourceToRemove < 0) { 1324 if (sourceToRemove < 0) {
1295 AnalysisEngine.instance.logger.logError2("Internal error: Could not flush data from the cache", new JavaException());
1296 return null; 1325 return null;
1297 } 1326 }
1298 return _recentlyUsed.removeAt(sourceToRemove); 1327 return _recentlyUsed.removeAt(sourceToRemove);
1299 } 1328 }
1300 } 1329 }
1301 1330
1302 /** 1331 /**
1303 * Instances of the class `CacheRetentionPolicy` define the behavior of objects that determine 1332 * Instances of the class `CacheRetentionPolicy` define the behavior of objects that determine
1304 * how important it is for data to be retained in the analysis cache. 1333 * how important it is for data to be retained in the analysis cache.
1305 */ 1334 */
(...skipping 1656 matching lines...) Expand 10 before | Expand all | Expand 10 after
2962 */ 2991 */
2963 void flushAstStructures() { 2992 void flushAstStructures() {
2964 if (identical(_parsedUnitState, CacheState.VALID)) { 2993 if (identical(_parsedUnitState, CacheState.VALID)) {
2965 _parsedUnitState = CacheState.FLUSHED; 2994 _parsedUnitState = CacheState.FLUSHED;
2966 _parsedUnit = null; 2995 _parsedUnit = null;
2967 } 2996 }
2968 if (identical(_resolvedUnitState, CacheState.VALID)) { 2997 if (identical(_resolvedUnitState, CacheState.VALID)) {
2969 _resolvedUnitState = CacheState.FLUSHED; 2998 _resolvedUnitState = CacheState.FLUSHED;
2970 _resolvedUnit = null; 2999 _resolvedUnit = null;
2971 } 3000 }
3001 if (identical(_angularEntryState, CacheState.VALID)) {
3002 _angularEntryState = CacheState.FLUSHED;
3003 }
3004 if (identical(_angularErrorsState, CacheState.VALID)) {
3005 _angularErrorsState = CacheState.FLUSHED;
3006 }
2972 } 3007 }
2973 3008
2974 @override 3009 @override
2975 List<AnalysisError> get allErrors { 3010 List<AnalysisError> get allErrors {
2976 List<AnalysisError> errors = new List<AnalysisError>(); 3011 List<AnalysisError> errors = new List<AnalysisError>();
2977 if (_parseErrors != null) { 3012 if (_parseErrors != null) {
2978 for (AnalysisError error in _parseErrors) { 3013 for (AnalysisError error in _parseErrors) {
2979 errors.add(error); 3014 errors.add(error);
2980 } 3015 }
2981 } 3016 }
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after
3697 class AnalysisContextImpl implements InternalAnalysisContext { 3732 class AnalysisContextImpl implements InternalAnalysisContext {
3698 /** 3733 /**
3699 * The difference between the maximum cache size and the maximum priority orde r size. The priority 3734 * The difference between the maximum cache size and the maximum priority orde r size. The priority
3700 * list must be capped so that it is less than the cache size. Failure to do s o can result in an 3735 * list must be capped so that it is less than the cache size. Failure to do s o can result in an
3701 * infinite loop in performAnalysisTask() because re-caching one AST structure can cause another 3736 * infinite loop in performAnalysisTask() because re-caching one AST structure can cause another
3702 * priority source's AST structure to be flushed. 3737 * priority source's AST structure to be flushed.
3703 */ 3738 */
3704 static int _PRIORITY_ORDER_SIZE_DELTA = 4; 3739 static int _PRIORITY_ORDER_SIZE_DELTA = 4;
3705 3740
3706 /** 3741 /**
3742 * A flag indicating whether trace output should be produced as analysis tasks are performed. Used
3743 * for debugging.
3744 */
3745 static bool _TRACE_PERFORM_TASK = false;
3746
3747 /**
3707 * The set of analysis options controlling the behavior of this context. 3748 * The set of analysis options controlling the behavior of this context.
3708 */ 3749 */
3709 AnalysisOptionsImpl _options = new AnalysisOptionsImpl(); 3750 AnalysisOptionsImpl _options = new AnalysisOptionsImpl();
3710 3751
3711 /** 3752 /**
3753 * A flag indicating whether errors related to sources in the SDK should be ge nerated and
3754 * reported.
3755 */
3756 bool _generateSdkErrors = true;
3757
3758 /**
3712 * A flag indicating whether this context is disposed. 3759 * A flag indicating whether this context is disposed.
3713 */ 3760 */
3714 bool _disposed = false; 3761 bool _disposed = false;
3715 3762
3716 /** 3763 /**
3717 * A cache of content used to override the default content of a source. 3764 * A cache of content used to override the default content of a source.
3718 */ 3765 */
3719 ContentCache _contentCache = new ContentCache(); 3766 ContentCache _contentCache = new ContentCache();
3720 3767
3721 /** 3768 /**
3722 * The source factory used to create the sources that can be analyzed in this context. 3769 * The source factory used to create the sources that can be analyzed in this context.
3723 */ 3770 */
3724 SourceFactory _sourceFactory; 3771 SourceFactory _sourceFactory;
3725 3772
3726 /** 3773 /**
3774 * A source representing the core library.
3775 */
3776 Source _coreLibrarySource;
3777
3778 /**
3727 * A table mapping the sources known to the context to the information known a bout the source. 3779 * A table mapping the sources known to the context to the information known a bout the source.
3728 */ 3780 */
3729 AnalysisCache _cache; 3781 AnalysisCache _cache;
3730 3782
3731 /** 3783 /**
3732 * An array containing sources for which data should not be flushed. 3784 * An array containing sources for which data should not be flushed.
3733 */ 3785 */
3734 List<Source> _priorityOrder = Source.EMPTY_ARRAY; 3786 List<Source> _priorityOrder = Source.EMPTY_ARRAY;
3735 3787
3736 /** 3788 /**
3789 * An array containing sources whose AST structure is needed in order to resol ve the next library
3790 * to be resolved.
3791 */
3792 Set<Source> _neededForResolution = null;
3793
3794 /**
3737 * A table mapping sources to the change notices that are waiting to be return ed related to that 3795 * A table mapping sources to the change notices that are waiting to be return ed related to that
3738 * source. 3796 * source.
3739 */ 3797 */
3740 Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeIm pl>(); 3798 Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeIm pl>();
3741 3799
3742 /** 3800 /**
3743 * A set containing information about the tasks that have been performed since the last change 3801 * A set containing information about the tasks that have been performed since the last change
3744 * notification. Used to detect infinite loops in [performAnalysisTask]. 3802 * notification. Used to detect infinite loops in [performAnalysisTask].
3745 */ 3803 */
3746 Set<String> _recentTasks = new Set<String>(); 3804 Set<String> _recentTasks = new Set<String>();
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
3817 _sourceChanged(source); 3875 _sourceChanged(source);
3818 } 3876 }
3819 for (Source source in removedSources) { 3877 for (Source source in removedSources) {
3820 _sourceRemoved(source); 3878 _sourceRemoved(source);
3821 } 3879 }
3822 if (addedDartSource) { 3880 if (addedDartSource) {
3823 // TODO(brianwilkerson) This is hugely inefficient, but we need to re-anal yze any libraries 3881 // TODO(brianwilkerson) This is hugely inefficient, but we need to re-anal yze any libraries
3824 // that might have been referencing the not-yet-existing source that was j ust added. Longer 3882 // that might have been referencing the not-yet-existing source that was j ust added. Longer
3825 // term we need to keep track of which libraries are referencing non-exist ing sources and 3883 // term we need to keep track of which libraries are referencing non-exist ing sources and
3826 // only re-analyze those libraries. 3884 // only re-analyze those libraries.
3827 _logInformation("Added Dart sources, invalidating all resolution informati on"); 3885 // logInformation("Added Dart sources, invalidating all resolution information");
3828 for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) { 3886 for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
3829 Source source = mapEntry.getKey(); 3887 Source source = mapEntry.getKey();
3830 SourceEntry sourceEntry = mapEntry.getValue(); 3888 SourceEntry sourceEntry = mapEntry.getValue();
3831 if (!source.isInSystemLibrary && sourceEntry is DartEntry) { 3889 if (!source.isInSystemLibrary && sourceEntry is DartEntry) {
3832 DartEntry dartEntry = sourceEntry; 3890 DartEntry dartEntry = sourceEntry;
3833 DartEntryImpl dartCopy = dartEntry.writableCopy; 3891 DartEntryImpl dartCopy = dartEntry.writableCopy;
3834 _removeFromParts(source, dartEntry); 3892 _removeFromParts(source, dartEntry);
3835 dartCopy.invalidateAllResolutionInformation(); 3893 dartCopy.invalidateAllResolutionInformation();
3836 mapEntry.setValue(dartCopy); 3894 mapEntry.setValue(dartCopy);
3837 SourcePriority priority = SourcePriority.UNKNOWN; 3895 SourcePriority priority = SourcePriority.UNKNOWN;
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
4021 newContext.addSourceInfo(source, entry.getValue().writableCopy); 4079 newContext.addSourceInfo(source, entry.getValue().writableCopy);
4022 } 4080 }
4023 } 4081 }
4024 return newContext; 4082 return newContext;
4025 } 4083 }
4026 4084
4027 @override 4085 @override
4028 AnalysisOptions get analysisOptions => _options; 4086 AnalysisOptions get analysisOptions => _options;
4029 4087
4030 @override 4088 @override
4089 AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
4090 SourceEntry sourceEntry = _getReadableSourceEntryOrNull(htmlSource);
4091 if (sourceEntry is HtmlEntry) {
4092 HtmlEntry htmlEntry = sourceEntry;
4093 AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPL ICATION);
4094 if (application != null) {
4095 return application;
4096 }
4097 return htmlEntry.getValue(HtmlEntry.ANGULAR_ENTRY);
4098 }
4099 return null;
4100 }
4101
4102 @override
4031 CompilationUnitElement getCompilationUnitElement(Source unitSource, Source lib rarySource) { 4103 CompilationUnitElement getCompilationUnitElement(Source unitSource, Source lib rarySource) {
4032 LibraryElement libraryElement = getLibraryElement(librarySource); 4104 LibraryElement libraryElement = getLibraryElement(librarySource);
4033 if (libraryElement != null) { 4105 if (libraryElement != null) {
4034 // try defining unit 4106 // try defining unit
4035 CompilationUnitElement definingUnit = libraryElement.definingCompilationUn it; 4107 CompilationUnitElement definingUnit = libraryElement.definingCompilationUn it;
4036 if (definingUnit.source == unitSource) { 4108 if (definingUnit.source == unitSource) {
4037 return definingUnit; 4109 return definingUnit;
4038 } 4110 }
4039 // try parts 4111 // try parts
4040 for (CompilationUnitElement partUnit in libraryElement.parts) { 4112 for (CompilationUnitElement partUnit in libraryElement.parts) {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
4194 } 4266 }
4195 } 4267 }
4196 } 4268 }
4197 if (dependentLibraries.isEmpty) { 4269 if (dependentLibraries.isEmpty) {
4198 return Source.EMPTY_ARRAY; 4270 return Source.EMPTY_ARRAY;
4199 } 4271 }
4200 return new List.from(dependentLibraries); 4272 return new List.from(dependentLibraries);
4201 } 4273 }
4202 4274
4203 @override 4275 @override
4276 List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
4277 SourceEntry sourceEntry = _getReadableSourceEntryOrNull(htmlSource);
4278 if (sourceEntry is HtmlEntry) {
4279 HtmlEntry htmlEntry = sourceEntry;
4280 return htmlEntry.getValue(HtmlEntry.REFERENCED_LIBRARIES);
4281 }
4282 return Source.EMPTY_ARRAY;
4283 }
4284
4285 @override
4204 LibraryElement getLibraryElement(Source source) { 4286 LibraryElement getLibraryElement(Source source) {
4205 SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source); 4287 SourceEntry sourceEntry = _getReadableSourceEntryOrNull(source);
4206 if (sourceEntry is DartEntry) { 4288 if (sourceEntry is DartEntry) {
4207 return sourceEntry.getValue(DartEntry.ELEMENT); 4289 return sourceEntry.getValue(DartEntry.ELEMENT);
4208 } 4290 }
4209 return null; 4291 return null;
4210 } 4292 }
4211 4293
4212 @override 4294 @override
4213 List<Source> get librarySources => _getSources(SourceKind.LIBRARY); 4295 List<Source> get librarySources => _getSources(SourceKind.LIBRARY);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
4324 // Look for non-priority sources that need to be analyzed. 4406 // Look for non-priority sources that need to be analyzed.
4325 // 4407 //
4326 for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) { 4408 for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
4327 _getSourcesNeedingProcessing(entry.getKey(), entry.getValue(), false, hint sEnabled, sources); 4409 _getSourcesNeedingProcessing(entry.getKey(), entry.getValue(), false, hint sEnabled, sources);
4328 } 4410 }
4329 return new List<Source>.from(sources); 4411 return new List<Source>.from(sources);
4330 } 4412 }
4331 4413
4332 @override 4414 @override
4333 AnalysisContentStatistics get statistics { 4415 AnalysisContentStatistics get statistics {
4416 bool hintsEnabled = _options.hint;
4334 AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl (); 4417 AnalysisContentStatisticsImpl statistics = new AnalysisContentStatisticsImpl ();
4335 for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) { 4418 for (MapEntry<Source, SourceEntry> mapEntry in _cache.entrySet()) {
4336 statistics.addSource(mapEntry.getKey()); 4419 statistics.addSource(mapEntry.getKey());
4337 SourceEntry entry = mapEntry.getValue(); 4420 SourceEntry entry = mapEntry.getValue();
4338 if (entry is DartEntry) { 4421 if (entry is DartEntry) {
4339 Source source = mapEntry.getKey(); 4422 Source source = mapEntry.getKey();
4340 DartEntry dartEntry = entry; 4423 DartEntry dartEntry = entry;
4341 SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND); 4424 SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
4342 // get library independent values 4425 // get library independent values
4343 statistics.putCacheItem(dartEntry, SourceEntry.LINE_INFO); 4426 statistics.putCacheItem(dartEntry, SourceEntry.LINE_INFO);
4344 statistics.putCacheItem(dartEntry, DartEntry.PARSE_ERRORS); 4427 statistics.putCacheItem(dartEntry, DartEntry.PARSE_ERRORS);
4345 statistics.putCacheItem(dartEntry, DartEntry.PARSED_UNIT); 4428 statistics.putCacheItem(dartEntry, DartEntry.PARSED_UNIT);
4346 statistics.putCacheItem(dartEntry, DartEntry.SOURCE_KIND); 4429 statistics.putCacheItem(dartEntry, DartEntry.SOURCE_KIND);
4347 if (identical(kind, SourceKind.LIBRARY)) { 4430 if (identical(kind, SourceKind.LIBRARY)) {
4348 statistics.putCacheItem(dartEntry, DartEntry.ELEMENT); 4431 statistics.putCacheItem(dartEntry, DartEntry.ELEMENT);
4349 statistics.putCacheItem(dartEntry, DartEntry.EXPORTED_LIBRARIES); 4432 statistics.putCacheItem(dartEntry, DartEntry.EXPORTED_LIBRARIES);
4350 statistics.putCacheItem(dartEntry, DartEntry.IMPORTED_LIBRARIES); 4433 statistics.putCacheItem(dartEntry, DartEntry.IMPORTED_LIBRARIES);
4351 statistics.putCacheItem(dartEntry, DartEntry.INCLUDED_PARTS); 4434 statistics.putCacheItem(dartEntry, DartEntry.INCLUDED_PARTS);
4352 statistics.putCacheItem(dartEntry, DartEntry.IS_CLIENT); 4435 statistics.putCacheItem(dartEntry, DartEntry.IS_CLIENT);
4353 statistics.putCacheItem(dartEntry, DartEntry.IS_LAUNCHABLE); 4436 statistics.putCacheItem(dartEntry, DartEntry.IS_LAUNCHABLE);
4354 } 4437 }
4355 // get library-specific values 4438 // get library-specific values
4356 List<Source> librarySources = getLibrariesContaining(source); 4439 List<Source> librarySources = getLibrariesContaining(source);
4357 for (Source librarySource in librarySources) { 4440 for (Source librarySource in librarySources) {
4358 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.H INTS);
4359 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.R ESOLUTION_ERRORS); 4441 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.R ESOLUTION_ERRORS);
4360 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.R ESOLVED_UNIT); 4442 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.R ESOLVED_UNIT);
4361 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry.V ERIFICATION_ERRORS); 4443 if (_generateSdkErrors || !source.isInSystemLibrary) {
4444 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEntry .VERIFICATION_ERRORS);
4445 if (hintsEnabled) {
4446 statistics.putCacheItemInLibrary(dartEntry, librarySource, DartEnt ry.HINTS);
4447 }
4448 }
4362 } 4449 }
4363 } else if (entry is HtmlEntry) { 4450 } else if (entry is HtmlEntry) {
4364 HtmlEntry htmlEntry = entry; 4451 HtmlEntry htmlEntry = entry;
4365 statistics.putCacheItem(htmlEntry, SourceEntry.LINE_INFO); 4452 statistics.putCacheItem(htmlEntry, SourceEntry.LINE_INFO);
4366 statistics.putCacheItem(htmlEntry, HtmlEntry.PARSE_ERRORS); 4453 statistics.putCacheItem(htmlEntry, HtmlEntry.PARSE_ERRORS);
4367 statistics.putCacheItem(htmlEntry, HtmlEntry.PARSED_UNIT); 4454 statistics.putCacheItem(htmlEntry, HtmlEntry.PARSED_UNIT);
4368 statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLUTION_ERRORS); 4455 statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLUTION_ERRORS);
4369 statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLVED_UNIT); 4456 statistics.putCacheItem(htmlEntry, HtmlEntry.RESOLVED_UNIT);
4370 } 4457 }
4371 } 4458 }
4372 return statistics; 4459 return statistics;
4373 } 4460 }
4374 4461
4375 @override 4462 @override
4376 TypeProvider get typeProvider { 4463 TypeProvider get typeProvider {
4377 Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE); 4464 Source coreSource = sourceFactory.forUri(DartSdk.DART_CORE);
4378 return new TypeProviderImpl(computeLibraryElement(coreSource)); 4465 return new TypeProviderImpl(computeLibraryElement(coreSource));
4379 } 4466 }
4380 4467
4381 @override 4468 @override
4382 TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSou rce, LibraryElement libraryElement) {
4383 DartEntry dartEntry = _getReadableDartEntry(unitSource);
4384 if (dartEntry == null) {
4385 throw new AnalysisException.con1("internalResolveCompilationUnit invoked f or non-Dart file: ${unitSource.fullName}");
4386 }
4387 Source librarySource = libraryElement.source;
4388 dartEntry = _cacheDartResolutionData(unitSource, librarySource, dartEntry, D artEntry.RESOLVED_UNIT);
4389 return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dart Entry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
4390 }
4391
4392 @override
4393 bool isClientLibrary(Source librarySource) { 4469 bool isClientLibrary(Source librarySource) {
4394 SourceEntry sourceEntry = _getReadableSourceEntry(librarySource); 4470 SourceEntry sourceEntry = _getReadableSourceEntry(librarySource);
4395 if (sourceEntry is DartEntry) { 4471 if (sourceEntry is DartEntry) {
4396 DartEntry dartEntry = sourceEntry; 4472 DartEntry dartEntry = sourceEntry;
4397 return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartE ntry.IS_LAUNCHABLE); 4473 return dartEntry.getValue(DartEntry.IS_CLIENT) && dartEntry.getValue(DartE ntry.IS_LAUNCHABLE);
4398 } 4474 }
4399 return false; 4475 return false;
4400 } 4476 }
4401 4477
4402 @override 4478 @override
(...skipping 30 matching lines...) Expand all
4433 } 4509 }
4434 4510
4435 @override 4511 @override
4436 CompilationUnit parseCompilationUnit(Source source) => _getDartParseData2(sour ce, DartEntry.PARSED_UNIT, null); 4512 CompilationUnit parseCompilationUnit(Source source) => _getDartParseData2(sour ce, DartEntry.PARSED_UNIT, null);
4437 4513
4438 @override 4514 @override
4439 ht.HtmlUnit parseHtmlUnit(Source source) => _getHtmlParseData(source, HtmlEntr y.PARSED_UNIT, null); 4515 ht.HtmlUnit parseHtmlUnit(Source source) => _getHtmlParseData(source, HtmlEntr y.PARSED_UNIT, null);
4440 4516
4441 @override 4517 @override
4442 AnalysisResult performAnalysisTask() { 4518 AnalysisResult performAnalysisTask() {
4519 if (_TRACE_PERFORM_TASK) {
4520 print("----------------------------------------");
4521 }
4443 int getStart = JavaSystem.currentTimeMillis(); 4522 int getStart = JavaSystem.currentTimeMillis();
4444 AnalysisTask task = nextAnalysisTask; 4523 AnalysisTask task = nextAnalysisTask;
4445 int getEnd = JavaSystem.currentTimeMillis(); 4524 int getEnd = JavaSystem.currentTimeMillis();
4446 if (task == null && _validateCacheConsistency()) { 4525 if (task == null && _validateCacheConsistency()) {
4447 task = nextAnalysisTask; 4526 task = nextAnalysisTask;
4448 } 4527 }
4449 if (task == null) { 4528 if (task == null) {
4450 return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null , -1); 4529 return new AnalysisResult(_getChangeNotices(true), getEnd - getStart, null , -1);
4451 } 4530 }
4452 String taskDescriptor = task.toString(); 4531 String taskDescriptor = task.toString();
4453 if (_recentTasks.add(taskDescriptor)) { 4532 // if (recentTasks.add(taskDescriptor)) {
4454 _logInformation("Performing task: ${taskDescriptor}"); 4533 // logInformation("Performing task: " + taskDescriptor);
4455 } else { 4534 // } else {
4456 _logInformation("*** Performing repeated task: ${taskDescriptor}"); 4535 // if (TRACE_PERFORM_TASK) {
4536 // System.out.print("* ");
4537 // }
4538 // logInformation("*** Performing repeated task: " + taskDescriptor);
4539 // }
4540 if (_TRACE_PERFORM_TASK) {
4541 print(taskDescriptor);
4457 } 4542 }
4458 int performStart = JavaSystem.currentTimeMillis(); 4543 int performStart = JavaSystem.currentTimeMillis();
4459 try { 4544 try {
4460 task.perform(_resultRecorder); 4545 task.perform(_resultRecorder);
4461 } on ObsoleteSourceAnalysisException catch (exception) { 4546 } on ObsoleteSourceAnalysisException catch (exception) {
4462 AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: ${taskDescriptor}", exception); 4547 AnalysisEngine.instance.logger.logInformation2("Could not perform analysis task: ${taskDescriptor}", exception);
4463 } on AnalysisException catch (exception) { 4548 } on AnalysisException catch (exception) {
4464 if (exception.cause is! JavaIOException) { 4549 if (exception.cause is! JavaIOException) {
4465 AnalysisEngine.instance.logger.logError2("Internal error while performin g the task: ${task}", exception); 4550 AnalysisEngine.instance.logger.logError2("Internal error while performin g the task: ${task}", exception);
4466 } 4551 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4499 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e) => _getDartResolutionData2(unitSource, librarySource, DartEntry.RESOLVED_UNIT , null); 4584 CompilationUnit resolveCompilationUnit2(Source unitSource, Source librarySourc e) => _getDartResolutionData2(unitSource, librarySource, DartEntry.RESOLVED_UNIT , null);
4500 4585
4501 @override 4586 @override
4502 ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { 4587 ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
4503 computeHtmlElement(htmlSource); 4588 computeHtmlElement(htmlSource);
4504 return parseHtmlUnit(htmlSource); 4589 return parseHtmlUnit(htmlSource);
4505 } 4590 }
4506 4591
4507 @override 4592 @override
4508 void set analysisOptions(AnalysisOptions options) { 4593 void set analysisOptions(AnalysisOptions options) {
4509 bool needsRecompute = this._options.analyzeFunctionBodies != options.analyze FunctionBodies || this._options.dart2jsHint != options.dart2jsHint || (this._opt ions.hint && !options.hint) || this._options.preserveComments != options.preserv eComments; 4594 bool needsRecompute = this._options.analyzeFunctionBodies != options.analyze FunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors | | this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !op tions.hint) || this._options.preserveComments != options.preserveComments;
4510 int cacheSize = options.cacheSize; 4595 int cacheSize = options.cacheSize;
4511 if (this._options.cacheSize != cacheSize) { 4596 if (this._options.cacheSize != cacheSize) {
4512 this._options.cacheSize = cacheSize; 4597 this._options.cacheSize = cacheSize;
4513 _cache.maxCacheSize = cacheSize; 4598 _cache.maxCacheSize = cacheSize;
4514 // 4599 //
4515 // Cap the size of the priority list to being less than the cache size. Fa ilure to do so can 4600 // Cap the size of the priority list to being less than the cache size. Fa ilure to do so can
4516 // result in an infinite loop in performAnalysisTask() because re-caching one AST structure 4601 // result in an infinite loop in performAnalysisTask() because re-caching one AST structure
4517 // can cause another priority source's AST structure to be flushed. 4602 // can cause another priority source's AST structure to be flushed.
4518 // 4603 //
4519 int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA; 4604 int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA;
4520 if (_priorityOrder.length > maxPriorityOrderSize) { 4605 if (_priorityOrder.length > maxPriorityOrderSize) {
4521 List<Source> newPriorityOrder = new List<Source>(maxPriorityOrderSize); 4606 List<Source> newPriorityOrder = new List<Source>(maxPriorityOrderSize);
4522 JavaSystem.arraycopy(_priorityOrder, 0, newPriorityOrder, 0, maxPriority OrderSize); 4607 JavaSystem.arraycopy(_priorityOrder, 0, newPriorityOrder, 0, maxPriority OrderSize);
4523 _priorityOrder = newPriorityOrder; 4608 _priorityOrder = newPriorityOrder;
4524 } 4609 }
4525 } 4610 }
4526 this._options.analyzeFunctionBodies = options.analyzeFunctionBodies; 4611 this._options.analyzeFunctionBodies = options.analyzeFunctionBodies;
4612 this._options.generateSdkErrors = options.generateSdkErrors;
4527 this._options.dart2jsHint = options.dart2jsHint; 4613 this._options.dart2jsHint = options.dart2jsHint;
4528 this._options.hint = options.hint; 4614 this._options.hint = options.hint;
4529 this._options.incremental = options.incremental; 4615 this._options.incremental = options.incremental;
4530 this._options.preserveComments = options.preserveComments; 4616 this._options.preserveComments = options.preserveComments;
4617 _generateSdkErrors = options.generateSdkErrors;
4531 if (needsRecompute) { 4618 if (needsRecompute) {
4532 _invalidateAllResolutionInformation(); 4619 _invalidateAllResolutionInformation();
4533 } 4620 }
4534 } 4621 }
4535 4622
4536 @override 4623 @override
4537 void set analysisPriorityOrder(List<Source> sources) { 4624 void set analysisPriorityOrder(List<Source> sources) {
4538 if (sources == null || sources.isEmpty) { 4625 if (sources == null || sources.isEmpty) {
4539 _priorityOrder = Source.EMPTY_ARRAY; 4626 _priorityOrder = Source.EMPTY_ARRAY;
4540 } else { 4627 } else {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
4607 if (identical(_sourceFactory, factory)) { 4694 if (identical(_sourceFactory, factory)) {
4608 return; 4695 return;
4609 } else if (factory.context != null) { 4696 } else if (factory.context != null) {
4610 throw new IllegalStateException("Source factories cannot be shared between contexts"); 4697 throw new IllegalStateException("Source factories cannot be shared between contexts");
4611 } 4698 }
4612 if (_sourceFactory != null) { 4699 if (_sourceFactory != null) {
4613 _sourceFactory.context = null; 4700 _sourceFactory.context = null;
4614 } 4701 }
4615 factory.context = this; 4702 factory.context = this;
4616 _sourceFactory = factory; 4703 _sourceFactory = factory;
4704 _coreLibrarySource = _sourceFactory.forUri(DartSdk.DART_CORE);
4617 _invalidateAllResolutionInformation(); 4705 _invalidateAllResolutionInformation();
4618 } 4706 }
4619 4707
4620 /** 4708 /**
4621 * Record the results produced by performing a [ResolveDartLibraryTask]. If th e results were 4709 * Record the results produced by performing a [ResolveDartLibraryCycleTask]. If the results
4622 * computed from data that is now out-of-date, then the results will not be re corded. 4710 * were computed from data that is now out-of-date, then the results will not be recorded.
4623 * 4711 *
4624 * @param task the task that was performed 4712 * @param task the task that was performed
4625 * @return an entry containing the computed results 4713 * @return an entry containing the computed results
4626 * @throws AnalysisException if the results could not be recorded 4714 * @throws AnalysisException if the results could not be recorded
4627 */ 4715 */
4716 DartEntry recordResolveDartLibraryCycleTaskResults(ResolveDartLibraryCycleTask task) {
4717 LibraryResolver2 resolver = task.libraryResolver;
4718 AnalysisException thrownException = task.exception;
4719 DartEntry unitEntry = null;
4720 Source unitSource = task.unitSource;
4721 if (resolver != null) {
4722 //
4723 // The resolver should only be null if an exception was thrown before (or while) it was
4724 // being created.
4725 //
4726 List<ResolvableLibrary> resolvedLibraries = resolver.resolvedLibraries;
4727 if (resolvedLibraries == null) {
4728 //
4729 // The resolved libraries should only be null if an exception was thrown during resolution.
4730 //
4731 unitEntry = _getReadableDartEntry(unitSource);
4732 if (unitEntry == null) {
4733 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
4734 }
4735 DartEntryImpl dartCopy = unitEntry.writableCopy;
4736 dartCopy.recordResolutionError();
4737 dartCopy.exception = thrownException;
4738 _cache.put(unitSource, dartCopy);
4739 _cache.remove(unitSource);
4740 if (thrownException != null) {
4741 throw thrownException;
4742 }
4743 return dartCopy;
4744 }
4745 if (_allModificationTimesMatch(resolvedLibraries)) {
4746 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
4747 RecordingErrorListener errorListener = resolver.errorListener;
4748 for (ResolvableLibrary library in resolvedLibraries) {
4749 Source librarySource = library.librarySource;
4750 for (Source source in library.compilationUnitSources) {
4751 CompilationUnit unit = library.getAST(source);
4752 List<AnalysisError> errors = errorListener.getErrorsForSource(source );
4753 LineInfo lineInfo = getLineInfo(source);
4754 DartEntry dartEntry = _cache.get(source) as DartEntry;
4755 int sourceTime = getModificationStamp(source);
4756 if (dartEntry.modificationTime != sourceTime) {
4757 // The source has changed without the context being notified. Simu late notification.
4758 _sourceChanged(source);
4759 dartEntry = _getReadableDartEntry(source);
4760 if (dartEntry == null) {
4761 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
4762 }
4763 }
4764 DartEntryImpl dartCopy = dartEntry.writableCopy;
4765 if (thrownException == null) {
4766 dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
4767 dartCopy.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
4768 dartCopy.setValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource, unit);
4769 dartCopy.setValueInLibrary(DartEntry.RESOLUTION_ERRORS, librarySou rce, errors);
4770 if (source == librarySource) {
4771 _recordElementData(dartEntry, dartCopy, library.libraryElement, librarySource, htmlSource);
4772 }
4773 _cache.storedAst(source);
4774 } else {
4775 dartCopy.recordResolutionError();
4776 _cache.remove(source);
4777 }
4778 dartCopy.exception = thrownException;
4779 _cache.put(source, dartCopy);
4780 if (source != librarySource) {
4781 _workManager.add(source, SourcePriority.PRIORITY_PART);
4782 }
4783 if (source == unitSource) {
4784 unitEntry = dartCopy;
4785 }
4786 if (_generateSdkErrors || !source.isInSystemLibrary) {
4787 ChangeNoticeImpl notice = _getNotice(source);
4788 notice.compilationUnit = unit;
4789 notice.setErrors(dartCopy.allErrors, lineInfo);
4790 }
4791 }
4792 }
4793 } else {
4794 PrintStringWriter writer = new PrintStringWriter();
4795 writer.println("Library resolution results discarded for");
4796 for (ResolvableLibrary library in resolvedLibraries) {
4797 for (Source source in library.compilationUnitSources) {
4798 DartEntry dartEntry = _getReadableDartEntry(source);
4799 if (dartEntry != null) {
4800 int resultTime = library.getModificationTime(source);
4801 writer.println(" ${_debuggingString(source)}; sourceTime = ${getM odificationStamp(source)}, resultTime = ${resultTime}, cacheTime = ${dartEntry.m odificationTime}");
4802 DartEntryImpl dartCopy = dartEntry.writableCopy;
4803 if (thrownException == null || resultTime >= 0) {
4804 //
4805 // The analysis was performed on out-of-date sources. Mark the c ache so that the
4806 // sources will be re-analyzed using the up-to-date sources.
4807 //
4808 dartCopy.recordResolutionNotInProcess();
4809 } else {
4810 //
4811 // We could not determine whether the sources were up-to-date or out-of-date. Mark
4812 // the cache so that we won't attempt to re-analyze the sources until there's a
4813 // good chance that we'll be able to do so without error.
4814 //
4815 dartCopy.recordResolutionError();
4816 _cache.remove(source);
4817 }
4818 dartCopy.exception = thrownException;
4819 _cache.put(source, dartCopy);
4820 if (source == unitSource) {
4821 unitEntry = dartCopy;
4822 }
4823 } else {
4824 writer.println(" ${_debuggingString(source)}; sourceTime = ${getM odificationStamp(source)}, no entry");
4825 }
4826 }
4827 }
4828 _logInformation(writer.toString());
4829 }
4830 }
4831 if (thrownException != null) {
4832 throw thrownException;
4833 }
4834 if (unitEntry == null) {
4835 unitEntry = _getReadableDartEntry(unitSource);
4836 if (unitEntry == null) {
4837 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${ unitSource.fullName}");
4838 }
4839 }
4840 return unitEntry;
4841 }
4842
4628 DartEntry recordResolveDartLibraryTaskResults(ResolveDartLibraryTask task) { 4843 DartEntry recordResolveDartLibraryTaskResults(ResolveDartLibraryTask task) {
4629 LibraryResolver resolver = task.libraryResolver; 4844 LibraryResolver resolver = task.libraryResolver;
4630 AnalysisException thrownException = task.exception; 4845 AnalysisException thrownException = task.exception;
4631 DartEntry unitEntry = null; 4846 DartEntry unitEntry = null;
4632 Source unitSource = task.unitSource; 4847 Source unitSource = task.unitSource;
4633 if (resolver != null) { 4848 if (resolver != null) {
4634 // 4849 //
4635 // The resolver should only be null if an exception was thrown before (or while) it was 4850 // The resolver should only be null if an exception was thrown before (or while) it was
4636 // being created. 4851 // being created.
4637 // 4852 //
4638 Set<Library> resolvedLibraries = resolver.resolvedLibraries; 4853 Set<Library> resolvedLibraries = resolver.resolvedLibraries;
4639 if (resolvedLibraries == null) { 4854 if (resolvedLibraries == null) {
4640 // 4855 //
4641 // The resolved libraries should only be null if an exception was thrown during resolution. 4856 // The resolved libraries should only be null if an exception was thrown during resolution.
4642 // 4857 //
4643 unitEntry = _getReadableDartEntry(unitSource); 4858 unitEntry = _getReadableDartEntry(unitSource);
4644 if (unitEntry == null) { 4859 if (unitEntry == null) {
4645 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}"); 4860 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${unitSource.fullName}");
4646 } 4861 }
4647 DartEntryImpl dartCopy = unitEntry.writableCopy; 4862 DartEntryImpl dartCopy = unitEntry.writableCopy;
4648 dartCopy.recordResolutionError(); 4863 dartCopy.recordResolutionError();
4649 dartCopy.exception = thrownException; 4864 dartCopy.exception = thrownException;
4650 _cache.put(unitSource, dartCopy); 4865 _cache.put(unitSource, dartCopy);
4651 _cache.remove(unitSource); 4866 _cache.remove(unitSource);
4652 if (thrownException != null) { 4867 if (thrownException != null) {
4653 throw thrownException; 4868 throw thrownException;
4654 } 4869 }
4655 return dartCopy; 4870 return dartCopy;
4656 } 4871 }
4657 if (_allModificationTimesMatch(resolvedLibraries)) { 4872 if (_allModificationTimesMatch2(resolvedLibraries)) {
4658 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML); 4873 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
4659 RecordingErrorListener errorListener = resolver.errorListener; 4874 RecordingErrorListener errorListener = resolver.errorListener;
4660 for (Library library in resolvedLibraries) { 4875 for (Library library in resolvedLibraries) {
4661 Source librarySource = library.librarySource; 4876 Source librarySource = library.librarySource;
4662 for (Source source in library.compilationUnitSources) { 4877 for (Source source in library.compilationUnitSources) {
4663 CompilationUnit unit = library.getAST(source); 4878 CompilationUnit unit = library.getAST(source);
4664 List<AnalysisError> errors = errorListener.getErrorsForSource(source ); 4879 List<AnalysisError> errors = errorListener.getErrorsForSource(source );
4665 LineInfo lineInfo = getLineInfo(source); 4880 LineInfo lineInfo = getLineInfo(source);
4666 DartEntry dartEntry = _cache.get(source) as DartEntry; 4881 DartEntry dartEntry = _cache.get(source) as DartEntry;
4667 int sourceTime = getModificationStamp(source); 4882 int sourceTime = getModificationStamp(source);
(...skipping 20 matching lines...) Expand all
4688 _cache.remove(source); 4903 _cache.remove(source);
4689 } 4904 }
4690 dartCopy.exception = thrownException; 4905 dartCopy.exception = thrownException;
4691 _cache.put(source, dartCopy); 4906 _cache.put(source, dartCopy);
4692 if (source != librarySource) { 4907 if (source != librarySource) {
4693 _workManager.add(source, SourcePriority.PRIORITY_PART); 4908 _workManager.add(source, SourcePriority.PRIORITY_PART);
4694 } 4909 }
4695 if (source == unitSource) { 4910 if (source == unitSource) {
4696 unitEntry = dartCopy; 4911 unitEntry = dartCopy;
4697 } 4912 }
4698 ChangeNoticeImpl notice = _getNotice(source); 4913 if (_generateSdkErrors || !source.isInSystemLibrary) {
4699 notice.compilationUnit = unit; 4914 ChangeNoticeImpl notice = _getNotice(source);
4700 notice.setErrors(dartCopy.allErrors, lineInfo); 4915 notice.compilationUnit = unit;
4916 notice.setErrors(dartCopy.allErrors, lineInfo);
4917 }
4701 } 4918 }
4702 } 4919 }
4703 } else { 4920 } else {
4704 PrintStringWriter writer = new PrintStringWriter(); 4921 PrintStringWriter writer = new PrintStringWriter();
4705 writer.println("Library resolution results discarded for"); 4922 writer.println("Library resolution results discarded for");
4706 for (Library library in resolvedLibraries) { 4923 for (Library library in resolvedLibraries) {
4707 for (Source source in library.compilationUnitSources) { 4924 for (Source source in library.compilationUnitSources) {
4708 DartEntry dartEntry = _getReadableDartEntry(source); 4925 DartEntry dartEntry = _getReadableDartEntry(source);
4709 if (dartEntry != null) { 4926 if (dartEntry != null) {
4710 int resultTime = library.getModificationTime(source); 4927 int resultTime = library.getModificationTime(source);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
4779 4996
4780 /** 4997 /**
4781 * Return `true` if the modification times of the sources used by the given li brary resolver 4998 * Return `true` if the modification times of the sources used by the given li brary resolver
4782 * to resolve one or more libraries are consistent with the modification times in the cache. 4999 * to resolve one or more libraries are consistent with the modification times in the cache.
4783 * 5000 *
4784 * @param resolver the library resolver used to resolve one or more libraries 5001 * @param resolver the library resolver used to resolve one or more libraries
4785 * @return `true` if we should record the results of the resolution 5002 * @return `true` if we should record the results of the resolution
4786 * @throws AnalysisException if any of the modification times could not be det ermined (this should 5003 * @throws AnalysisException if any of the modification times could not be det ermined (this should
4787 * not happen) 5004 * not happen)
4788 */ 5005 */
4789 bool _allModificationTimesMatch(Set<Library> resolvedLibraries) { 5006 bool _allModificationTimesMatch(List<ResolvableLibrary> resolvedLibraries) {
5007 bool allTimesMatch = true;
5008 for (ResolvableLibrary library in resolvedLibraries) {
5009 for (Source source in library.compilationUnitSources) {
5010 DartEntry dartEntry = _getReadableDartEntry(source);
5011 if (dartEntry == null) {
5012 // This shouldn't be possible because we should never have performed t he task if the
5013 // source didn't represent a Dart file, but check to be safe.
5014 throw new AnalysisException.con1("Internal error: attempting to resolv e non-Dart file as a Dart file: ${source.fullName}");
5015 }
5016 int sourceTime = getModificationStamp(source);
5017 int resultTime = library.getModificationTime(source);
5018 if (sourceTime != resultTime) {
5019 // The source has changed without the context being notified. Simulate notification.
5020 _sourceChanged(source);
5021 allTimesMatch = false;
5022 }
5023 }
5024 }
5025 return allTimesMatch;
5026 }
5027
5028 /**
5029 * Return `true` if the modification times of the sources used by the given li brary resolver
5030 * to resolve one or more libraries are consistent with the modification times in the cache.
5031 *
5032 * @param resolver the library resolver used to resolve one or more libraries
5033 * @return `true` if we should record the results of the resolution
5034 * @throws AnalysisException if any of the modification times could not be det ermined (this should
5035 * not happen)
5036 */
5037 bool _allModificationTimesMatch2(Set<Library> resolvedLibraries) {
4790 bool allTimesMatch = true; 5038 bool allTimesMatch = true;
4791 for (Library library in resolvedLibraries) { 5039 for (Library library in resolvedLibraries) {
4792 for (Source source in library.compilationUnitSources) { 5040 for (Source source in library.compilationUnitSources) {
4793 DartEntry dartEntry = _getReadableDartEntry(source); 5041 DartEntry dartEntry = _getReadableDartEntry(source);
4794 if (dartEntry == null) { 5042 if (dartEntry == null) {
4795 // This shouldn't be possible because we should never have performed t he task if the 5043 // This shouldn't be possible because we should never have performed t he task if the
4796 // source didn't represent a Dart file, but check to be safe. 5044 // source didn't represent a Dart file, but check to be safe.
4797 throw new AnalysisException.con1("Internal error: attempting to resolv e non-Dart file as a Dart file: ${source.fullName}"); 5045 throw new AnalysisException.con1("Internal error: attempting to resolv e non-Dart file as a Dart file: ${source.fullName}");
4798 } 5046 }
4799 int sourceTime = getModificationStamp(source); 5047 int sourceTime = getModificationStamp(source);
4800 int resultTime = library.getModificationTime(source); 5048 int resultTime = library.getModificationTime(source);
4801 if (sourceTime != resultTime) { 5049 if (sourceTime != resultTime) {
4802 // The source has changed without the context being notified. Simulate notification. 5050 // The source has changed without the context being notified. Simulate notification.
4803 _sourceChanged(source); 5051 _sourceChanged(source);
4804 allTimesMatch = false; 5052 allTimesMatch = false;
4805 } 5053 }
4806 } 5054 }
4807 } 5055 }
4808 return allTimesMatch; 5056 return allTimesMatch;
4809 } 5057 }
4810 5058
4811 /** 5059 /**
4812 * Given a source for a Dart file and the library that contains it, return a c ache entry in which 5060 * Given a source for a Dart file and the library that contains it, return a c ache entry in which
4813 * the state of the data represented by the given descriptor is either [CacheS tate#VALID] or 5061 * the state of the data represented by the given descriptor is either [CacheS tate#VALID] or
4814 * [CacheState#ERROR]. This method assumes that the data can be produced by ge nerating hints 5062 * [CacheState#ERROR]. This method assumes that the data can be produced by ge nerating hints
4815 * for the library if the data is not already cached. 5063 * for the library if the data is not already cached.
4816 * 5064 *
5065 * <b>Note:</b> This method cannot be used in an async environment.
5066 *
4817 * @param unitSource the source representing the Dart file 5067 * @param unitSource the source representing the Dart file
4818 * @param librarySource the source representing the library containing the Dar t file 5068 * @param librarySource the source representing the library containing the Dar t file
4819 * @param dartEntry the cache entry associated with the Dart file 5069 * @param dartEntry the cache entry associated with the Dart file
4820 * @param descriptor the descriptor representing the data to be returned 5070 * @param descriptor the descriptor representing the data to be returned
4821 * @return a cache entry containing the required data 5071 * @return a cache entry containing the required data
4822 * @throws AnalysisException if data could not be returned because the source could not be parsed 5072 * @throws AnalysisException if data could not be returned because the source could not be parsed
4823 */ 5073 */
4824 DartEntry _cacheDartHintData(Source unitSource, Source librarySource, DartEntr y dartEntry, DataDescriptor descriptor) { 5074 DartEntry _cacheDartHintData(Source unitSource, Source librarySource, DartEntr y dartEntry, DataDescriptor descriptor) {
4825 // 5075 //
4826 // Check to see whether we already have the information being requested. 5076 // Check to see whether we already have the information being requested.
4827 // 5077 //
4828 CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource); 5078 CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
4829 while (state != CacheState.ERROR && state != CacheState.VALID) { 5079 while (state != CacheState.ERROR && state != CacheState.VALID) {
4830 // 5080 //
4831 // If not, compute the information. Unless the modification date of the so urce continues to 5081 // If not, compute the information. Unless the modification date of the so urce continues to
4832 // change, this loop will eventually terminate. 5082 // change, this loop will eventually terminate.
4833 // 5083 //
4834 dartEntry = new GenerateDartHintsTask(this, getLibraryElement(librarySourc e)).perform(_resultRecorder) as DartEntry; 5084 DartEntry libraryEntry = _getReadableDartEntry(librarySource);
5085 libraryEntry = _cacheDartResolutionData(librarySource, librarySource, libr aryEntry, DartEntry.ELEMENT);
5086 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
5087 CompilationUnitElement definingUnit = libraryElement.definingCompilationUn it;
5088 List<CompilationUnitElement> parts = libraryElement.parts;
5089 List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(p arts.length + 1);
5090 units[0] = _getResolvedUnit(definingUnit, librarySource);
5091 if (units[0] == null) {
5092 Source source = definingUnit.source;
5093 units[0] = new TimestampedData<CompilationUnit>(getModificationStamp(sou rce), resolveCompilationUnit(source, libraryElement));
5094 }
5095 for (int i = 0; i < parts.length; i++) {
5096 units[i + 1] = _getResolvedUnit(parts[i], librarySource);
5097 if (units[i + 1] == null) {
5098 Source source = parts[i].source;
5099 units[i + 1] = new TimestampedData<CompilationUnit>(getModificationSta mp(source), resolveCompilationUnit(source, libraryElement));
5100 }
5101 }
5102 dartEntry = new GenerateDartHintsTask(this, units, getLibraryElement(libra rySource)).perform(_resultRecorder) as DartEntry;
4835 state = dartEntry.getStateInLibrary(descriptor, librarySource); 5103 state = dartEntry.getStateInLibrary(descriptor, librarySource);
4836 } 5104 }
4837 return dartEntry; 5105 return dartEntry;
4838 } 5106 }
4839 5107
4840 /** 5108 /**
4841 * Given a source for a Dart file, return a cache entry in which the state of the data represented 5109 * Given a source for a Dart file, return a cache entry in which the state of the data represented
4842 * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This 5110 * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This
4843 * method assumes that the data can be produced by parsing the source if it is not already cached. 5111 * method assumes that the data can be produced by parsing the source if it is not already cached.
4844 * 5112 *
4845 * <b>Note:</b> This method cannot be used in an async environment 5113 * <b>Note:</b> This method cannot be used in an async environment.
4846 * 5114 *
4847 * @param source the source representing the Dart file 5115 * @param source the source representing the Dart file
4848 * @param dartEntry the cache entry associated with the Dart file 5116 * @param dartEntry the cache entry associated with the Dart file
4849 * @param descriptor the descriptor representing the data to be returned 5117 * @param descriptor the descriptor representing the data to be returned
4850 * @return a cache entry containing the required data 5118 * @return a cache entry containing the required data
4851 * @throws AnalysisException if data could not be returned because the source could not be parsed 5119 * @throws AnalysisException if data could not be returned because the source could not be parsed
4852 */ 5120 */
4853 DartEntry _cacheDartParseData(Source source, DartEntry dartEntry, DataDescript or descriptor) { 5121 DartEntry _cacheDartParseData(Source source, DartEntry dartEntry, DataDescript or descriptor) {
4854 if (identical(descriptor, DartEntry.PARSED_UNIT)) { 5122 if (identical(descriptor, DartEntry.PARSED_UNIT)) {
4855 CompilationUnit unit = dartEntry.anyParsedCompilationUnit; 5123 CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
(...skipping 16 matching lines...) Expand all
4872 } 5140 }
4873 return dartEntry; 5141 return dartEntry;
4874 } 5142 }
4875 5143
4876 /** 5144 /**
4877 * Given a source for a Dart file and the library that contains it, return a c ache entry in which 5145 * Given a source for a Dart file and the library that contains it, return a c ache entry in which
4878 * the state of the data represented by the given descriptor is either [CacheS tate#VALID] or 5146 * the state of the data represented by the given descriptor is either [CacheS tate#VALID] or
4879 * [CacheState#ERROR]. This method assumes that the data can be produced by re solving the 5147 * [CacheState#ERROR]. This method assumes that the data can be produced by re solving the
4880 * source in the context of the library if it is not already cached. 5148 * source in the context of the library if it is not already cached.
4881 * 5149 *
5150 * <b>Note:</b> This method cannot be used in an async environment.
5151 *
4882 * @param unitSource the source representing the Dart file 5152 * @param unitSource the source representing the Dart file
4883 * @param librarySource the source representing the library containing the Dar t file 5153 * @param librarySource the source representing the library containing the Dar t file
4884 * @param dartEntry the cache entry associated with the Dart file 5154 * @param dartEntry the cache entry associated with the Dart file
4885 * @param descriptor the descriptor representing the data to be returned 5155 * @param descriptor the descriptor representing the data to be returned
4886 * @return a cache entry containing the required data 5156 * @return a cache entry containing the required data
4887 * @throws AnalysisException if data could not be returned because the source could not be parsed 5157 * @throws AnalysisException if data could not be returned because the source could not be parsed
4888 */ 5158 */
4889 DartEntry _cacheDartResolutionData(Source unitSource, Source librarySource, Da rtEntry dartEntry, DataDescriptor descriptor) { 5159 DartEntry _cacheDartResolutionData(Source unitSource, Source librarySource, Da rtEntry dartEntry, DataDescriptor descriptor) {
4890 // 5160 //
4891 // Check to see whether we already have the information being requested. 5161 // Check to see whether we already have the information being requested.
(...skipping 11 matching lines...) Expand all
4903 } 5173 }
4904 return dartEntry; 5174 return dartEntry;
4905 } 5175 }
4906 5176
4907 /** 5177 /**
4908 * Given a source for a Dart file, return a cache entry in which the state of the data represented 5178 * Given a source for a Dart file, return a cache entry in which the state of the data represented
4909 * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This 5179 * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This
4910 * method assumes that the data can be produced by scanning the source if it i s not already 5180 * method assumes that the data can be produced by scanning the source if it i s not already
4911 * cached. 5181 * cached.
4912 * 5182 *
4913 * <b>Note:</b> This method cannot be used in an async environment 5183 * <b>Note:</b> This method cannot be used in an async environment.
4914 * 5184 *
4915 * @param source the source representing the Dart file 5185 * @param source the source representing the Dart file
4916 * @param dartEntry the cache entry associated with the Dart file 5186 * @param dartEntry the cache entry associated with the Dart file
4917 * @param descriptor the descriptor representing the data to be returned 5187 * @param descriptor the descriptor representing the data to be returned
4918 * @return a cache entry containing the required data 5188 * @return a cache entry containing the required data
4919 * @throws AnalysisException if data could not be returned because the source could not be scanned 5189 * @throws AnalysisException if data could not be returned because the source could not be scanned
4920 */ 5190 */
4921 DartEntry _cacheDartScanData(Source source, DartEntry dartEntry, DataDescripto r descriptor) { 5191 DartEntry _cacheDartScanData(Source source, DartEntry dartEntry, DataDescripto r descriptor) {
4922 // 5192 //
4923 // Check to see whether we already have the information being requested. 5193 // Check to see whether we already have the information being requested.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4961 DartEntry _cacheDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) { 5231 DartEntry _cacheDartVerificationData(Source unitSource, Source librarySource, DartEntry dartEntry, DataDescriptor descriptor) {
4962 // 5232 //
4963 // Check to see whether we already have the information being requested. 5233 // Check to see whether we already have the information being requested.
4964 // 5234 //
4965 CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource); 5235 CacheState state = dartEntry.getStateInLibrary(descriptor, librarySource);
4966 while (state != CacheState.ERROR && state != CacheState.VALID) { 5236 while (state != CacheState.ERROR && state != CacheState.VALID) {
4967 // 5237 //
4968 // If not, compute the information. Unless the modification date of the so urce continues to 5238 // If not, compute the information. Unless the modification date of the so urce continues to
4969 // change, this loop will eventually terminate. 5239 // change, this loop will eventually terminate.
4970 // 5240 //
4971 dartEntry = new GenerateDartErrorsTask(this, unitSource, getLibraryElement (librarySource)).perform(_resultRecorder) as DartEntry; 5241 LibraryElement library = computeLibraryElement(librarySource);
5242 dartEntry = new GenerateDartErrorsTask(this, unitSource, dartEntry.modific ationTime, resolveCompilationUnit(unitSource, library), library).perform(_result Recorder) as DartEntry;
4972 state = dartEntry.getStateInLibrary(descriptor, librarySource); 5243 state = dartEntry.getStateInLibrary(descriptor, librarySource);
4973 } 5244 }
4974 return dartEntry; 5245 return dartEntry;
4975 } 5246 }
4976 5247
4977 /** 5248 /**
4978 * Given a source for an HTML file, return a cache entry in which all of the d ata represented by 5249 * Given a source for an HTML file, return a cache entry in which all of the d ata represented by
4979 * the state of the given descriptors is either [CacheState#VALID] or 5250 * the state of the given descriptors is either [CacheState#VALID] or
4980 * [CacheState#ERROR]. This method assumes that the data can be produced by pa rsing the 5251 * [CacheState#ERROR]. This method assumes that the data can be produced by pa rsing the
4981 * source if it is not already cached. 5252 * source if it is not already cached.
4982 * 5253 *
4983 * <b>Note:</b> This method cannot be used in an async environment 5254 * <b>Note:</b> This method cannot be used in an async environment.
4984 * 5255 *
4985 * @param source the source representing the HTML file 5256 * @param source the source representing the HTML file
4986 * @param htmlEntry the cache entry associated with the HTML file 5257 * @param htmlEntry the cache entry associated with the HTML file
4987 * @param descriptor the descriptor representing the data to be returned 5258 * @param descriptor the descriptor representing the data to be returned
4988 * @return a cache entry containing the required data 5259 * @return a cache entry containing the required data
4989 * @throws AnalysisException if data could not be returned because the source could not be 5260 * @throws AnalysisException if data could not be returned because the source could not be
4990 * resolved 5261 * resolved
4991 */ 5262 */
4992 HtmlEntry _cacheHtmlParseData(Source source, HtmlEntry htmlEntry, DataDescript or descriptor) { 5263 HtmlEntry _cacheHtmlParseData(Source source, HtmlEntry htmlEntry, DataDescript or descriptor) {
4993 if (identical(descriptor, HtmlEntry.PARSED_UNIT)) { 5264 if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
(...skipping 25 matching lines...) Expand all
5019 } 5290 }
5020 return htmlEntry; 5291 return htmlEntry;
5021 } 5292 }
5022 5293
5023 /** 5294 /**
5024 * Given a source for an HTML file, return a cache entry in which the state of the data 5295 * Given a source for an HTML file, return a cache entry in which the state of the data
5025 * represented by the given descriptor is either [CacheState#VALID] or 5296 * represented by the given descriptor is either [CacheState#VALID] or
5026 * [CacheState#ERROR]. This method assumes that the data can be produced by re solving the 5297 * [CacheState#ERROR]. This method assumes that the data can be produced by re solving the
5027 * source if it is not already cached. 5298 * source if it is not already cached.
5028 * 5299 *
5029 * <b>Note:</b> This method cannot be used in an async environment 5300 * <b>Note:</b> This method cannot be used in an async environment.
5030 * 5301 *
5031 * @param source the source representing the HTML file 5302 * @param source the source representing the HTML file
5032 * @param dartEntry the cache entry associated with the HTML file 5303 * @param dartEntry the cache entry associated with the HTML file
5033 * @param descriptor the descriptor representing the data to be returned 5304 * @param descriptor the descriptor representing the data to be returned
5034 * @return a cache entry containing the required data 5305 * @return a cache entry containing the required data
5035 * @throws AnalysisException if data could not be returned because the source could not be 5306 * @throws AnalysisException if data could not be returned because the source could not be
5036 * resolved 5307 * resolved
5037 */ 5308 */
5038 HtmlEntry _cacheHtmlResolutionData(Source source, HtmlEntry htmlEntry, DataDes criptor descriptor) { 5309 HtmlEntry _cacheHtmlResolutionData(Source source, HtmlEntry htmlEntry, DataDes criptor descriptor) {
5039 // 5310 //
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5086 bool _containsAny(List<Source> sources, List<Source> targetSources) { 5357 bool _containsAny(List<Source> sources, List<Source> targetSources) {
5087 for (Source targetSource in targetSources) { 5358 for (Source targetSource in targetSources) {
5088 if (_contains(sources, targetSource)) { 5359 if (_contains(sources, targetSource)) {
5089 return true; 5360 return true;
5090 } 5361 }
5091 } 5362 }
5092 return false; 5363 return false;
5093 } 5364 }
5094 5365
5095 /** 5366 /**
5367 * Create a [GenerateDartErrorsTask] for the given source, marking the verific ation errors
5368 * as being in-process.
5369 *
5370 * @param source the source whose content is to be verified
5371 * @param dartEntry the entry for the source
5372 * @param librarySource the source for the library containing the source
5373 * @param libraryEntry the entry for the library
5374 * @return task data representing the created task
5375 */
5376 AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source source, Dart Entry dartEntry, Source librarySource, SourceEntry libraryEntry) {
5377 if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) != C acheState.VALID || libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
5378 }
5379 CompilationUnit unit = dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
5380 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
5381 DartEntryImpl dartCopy = dartEntry.writableCopy;
5382 dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, Cac heState.IN_PROCESS);
5383 _cache.put(source, dartCopy);
5384 return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, sou rce, dartCopy.modificationTime, unit, libraryElement), false);
5385 }
5386
5387 /**
5388 * Create a [GenerateDartHintsTask] for the given source, marking the hints as being
5389 * in-process.
5390 *
5391 * @param source the source whose content is to be verified
5392 * @param dartEntry the entry for the source
5393 * @param librarySource the source for the library containing the source
5394 * @param libraryEntry the entry for the library
5395 * @return task data representing the created task
5396 */
5397 AnalysisContextImpl_TaskData _createGenerateDartHintsTask(Source source, DartE ntry dartEntry, Source librarySource, DartEntry libraryEntry) {
5398 if (libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
5399 return _createResolveDartLibraryTask(librarySource, libraryEntry);
5400 }
5401 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
5402 CompilationUnitElement definingUnit = libraryElement.definingCompilationUnit ;
5403 List<CompilationUnitElement> parts = libraryElement.parts;
5404 List<TimestampedData<CompilationUnit>> units = new List<TimestampedData>(par ts.length + 1);
5405 units[0] = _getResolvedUnit(definingUnit, librarySource);
5406 if (units[0] == null) {
5407 // TODO(brianwilkerson) We should return a ResolveDartUnitTask (unless the re are multiple ASTs
5408 // that need to be resolved.
5409 return _createResolveDartLibraryTask(librarySource, libraryEntry);
5410 }
5411 for (int i = 0; i < parts.length; i++) {
5412 units[i + 1] = _getResolvedUnit(parts[i], librarySource);
5413 if (units[i + 1] == null) {
5414 // TODO(brianwilkerson) We should return a ResolveDartUnitTask (unless t here are multiple
5415 // ASTs that need to be resolved.
5416 return _createResolveDartLibraryTask(librarySource, libraryEntry);
5417 }
5418 }
5419 DartEntryImpl dartCopy = dartEntry.writableCopy;
5420 dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.IN_PRO CESS);
5421 _cache.put(source, dartCopy);
5422 return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, unit s, libraryElement), false);
5423 }
5424
5425 /**
5096 * Create a [GetContentTask] for the given source, marking the content as bein g in-process. 5426 * Create a [GetContentTask] for the given source, marking the content as bein g in-process.
5097 * 5427 *
5098 * @param source the source whose content is to be accessed 5428 * @param source the source whose content is to be accessed
5099 * @param sourceEntry the entry for the source 5429 * @param sourceEntry the entry for the source
5100 * @return task data representing the created task 5430 * @return task data representing the created task
5101 */ 5431 */
5102 AnalysisContextImpl_TaskData _createGetContentTask(Source source, SourceEntry sourceEntry) { 5432 AnalysisContextImpl_TaskData _createGetContentTask(Source source, SourceEntry sourceEntry) {
5103 SourceEntryImpl sourceCopy = sourceEntry.writableCopy; 5433 SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
5104 sourceCopy.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS); 5434 sourceCopy.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS);
5105 _cache.put(source, sourceCopy); 5435 _cache.put(source, sourceCopy);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
5178 if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) { 5508 if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
5179 return _createResolveHtmlTask(source, htmlEntry); 5509 return _createResolveHtmlTask(source, htmlEntry);
5180 } 5510 }
5181 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 5511 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
5182 htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS); 5512 htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
5183 _cache.put(source, htmlCopy); 5513 _cache.put(source, htmlCopy);
5184 return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this , source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)) , false); 5514 return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this , source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)) , false);
5185 } 5515 }
5186 5516
5187 /** 5517 /**
5518 * Create a [ResolveDartLibraryTask] for the given source, marking the element model as
5519 * being in-process.
5520 *
5521 * @param source the source whose content is to be resolved
5522 * @param dartEntry the entry for the source
5523 * @return task data representing the created task
5524 */
5525 AnalysisContextImpl_TaskData _createResolveDartLibraryTask(Source source, Dart Entry dartEntry) {
5526 try {
5527 AnalysisContextImpl_CycleBuilder builder = new AnalysisContextImpl_CycleBu ilder(this);
5528 builder.computeCycleContaining(source);
5529 AnalysisContextImpl_TaskData taskData = builder.taskData;
5530 if (taskData != null) {
5531 return taskData;
5532 }
5533 return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask(th is, source, source, builder.librariesInCycle), false);
5534 } on AnalysisException catch (exception) {
5535 AnalysisEngine.instance.logger.logError2("Internal error trying to compute the next analysis task", exception);
5536 }
5537 return new AnalysisContextImpl_TaskData(null, false);
5538 }
5539
5540 /**
5188 * Create a [ResolveHtmlTask] for the given source, marking the resolved unit as being 5541 * Create a [ResolveHtmlTask] for the given source, marking the resolved unit as being
5189 * in-process. 5542 * in-process.
5190 * 5543 *
5191 * @param source the source whose content is to be resolved 5544 * @param source the source whose content is to be resolved
5192 * @param htmlEntry the entry for the source 5545 * @param htmlEntry the entry for the source
5193 * @return task data representing the created task 5546 * @return task data representing the created task
5194 */ 5547 */
5195 AnalysisContextImpl_TaskData _createResolveHtmlTask(Source source, HtmlEntry h tmlEntry) { 5548 AnalysisContextImpl_TaskData _createResolveHtmlTask(Source source, HtmlEntry h tmlEntry) {
5196 if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) { 5549 if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) {
5197 return _createParseHtmlTask(source, htmlEntry); 5550 return _createParseHtmlTask(source, htmlEntry);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
5271 List<ChangeNotice> notices = new List.from(_pendingNotices.values); 5624 List<ChangeNotice> notices = new List.from(_pendingNotices.values);
5272 _pendingNotices.clear(); 5625 _pendingNotices.clear();
5273 return notices; 5626 return notices;
5274 } 5627 }
5275 5628
5276 /** 5629 /**
5277 * Given a source for a Dart file and the library that contains it, return the data represented by 5630 * Given a source for a Dart file and the library that contains it, return the data represented by
5278 * the given descriptor that is associated with that source. This method assum es that the data can 5631 * the given descriptor that is associated with that source. This method assum es that the data can
5279 * be produced by generating hints for the library if it is not already cached . 5632 * be produced by generating hints for the library if it is not already cached .
5280 * 5633 *
5634 * <b>Note:</b> This method cannot be used in an async environment.
5635 *
5281 * @param unitSource the source representing the Dart file 5636 * @param unitSource the source representing the Dart file
5282 * @param librarySource the source representing the library containing the Dar t file 5637 * @param librarySource the source representing the library containing the Dar t file
5283 * @param dartEntry the entry representing the Dart file 5638 * @param dartEntry the entry representing the Dart file
5284 * @param descriptor the descriptor representing the data to be returned 5639 * @param descriptor the descriptor representing the data to be returned
5285 * @return the requested data about the given source 5640 * @return the requested data about the given source
5286 * @throws AnalysisException if data could not be returned because the source could not be 5641 * @throws AnalysisException if data could not be returned because the source could not be
5287 * resolved 5642 * resolved
5288 */ 5643 */
5289 Object _getDartHintData(Source unitSource, Source librarySource, DartEntry dar tEntry, DataDescriptor descriptor) { 5644 Object _getDartHintData(Source unitSource, Source librarySource, DartEntry dar tEntry, DataDescriptor descriptor) {
5290 dartEntry = _cacheDartHintData(unitSource, librarySource, dartEntry, descrip tor); 5645 dartEntry = _cacheDartHintData(unitSource, librarySource, dartEntry, descrip tor);
5291 if (identical(descriptor, DartEntry.ELEMENT)) { 5646 if (identical(descriptor, DartEntry.ELEMENT)) {
5292 return dartEntry.getValue(descriptor); 5647 return dartEntry.getValue(descriptor);
5293 } 5648 }
5294 return dartEntry.getValueInLibrary(descriptor, librarySource); 5649 return dartEntry.getValueInLibrary(descriptor, librarySource);
5295 } 5650 }
5296 5651
5297 /** 5652 /**
5298 * Given a source for a Dart file, return the data represented by the given de scriptor that is 5653 * Given a source for a Dart file, return the data represented by the given de scriptor that is
5299 * associated with that source. This method assumes that the data can be produ ced by parsing the 5654 * associated with that source. This method assumes that the data can be produ ced by parsing the
5300 * source if it is not already cached. 5655 * source if it is not already cached.
5301 * 5656 *
5302 * <b>Note:</b> This method cannot be used in an async environment 5657 * <b>Note:</b> This method cannot be used in an async environment.
5303 * 5658 *
5304 * @param source the source representing the Dart file 5659 * @param source the source representing the Dart file
5305 * @param dartEntry the cache entry associated with the Dart file 5660 * @param dartEntry the cache entry associated with the Dart file
5306 * @param descriptor the descriptor representing the data to be returned 5661 * @param descriptor the descriptor representing the data to be returned
5307 * @return the requested data about the given source 5662 * @return the requested data about the given source
5308 * @throws AnalysisException if data could not be returned because the source could not be parsed 5663 * @throws AnalysisException if data could not be returned because the source could not be parsed
5309 */ 5664 */
5310 Object _getDartParseData(Source source, DartEntry dartEntry, DataDescriptor de scriptor) { 5665 Object _getDartParseData(Source source, DartEntry dartEntry, DataDescriptor de scriptor) {
5311 dartEntry = _cacheDartParseData(source, dartEntry, descriptor); 5666 dartEntry = _cacheDartParseData(source, dartEntry, descriptor);
5312 if (identical(descriptor, DartEntry.PARSED_UNIT)) { 5667 if (identical(descriptor, DartEntry.PARSED_UNIT)) {
5313 _accessedAst(source); 5668 _accessedAst(source);
5314 return dartEntry.anyParsedCompilationUnit; 5669 return dartEntry.anyParsedCompilationUnit;
5315 } 5670 }
5316 return dartEntry.getValue(descriptor); 5671 return dartEntry.getValue(descriptor);
5317 } 5672 }
5318 5673
5319 /** 5674 /**
5320 * Given a source for a Dart file, return the data represented by the given de scriptor that is 5675 * Given a source for a Dart file, return the data represented by the given de scriptor that is
5321 * associated with that source, or the given default value if the source is no t a Dart file. This 5676 * associated with that source, or the given default value if the source is no t a Dart file. This
5322 * method assumes that the data can be produced by parsing the source if it is not already cached. 5677 * method assumes that the data can be produced by parsing the source if it is not already cached.
5323 * 5678 *
5324 * <b>Note:</b> This method cannot be used in an async environment 5679 * <b>Note:</b> This method cannot be used in an async environment.
5325 * 5680 *
5326 * @param source the source representing the Dart file 5681 * @param source the source representing the Dart file
5327 * @param descriptor the descriptor representing the data to be returned 5682 * @param descriptor the descriptor representing the data to be returned
5328 * @param defaultValue the value to be returned if the source is not a Dart fi le 5683 * @param defaultValue the value to be returned if the source is not a Dart fi le
5329 * @return the requested data about the given source 5684 * @return the requested data about the given source
5330 * @throws AnalysisException if data could not be returned because the source could not be parsed 5685 * @throws AnalysisException if data could not be returned because the source could not be parsed
5331 */ 5686 */
5332 Object _getDartParseData2(Source source, DataDescriptor descriptor, Object def aultValue) { 5687 Object _getDartParseData2(Source source, DataDescriptor descriptor, Object def aultValue) {
5333 DartEntry dartEntry = _getReadableDartEntry(source); 5688 DartEntry dartEntry = _getReadableDartEntry(source);
5334 if (dartEntry == null) { 5689 if (dartEntry == null) {
5335 return defaultValue; 5690 return defaultValue;
5336 } 5691 }
5337 try { 5692 try {
5338 return _getDartParseData(source, dartEntry, descriptor); 5693 return _getDartParseData(source, dartEntry, descriptor);
5339 } on ObsoleteSourceAnalysisException catch (exception) { 5694 } on ObsoleteSourceAnalysisException catch (exception) {
5340 AnalysisEngine.instance.logger.logInformation2("Could not compute ${descri ptor.toString()}", exception); 5695 AnalysisEngine.instance.logger.logInformation2("Could not compute ${descri ptor.toString()}", exception);
5341 return defaultValue; 5696 return defaultValue;
5342 } 5697 }
5343 } 5698 }
5344 5699
5345 /** 5700 /**
5346 * Given a source for a Dart file and the library that contains it, return the data represented by 5701 * Given a source for a Dart file and the library that contains it, return the data represented by
5347 * the given descriptor that is associated with that source. This method assum es that the data can 5702 * the given descriptor that is associated with that source. This method assum es that the data can
5348 * be produced by resolving the source in the context of the library if it is not already cached. 5703 * be produced by resolving the source in the context of the library if it is not already cached.
5349 * 5704 *
5705 * <b>Note:</b> This method cannot be used in an async environment.
5706 *
5350 * @param unitSource the source representing the Dart file 5707 * @param unitSource the source representing the Dart file
5351 * @param librarySource the source representing the library containing the Dar t file 5708 * @param librarySource the source representing the library containing the Dar t file
5352 * @param dartEntry the entry representing the Dart file 5709 * @param dartEntry the entry representing the Dart file
5353 * @param descriptor the descriptor representing the data to be returned 5710 * @param descriptor the descriptor representing the data to be returned
5354 * @return the requested data about the given source 5711 * @return the requested data about the given source
5355 * @throws AnalysisException if data could not be returned because the source could not be 5712 * @throws AnalysisException if data could not be returned because the source could not be
5356 * resolved 5713 * resolved
5357 */ 5714 */
5358 Object _getDartResolutionData(Source unitSource, Source librarySource, DartEnt ry dartEntry, DataDescriptor descriptor) { 5715 Object _getDartResolutionData(Source unitSource, Source librarySource, DartEnt ry dartEntry, DataDescriptor descriptor) {
5359 dartEntry = _cacheDartResolutionData(unitSource, librarySource, dartEntry, d escriptor); 5716 dartEntry = _cacheDartResolutionData(unitSource, librarySource, dartEntry, d escriptor);
5360 if (identical(descriptor, DartEntry.ELEMENT)) { 5717 if (identical(descriptor, DartEntry.ELEMENT)) {
5361 return dartEntry.getValue(descriptor); 5718 return dartEntry.getValue(descriptor);
5362 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) { 5719 } else if (identical(descriptor, DartEntry.RESOLVED_UNIT)) {
5363 _accessedAst(unitSource); 5720 _accessedAst(unitSource);
5364 } 5721 }
5365 return dartEntry.getValueInLibrary(descriptor, librarySource); 5722 return dartEntry.getValueInLibrary(descriptor, librarySource);
5366 } 5723 }
5367 5724
5368 /** 5725 /**
5369 * Given a source for a Dart file and the library that contains it, return the data represented by 5726 * Given a source for a Dart file and the library that contains it, return the data represented by
5370 * the given descriptor that is associated with that source, or the given defa ult value if the 5727 * the given descriptor that is associated with that source, or the given defa ult value if the
5371 * source is not a Dart file. This method assumes that the data can be produce d by resolving the 5728 * source is not a Dart file. This method assumes that the data can be produce d by resolving the
5372 * source in the context of the library if it is not already cached. 5729 * source in the context of the library if it is not already cached.
5373 * 5730 *
5731 * <b>Note:</b> This method cannot be used in an async environment.
5732 *
5374 * @param unitSource the source representing the Dart file 5733 * @param unitSource the source representing the Dart file
5375 * @param librarySource the source representing the library containing the Dar t file 5734 * @param librarySource the source representing the library containing the Dar t file
5376 * @param descriptor the descriptor representing the data to be returned 5735 * @param descriptor the descriptor representing the data to be returned
5377 * @param defaultValue the value to be returned if the source is not a Dart fi le 5736 * @param defaultValue the value to be returned if the source is not a Dart fi le
5378 * @return the requested data about the given source 5737 * @return the requested data about the given source
5379 * @throws AnalysisException if data could not be returned because the source could not be 5738 * @throws AnalysisException if data could not be returned because the source could not be
5380 * resolved 5739 * resolved
5381 */ 5740 */
5382 Object _getDartResolutionData2(Source unitSource, Source librarySource, DataDe scriptor descriptor, Object defaultValue) { 5741 Object _getDartResolutionData2(Source unitSource, Source librarySource, DataDe scriptor descriptor, Object defaultValue) {
5383 DartEntry dartEntry = _getReadableDartEntry(unitSource); 5742 DartEntry dartEntry = _getReadableDartEntry(unitSource);
5384 if (dartEntry == null) { 5743 if (dartEntry == null) {
5385 return defaultValue; 5744 return defaultValue;
5386 } 5745 }
5387 try { 5746 try {
5388 return _getDartResolutionData(unitSource, librarySource, dartEntry, descri ptor); 5747 return _getDartResolutionData(unitSource, librarySource, dartEntry, descri ptor);
5389 } on ObsoleteSourceAnalysisException catch (exception) { 5748 } on ObsoleteSourceAnalysisException catch (exception) {
5390 AnalysisEngine.instance.logger.logInformation2("Could not compute ${descri ptor.toString()}", exception); 5749 AnalysisEngine.instance.logger.logInformation2("Could not compute ${descri ptor.toString()}", exception);
5391 return defaultValue; 5750 return defaultValue;
5392 } 5751 }
5393 } 5752 }
5394 5753
5395 /** 5754 /**
5396 * Given a source for a Dart file, return the data represented by the given de scriptor that is 5755 * Given a source for a Dart file, return the data represented by the given de scriptor that is
5397 * associated with that source. This method assumes that the data can be produ ced by scanning the 5756 * associated with that source. This method assumes that the data can be produ ced by scanning the
5398 * source if it is not already cached. 5757 * source if it is not already cached.
5399 * 5758 *
5400 * <b>Note:</b> This method cannot be used in an async environment 5759 * <b>Note:</b> This method cannot be used in an async environment.
5401 * 5760 *
5402 * @param source the source representing the Dart file 5761 * @param source the source representing the Dart file
5403 * @param dartEntry the cache entry associated with the Dart file 5762 * @param dartEntry the cache entry associated with the Dart file
5404 * @param descriptor the descriptor representing the data to be returned 5763 * @param descriptor the descriptor representing the data to be returned
5405 * @return the requested data about the given source 5764 * @return the requested data about the given source
5406 * @throws AnalysisException if data could not be returned because the source could not be scanned 5765 * @throws AnalysisException if data could not be returned because the source could not be scanned
5407 */ 5766 */
5408 Object _getDartScanData(Source source, DartEntry dartEntry, DataDescriptor des criptor) { 5767 Object _getDartScanData(Source source, DartEntry dartEntry, DataDescriptor des criptor) {
5409 dartEntry = _cacheDartScanData(source, dartEntry, descriptor); 5768 dartEntry = _cacheDartScanData(source, dartEntry, descriptor);
5410 return dartEntry.getValue(descriptor); 5769 return dartEntry.getValue(descriptor);
5411 } 5770 }
5412 5771
5413 /** 5772 /**
5414 * Given a source for a Dart file, return the data represented by the given de scriptor that is 5773 * Given a source for a Dart file, return the data represented by the given de scriptor that is
5415 * associated with that source, or the given default value if the source is no t a Dart file. This 5774 * associated with that source, or the given default value if the source is no t a Dart file. This
5416 * method assumes that the data can be produced by scanning the source if it i s not already 5775 * method assumes that the data can be produced by scanning the source if it i s not already
5417 * cached. 5776 * cached.
5418 * 5777 *
5419 * <b>Note:</b> This method cannot be used in an async environment 5778 * <b>Note:</b> This method cannot be used in an async environment.
5420 * 5779 *
5421 * @param source the source representing the Dart file 5780 * @param source the source representing the Dart file
5422 * @param descriptor the descriptor representing the data to be returned 5781 * @param descriptor the descriptor representing the data to be returned
5423 * @param defaultValue the value to be returned if the source is not a Dart fi le 5782 * @param defaultValue the value to be returned if the source is not a Dart fi le
5424 * @return the requested data about the given source 5783 * @return the requested data about the given source
5425 * @throws AnalysisException if data could not be returned because the source could not be scanned 5784 * @throws AnalysisException if data could not be returned because the source could not be scanned
5426 */ 5785 */
5427 Object _getDartScanData2(Source source, DataDescriptor descriptor, Object defa ultValue) { 5786 Object _getDartScanData2(Source source, DataDescriptor descriptor, Object defa ultValue) {
5428 DartEntry dartEntry = _getReadableDartEntry(source); 5787 DartEntry dartEntry = _getReadableDartEntry(source);
5429 if (dartEntry == null) { 5788 if (dartEntry == null) {
(...skipping 25 matching lines...) Expand all
5455 Object _getDartVerificationData(Source unitSource, Source librarySource, DartE ntry dartEntry, DataDescriptor descriptor) { 5814 Object _getDartVerificationData(Source unitSource, Source librarySource, DartE ntry dartEntry, DataDescriptor descriptor) {
5456 dartEntry = _cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor); 5815 dartEntry = _cacheDartVerificationData(unitSource, librarySource, dartEntry, descriptor);
5457 return dartEntry.getValueInLibrary(descriptor, librarySource); 5816 return dartEntry.getValueInLibrary(descriptor, librarySource);
5458 } 5817 }
5459 5818
5460 /** 5819 /**
5461 * Given a source for an HTML file, return the data represented by the given d escriptor that is 5820 * Given a source for an HTML file, return the data represented by the given d escriptor that is
5462 * associated with that source, or the given default value if the source is no t an HTML file. This 5821 * associated with that source, or the given default value if the source is no t an HTML file. This
5463 * method assumes that the data can be produced by parsing the source if it is not already cached. 5822 * method assumes that the data can be produced by parsing the source if it is not already cached.
5464 * 5823 *
5465 * <b>Note:</b> This method cannot be used in an async environment 5824 * <b>Note:</b> This method cannot be used in an async environment.
5466 * 5825 *
5467 * @param source the source representing the Dart file 5826 * @param source the source representing the Dart file
5468 * @param descriptor the descriptor representing the data to be returned 5827 * @param descriptor the descriptor representing the data to be returned
5469 * @param defaultValue the value to be returned if the source is not an HTML f ile 5828 * @param defaultValue the value to be returned if the source is not an HTML f ile
5470 * @return the requested data about the given source 5829 * @return the requested data about the given source
5471 * @throws AnalysisException if data could not be returned because the source could not be parsed 5830 * @throws AnalysisException if data could not be returned because the source could not be parsed
5472 */ 5831 */
5473 Object _getHtmlParseData(Source source, DataDescriptor descriptor, Object defa ultValue) { 5832 Object _getHtmlParseData(Source source, DataDescriptor descriptor, Object defa ultValue) {
5474 HtmlEntry htmlEntry = _getReadableHtmlEntry(source); 5833 HtmlEntry htmlEntry = _getReadableHtmlEntry(source);
5475 if (htmlEntry == null) { 5834 if (htmlEntry == null) {
5476 return defaultValue; 5835 return defaultValue;
5477 } 5836 }
5478 htmlEntry = _cacheHtmlParseData(source, htmlEntry, descriptor); 5837 htmlEntry = _cacheHtmlParseData(source, htmlEntry, descriptor);
5479 if (identical(descriptor, HtmlEntry.PARSED_UNIT)) { 5838 if (identical(descriptor, HtmlEntry.PARSED_UNIT)) {
5480 _accessedAst(source); 5839 _accessedAst(source);
5481 return htmlEntry.anyParsedUnit; 5840 return htmlEntry.anyParsedUnit;
5482 } 5841 }
5483 return htmlEntry.getValue(descriptor); 5842 return htmlEntry.getValue(descriptor);
5484 } 5843 }
5485 5844
5486 /** 5845 /**
5487 * Given a source for an HTML file, return the data represented by the given d escriptor that is 5846 * Given a source for an HTML file, return the data represented by the given d escriptor that is
5488 * associated with that source, or the given default value if the source is no t an HTML file. This 5847 * associated with that source, or the given default value if the source is no t an HTML file. This
5489 * method assumes that the data can be produced by resolving the source if it is not already 5848 * method assumes that the data can be produced by resolving the source if it is not already
5490 * cached. 5849 * cached.
5491 * 5850 *
5492 * <b>Note:</b> This method cannot be used in an async environment 5851 * <b>Note:</b> This method cannot be used in an async environment.
5493 * 5852 *
5494 * @param source the source representing the HTML file 5853 * @param source the source representing the HTML file
5495 * @param descriptor the descriptor representing the data to be returned 5854 * @param descriptor the descriptor representing the data to be returned
5496 * @param defaultValue the value to be returned if the source is not an HTML f ile 5855 * @param defaultValue the value to be returned if the source is not an HTML f ile
5497 * @return the requested data about the given source 5856 * @return the requested data about the given source
5498 * @throws AnalysisException if data could not be returned because the source could not be 5857 * @throws AnalysisException if data could not be returned because the source could not be
5499 * resolved 5858 * resolved
5500 */ 5859 */
5501 Object _getHtmlResolutionData(Source source, DataDescriptor descriptor, Object defaultValue) { 5860 Object _getHtmlResolutionData(Source source, DataDescriptor descriptor, Object defaultValue) {
5502 HtmlEntry htmlEntry = _getReadableHtmlEntry(source); 5861 HtmlEntry htmlEntry = _getReadableHtmlEntry(source);
5503 if (htmlEntry == null) { 5862 if (htmlEntry == null) {
5504 return defaultValue; 5863 return defaultValue;
5505 } 5864 }
5506 try { 5865 try {
5507 return _getHtmlResolutionData2(source, htmlEntry, descriptor); 5866 return _getHtmlResolutionData2(source, htmlEntry, descriptor);
5508 } on ObsoleteSourceAnalysisException catch (exception) { 5867 } on ObsoleteSourceAnalysisException catch (exception) {
5509 AnalysisEngine.instance.logger.logInformation2("Could not compute ${descri ptor.toString()}", exception); 5868 AnalysisEngine.instance.logger.logInformation2("Could not compute ${descri ptor.toString()}", exception);
5510 return defaultValue; 5869 return defaultValue;
5511 } 5870 }
5512 } 5871 }
5513 5872
5514 /** 5873 /**
5515 * Given a source for an HTML file, return the data represented by the given d escriptor that is 5874 * Given a source for an HTML file, return the data represented by the given d escriptor that is
5516 * associated with that source. This method assumes that the data can be produ ced by resolving the 5875 * associated with that source. This method assumes that the data can be produ ced by resolving the
5517 * source if it is not already cached. 5876 * source if it is not already cached.
5518 * 5877 *
5519 * <b>Note:</b> This method cannot be used in an async environment 5878 * <b>Note:</b> This method cannot be used in an async environment.
5520 * 5879 *
5521 * @param source the source representing the HTML file 5880 * @param source the source representing the HTML file
5522 * @param htmlEntry the entry representing the HTML file 5881 * @param htmlEntry the entry representing the HTML file
5523 * @param descriptor the descriptor representing the data to be returned 5882 * @param descriptor the descriptor representing the data to be returned
5524 * @return the requested data about the given source 5883 * @return the requested data about the given source
5525 * @throws AnalysisException if data could not be returned because the source could not be 5884 * @throws AnalysisException if data could not be returned because the source could not be
5526 * resolved 5885 * resolved
5527 */ 5886 */
5528 Object _getHtmlResolutionData2(Source source, HtmlEntry htmlEntry, DataDescrip tor descriptor) { 5887 Object _getHtmlResolutionData2(Source source, HtmlEntry htmlEntry, DataDescrip tor descriptor) {
5529 htmlEntry = _cacheHtmlResolutionData(source, htmlEntry, descriptor); 5888 htmlEntry = _cacheHtmlResolutionData(source, htmlEntry, descriptor);
5530 if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) { 5889 if (identical(descriptor, HtmlEntry.RESOLVED_UNIT)) {
5531 _accessedAst(source); 5890 _accessedAst(source);
5532 } 5891 }
5533 return htmlEntry.getValue(descriptor); 5892 return htmlEntry.getValue(descriptor);
5534 } 5893 }
5535 5894
5536 /** 5895 /**
5537 * Look through the cache for a task that needs to be performed. Return the ta sk that was found, 5896 * Look through the cache for a task that needs to be performed. Return the ta sk that was found,
5538 * or `null` if there is no more work to be done. 5897 * or `null` if there is no more work to be done.
5539 * 5898 *
5540 * @return the next task that needs to be performed 5899 * @return the next task that needs to be performed
5541 */ 5900 */
5542 AnalysisTask get nextAnalysisTask { 5901 AnalysisTask get nextAnalysisTask {
5543 bool hintsEnabled = _options.hint; 5902 bool hintsEnabled = _options.hint;
5544 bool sdkErrorsEnabled = _options.generateSdkErrors;
5545 bool hasBlockedTask = false; 5903 bool hasBlockedTask = false;
5546 // 5904 //
5547 // Look for incremental analysis 5905 // Look for incremental analysis
5548 // 5906 //
5549 if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork) { 5907 if (_incrementalAnalysisCache != null && _incrementalAnalysisCache.hasWork) {
5550 AnalysisTask task = new IncrementalAnalysisTask(this, _incrementalAnalysis Cache); 5908 AnalysisTask task = new IncrementalAnalysisTask(this, _incrementalAnalysis Cache);
5551 _incrementalAnalysisCache = null; 5909 _incrementalAnalysisCache = null;
5552 return task; 5910 return task;
5553 } 5911 }
5554 // 5912 //
5555 // Look for a priority source that needs to be analyzed. 5913 // Look for a priority source that needs to be analyzed.
5556 // 5914 //
5557 for (Source source in _priorityOrder) { 5915 int priorityCount = _priorityOrder.length;
5558 AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(sour ce, _cache.get(source), true, hintsEnabled, sdkErrorsEnabled); 5916 for (int i = 0; i < priorityCount; i++) {
5917 Source source = _priorityOrder[i];
5918 AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(sour ce, _cache.get(source), true, hintsEnabled);
5559 AnalysisTask task = taskData.task; 5919 AnalysisTask task = taskData.task;
5560 if (task != null) { 5920 if (task != null) {
5561 return task; 5921 return task;
5562 } else if (taskData.isBlocked) { 5922 } else if (taskData.isBlocked) {
5563 hasBlockedTask = true; 5923 hasBlockedTask = true;
5564 } 5924 }
5565 } 5925 }
5926 if (_neededForResolution != null) {
5927 for (Source source in _neededForResolution) {
5928 SourceEntry sourceEntry = _cache.get(source);
5929 if (sourceEntry is DartEntry) {
5930 DartEntry dartEntry = sourceEntry;
5931 if (!dartEntry.hasResolvableCompilationUnit) {
5932 AnalysisContextImpl_TaskData taskData = _createParseDartTask(source, dartEntry);
5933 AnalysisTask task = taskData.task;
5934 if (task != null) {
5935 return task;
5936 } else if (taskData.isBlocked) {
5937 hasBlockedTask = true;
5938 }
5939 }
5940 }
5941 }
5942 }
5566 // 5943 //
5567 // Look for a non-priority source that needs to be analyzed. 5944 // Look for a non-priority source that needs to be analyzed.
5568 // 5945 //
5569 List<Source> sourcesToRemove = new List<Source>(); 5946 List<Source> sourcesToRemove = new List<Source>();
5570 WorkManager_WorkIterator sources = _workManager.iterator(); 5947 WorkManager_WorkIterator sources = _workManager.iterator();
5571 while (sources.hasNext) { 5948 while (sources.hasNext) {
5572 Source source = sources.next(); 5949 Source source = sources.next();
5573 AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(sour ce, _cache.get(source), false, hintsEnabled, sdkErrorsEnabled); 5950 AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(sour ce, _cache.get(source), false, hintsEnabled);
5574 AnalysisTask task = taskData.task; 5951 AnalysisTask task = taskData.task;
5575 if (task != null) { 5952 if (task != null) {
5953 int count = sourcesToRemove.length;
5954 for (int i = 0; i < count; i++) {
5955 _workManager.remove(sourcesToRemove[i]);
5956 }
5576 return task; 5957 return task;
5577 } else if (taskData.isBlocked) { 5958 } else if (taskData.isBlocked) {
5578 hasBlockedTask = true; 5959 hasBlockedTask = true;
5579 } else { 5960 } else {
5580 sourcesToRemove.add(source); 5961 sourcesToRemove.add(source);
5581 } 5962 }
5582 } 5963 }
5583 int count = sourcesToRemove.length; 5964 int count = sourcesToRemove.length;
5584 for (int i = 0; i < count; i++) { 5965 for (int i = 0; i < count; i++) {
5585 _workManager.remove(sourcesToRemove[i]); 5966 _workManager.remove(sourcesToRemove[i]);
(...skipping 21 matching lines...) Expand all
5607 * Look at the given source to see whether a task needs to be performed relate d to it. Return the 5988 * Look at the given source to see whether a task needs to be performed relate d to it. Return the
5608 * task that should be performed, or `null` if there is no more work to be don e for the 5989 * task that should be performed, or `null` if there is no more work to be don e for the
5609 * source. 5990 * source.
5610 * 5991 *
5611 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock]. 5992 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
5612 * 5993 *
5613 * @param source the source to be checked 5994 * @param source the source to be checked
5614 * @param sourceEntry the cache entry associated with the source 5995 * @param sourceEntry the cache entry associated with the source
5615 * @param isPriority `true` if the source is a priority source 5996 * @param isPriority `true` if the source is a priority source
5616 * @param hintsEnabled `true` if hints are currently enabled 5997 * @param hintsEnabled `true` if hints are currently enabled
5617 * @param sdkErrorsEnabled `true` if errors, warnings and hints should be gene rated for
5618 * sources in the SDK
5619 * @return the next task that needs to be performed for the given source 5998 * @return the next task that needs to be performed for the given source
5620 */ 5999 */
5621 AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, Sour ceEntry sourceEntry, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) { 6000 AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, Sour ceEntry sourceEntry, bool isPriority, bool hintsEnabled) {
5622 if (sourceEntry == null) { 6001 if (sourceEntry == null) {
5623 return new AnalysisContextImpl_TaskData(null, false); 6002 return new AnalysisContextImpl_TaskData(null, false);
5624 } 6003 }
5625 CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT); 6004 CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
5626 if (identical(contentState, CacheState.INVALID)) { 6005 if (identical(contentState, CacheState.INVALID)) {
5627 return _createGetContentTask(source, sourceEntry); 6006 return _createGetContentTask(source, sourceEntry);
5628 } else if (identical(contentState, CacheState.IN_PROCESS)) { 6007 } else if (identical(contentState, CacheState.IN_PROCESS)) {
5629 // We are already in the process of getting the content. There's nothing e lse we can do with 6008 // We are already in the process of getting the content. There's nothing e lse we can do with
5630 // this source until that's complete. 6009 // this source until that's complete.
5631 return new AnalysisContextImpl_TaskData(null, true); 6010 return new AnalysisContextImpl_TaskData(null, true);
(...skipping 10 matching lines...) Expand all
5642 CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS); 6021 CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
5643 if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && iden tical(parseErrorsState, CacheState.FLUSHED))) { 6022 if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && iden tical(parseErrorsState, CacheState.FLUSHED))) {
5644 return _createParseDartTask(source, dartEntry); 6023 return _createParseDartTask(source, dartEntry);
5645 } 6024 }
5646 if (isPriority && parseErrorsState != CacheState.ERROR) { 6025 if (isPriority && parseErrorsState != CacheState.ERROR) {
5647 CompilationUnit parseUnit = dartEntry.anyParsedCompilationUnit; 6026 CompilationUnit parseUnit = dartEntry.anyParsedCompilationUnit;
5648 if (parseUnit == null) { 6027 if (parseUnit == null) {
5649 return _createParseDartTask(source, dartEntry); 6028 return _createParseDartTask(source, dartEntry);
5650 } 6029 }
5651 } 6030 }
6031 SourceKind kind = dartEntry.getValue(DartEntry.SOURCE_KIND);
6032 if (identical(kind, SourceKind.UNKNOWN)) {
6033 return _createParseDartTask(source, dartEntry);
6034 } else if (identical(kind, SourceKind.LIBRARY)) {
6035 CacheState elementState = dartEntry.getState(DartEntry.ELEMENT);
6036 if (identical(elementState, CacheState.INVALID)) {
6037 return _createResolveDartLibraryTask(source, dartEntry);
6038 }
6039 }
5652 List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING _LIBRARIES); 6040 List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING _LIBRARIES);
5653 for (Source librarySource in librariesContaining) { 6041 for (Source librarySource in librariesContaining) {
5654 SourceEntry libraryEntry = _cache.get(librarySource); 6042 SourceEntry libraryEntry = _cache.get(librarySource);
5655 if (libraryEntry is DartEntry) { 6043 if (libraryEntry is DartEntry) {
5656 CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT); 6044 CacheState elementState = libraryEntry.getState(DartEntry.ELEMENT);
5657 if (identical(elementState, CacheState.INVALID) || (isPriority && iden tical(elementState, CacheState.FLUSHED))) { 6045 if (identical(elementState, CacheState.INVALID) || (isPriority && iden tical(elementState, CacheState.FLUSHED))) {
6046 //return createResolveDartLibraryTask(librarySource, (DartEntry) lib raryEntry);
5658 DartEntryImpl libraryCopy = libraryEntry.writableCopy; 6047 DartEntryImpl libraryCopy = libraryEntry.writableCopy;
5659 libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS); 6048 libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
5660 _cache.put(librarySource, libraryCopy); 6049 _cache.put(librarySource, libraryCopy);
5661 return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(t his, source, librarySource), false); 6050 return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(t his, source, librarySource), false);
5662 } 6051 }
5663 CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.R ESOLVED_UNIT, librarySource); 6052 CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.R ESOLVED_UNIT, librarySource);
5664 if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) { 6053 if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
5665 // 6054 //
5666 // The commented out lines below are an optimization that doesn't qu ite work yet. The 6055 // The commented out lines below are an optimization that doesn't qu ite work yet. The
5667 // problem is that if the source was not resolved because it wasn't part of any library, 6056 // problem is that if the source was not resolved because it wasn't part of any library,
5668 // then there won't be any elements in the element model that we can use to resolve it. 6057 // then there won't be any elements in the element model that we can use to resolve it.
5669 // 6058 //
5670 //LibraryElement libraryElement = libraryEntry.getValue(DartEntry.EL EMENT); 6059 //LibraryElement libraryElement = libraryEntry.getValue(DartEntry.EL EMENT);
5671 //if (libraryElement != null) { 6060 //if (libraryElement != null) {
6061 // return new ResolveDartUnitTask(this, source, libraryElement);
6062 //}
6063 // Possibly replace with: return createResolveDartLibraryTask(librar ySource, (DartEntry) libraryEntry);
5672 DartEntryImpl dartCopy = dartEntry.writableCopy; 6064 DartEntryImpl dartCopy = dartEntry.writableCopy;
5673 dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, C acheState.IN_PROCESS); 6065 dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, C acheState.IN_PROCESS);
5674 _cache.put(source, dartCopy); 6066 _cache.put(source, dartCopy);
5675 //return new ResolveDartUnitTask(this, source, libraryElement);
5676 return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(t his, source, librarySource), false); 6067 return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(t his, source, librarySource), false);
5677 } 6068 }
5678 if (sdkErrorsEnabled || !source.isInSystemLibrary) { 6069 if (_generateSdkErrors || !source.isInSystemLibrary) {
5679 CacheState verificationErrorsState = dartEntry.getStateInLibrary(Dar tEntry.VERIFICATION_ERRORS, librarySource); 6070 CacheState verificationErrorsState = dartEntry.getStateInLibrary(Dar tEntry.VERIFICATION_ERRORS, librarySource);
5680 if (identical(verificationErrorsState, CacheState.INVALID) || (isPri ority && identical(verificationErrorsState, CacheState.FLUSHED))) { 6071 if (identical(verificationErrorsState, CacheState.INVALID) || (isPri ority && identical(verificationErrorsState, CacheState.FLUSHED))) {
5681 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.EL EMENT); 6072 return _createGenerateDartErrorsTask(source, dartEntry, librarySou rce, libraryEntry);
5682 if (libraryElement != null) {
5683 DartEntryImpl dartCopy = dartEntry.writableCopy;
5684 dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librar ySource, CacheState.IN_PROCESS);
5685 _cache.put(source, dartCopy);
5686 return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTa sk(this, source, libraryElement), false);
5687 }
5688 } 6073 }
5689 if (hintsEnabled) { 6074 if (hintsEnabled) {
5690 CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINT S, librarySource); 6075 CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINT S, librarySource);
5691 if (identical(hintsState, CacheState.INVALID) || (isPriority && id entical(hintsState, CacheState.FLUSHED))) { 6076 if (identical(hintsState, CacheState.INVALID) || (isPriority && id entical(hintsState, CacheState.FLUSHED))) {
5692 LibraryElement libraryElement = libraryEntry.getValue(DartEntry. ELEMENT); 6077 return _createGenerateDartHintsTask(source, dartEntry, librarySo urce, libraryEntry);
5693 if (libraryElement != null) {
5694 DartEntryImpl dartCopy = dartEntry.writableCopy;
5695 dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, Cac heState.IN_PROCESS);
5696 _cache.put(source, dartCopy);
5697 return new AnalysisContextImpl_TaskData(new GenerateDartHintsT ask(this, libraryElement), false);
5698 }
5699 } 6078 }
5700 } 6079 }
5701 } 6080 }
5702 } 6081 }
5703 } 6082 }
5704 } else if (sourceEntry is HtmlEntry) { 6083 } else if (sourceEntry is HtmlEntry) {
5705 HtmlEntry htmlEntry = sourceEntry; 6084 HtmlEntry htmlEntry = sourceEntry;
5706 CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS); 6085 CacheState parseErrorsState = htmlEntry.getState(HtmlEntry.PARSE_ERRORS);
5707 if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && iden tical(parseErrorsState, CacheState.FLUSHED))) { 6086 if (identical(parseErrorsState, CacheState.INVALID) || (isPriority && iden tical(parseErrorsState, CacheState.FLUSHED))) {
5708 return _createParseHtmlTask(source, htmlEntry); 6087 return _createParseHtmlTask(source, htmlEntry);
5709 } 6088 }
5710 if (isPriority && parseErrorsState != CacheState.ERROR) { 6089 if (isPriority && parseErrorsState != CacheState.ERROR) {
5711 ht.HtmlUnit parsedUnit = htmlEntry.anyParsedUnit; 6090 ht.HtmlUnit parsedUnit = htmlEntry.anyParsedUnit;
5712 if (parsedUnit == null) { 6091 if (parsedUnit == null) {
5713 return _createParseHtmlTask(source, htmlEntry); 6092 return _createParseHtmlTask(source, htmlEntry);
5714 } 6093 }
5715 } 6094 }
5716 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) ; 6095 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) ;
5717 if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && ide ntical(resolvedUnitState, CacheState.FLUSHED))) { 6096 if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && ide ntical(resolvedUnitState, CacheState.FLUSHED))) {
5718 return _createResolveHtmlTask(source, htmlEntry); 6097 return _createResolveHtmlTask(source, htmlEntry);
5719 } 6098 }
5720 // 6099 //
5721 // Angular support 6100 // Angular support
5722 // 6101 //
5723 if (_options.analyzeAngular) { 6102 if (_options.analyzeAngular) {
5724 // Try to resolve the HTML as an Angular entry point. 6103 // Try to resolve the HTML as an Angular entry point.
5725 CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTR Y); 6104 CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTR Y);
5726 if (identical(angularEntryState, CacheState.INVALID)) { 6105 if (identical(angularEntryState, CacheState.INVALID) || (isPriority && i dentical(angularEntryState, CacheState.FLUSHED))) {
5727 return _createResolveAngularEntryHtmlTask(source, htmlEntry); 6106 return _createResolveAngularEntryHtmlTask(source, htmlEntry);
5728 } 6107 }
5729 // Try to resolve the HTML as an Angular application part. 6108 // Try to resolve the HTML as an Angular application part.
5730 CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERR ORS); 6109 CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERR ORS);
5731 if (identical(angularErrorsState, CacheState.INVALID)) { 6110 if (identical(angularErrorsState, CacheState.INVALID) || (isPriority && identical(angularErrorsState, CacheState.FLUSHED))) {
5732 return _createResolveAngularComponentTemplateTask(source, htmlEntry); 6111 return _createResolveAngularComponentTemplateTask(source, htmlEntry);
5733 } 6112 }
5734 } 6113 }
5735 } 6114 }
5736 return new AnalysisContextImpl_TaskData(null, false); 6115 return new AnalysisContextImpl_TaskData(null, false);
5737 } 6116 }
5738 6117
5739 /** 6118 /**
5740 * Return a change notice for the given source, creating one if one does not a lready exist. 6119 * Return a change notice for the given source, creating one if one does not a lready exist.
5741 * 6120 *
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
5804 /** 6183 /**
5805 * Return the cache entry associated with the given source, or `null` if there is no entry 6184 * Return the cache entry associated with the given source, or `null` if there is no entry
5806 * associated with the source. 6185 * associated with the source.
5807 * 6186 *
5808 * @param source the source for which a cache entry is being sought 6187 * @param source the source for which a cache entry is being sought
5809 * @return the source cache entry associated with the given source 6188 * @return the source cache entry associated with the given source
5810 */ 6189 */
5811 SourceEntry _getReadableSourceEntryOrNull(Source source) => _cache.get(source) ; 6190 SourceEntry _getReadableSourceEntryOrNull(Source source) => _cache.get(source) ;
5812 6191
5813 /** 6192 /**
6193 * Return a resolved compilation unit corresponding to the given element in th e given library, or
6194 * `null` if the information is not cached.
6195 *
6196 * @param element the element representing the compilation unit
6197 * @param librarySource the source representing the library containing the uni t
6198 * @return the specified resolved compilation unit
6199 */
6200 TimestampedData<CompilationUnit> _getResolvedUnit(CompilationUnitElement eleme nt, Source librarySource) {
6201 SourceEntry sourceEntry = _cache.get(element.source);
6202 if (sourceEntry is DartEntry) {
6203 DartEntry dartEntry = sourceEntry;
6204 if (identical(dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, library Source), CacheState.VALID)) {
6205 return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, dartEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource));
6206 }
6207 }
6208 return null;
6209 }
6210
6211 /**
5814 * Return an array containing all of the sources known to this context that ha ve the given kind. 6212 * Return an array containing all of the sources known to this context that ha ve the given kind.
5815 * 6213 *
5816 * @param kind the kind of sources to be returned 6214 * @param kind the kind of sources to be returned
5817 * @return all of the sources known to this context that have the given kind 6215 * @return all of the sources known to this context that have the given kind
5818 */ 6216 */
5819 List<Source> _getSources(SourceKind kind) { 6217 List<Source> _getSources(SourceKind kind) {
5820 List<Source> sources = new List<Source>(); 6218 List<Source> sources = new List<Source>();
5821 for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) { 6219 for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
5822 if (identical(entry.getValue().kind, kind)) { 6220 if (identical(entry.getValue().kind, kind)) {
5823 sources.add(entry.getKey()); 6221 sources.add(entry.getKey());
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
5905 return; 6303 return;
5906 } 6304 }
5907 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) ; 6305 CacheState resolvedUnitState = htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) ;
5908 if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && ide ntical(resolvedUnitState, CacheState.FLUSHED))) { 6306 if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && ide ntical(resolvedUnitState, CacheState.FLUSHED))) {
5909 sources.add(source); 6307 sources.add(source);
5910 return; 6308 return;
5911 } 6309 }
5912 // Angular 6310 // Angular
5913 if (_options.analyzeAngular) { 6311 if (_options.analyzeAngular) {
5914 CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERR ORS); 6312 CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERR ORS);
5915 if (identical(angularErrorsState, CacheState.INVALID)) { 6313 if (identical(angularErrorsState, CacheState.INVALID) || (isPriority && identical(angularErrorsState, CacheState.FLUSHED))) {
5916 AngularApplication entryInfo = htmlEntry.getValue(HtmlEntry.ANGULAR_EN TRY); 6314 AngularApplication entryInfo = htmlEntry.getValue(HtmlEntry.ANGULAR_EN TRY);
5917 if (entryInfo != null) { 6315 if (entryInfo != null) {
5918 sources.add(source); 6316 sources.add(source);
5919 return; 6317 return;
5920 } 6318 }
5921 AngularApplication applicationInfo = htmlEntry.getValue(HtmlEntry.ANGU LAR_APPLICATION); 6319 AngularApplication applicationInfo = htmlEntry.getValue(HtmlEntry.ANGU LAR_APPLICATION);
5922 if (applicationInfo != null) { 6320 if (applicationInfo != null) {
5923 AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANG ULAR_COMPONENT); 6321 AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANG ULAR_COMPONENT);
5924 if (component != null) { 6322 if (component != null) {
5925 sources.add(source); 6323 sources.add(source);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
5992 } 6390 }
5993 } 6391 }
5994 // reset Dart sources 6392 // reset Dart sources
5995 List<Source> oldElementSources = application.elementSources; 6393 List<Source> oldElementSources = application.elementSources;
5996 for (Source elementSource in oldElementSources) { 6394 for (Source elementSource in oldElementSources) {
5997 DartEntry dartEntry = _getReadableDartEntry(elementSource); 6395 DartEntry dartEntry = _getReadableDartEntry(elementSource);
5998 DartEntryImpl dartCopy = dartEntry.writableCopy; 6396 DartEntryImpl dartCopy = dartEntry.writableCopy;
5999 dartCopy.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS); 6397 dartCopy.setValue(DartEntry.ANGULAR_ERRORS, AnalysisError.NO_ERRORS);
6000 _cache.put(elementSource, dartCopy); 6398 _cache.put(elementSource, dartCopy);
6001 // notify about (disappeared) Angular errors 6399 // notify about (disappeared) Angular errors
6002 ChangeNoticeImpl notice = _getNotice(elementSource); 6400 if (_generateSdkErrors || !elementSource.isInSystemLibrary) {
6003 notice.setErrors(dartCopy.allErrors, dartEntry.getValue(SourceEntry.LINE_I NFO)); 6401 ChangeNoticeImpl notice = _getNotice(elementSource);
6402 notice.setErrors(dartCopy.allErrors, dartEntry.getValue(SourceEntry.LINE _INFO));
6403 }
6004 } 6404 }
6005 } 6405 }
6006 6406
6007 /** 6407 /**
6008 * In response to a change to at least one of the compilation units in the giv en library, 6408 * In response to a change to at least one of the compilation units in the giv en library,
6009 * invalidate any results that are dependent on the result of resolving that l ibrary. 6409 * invalidate any results that are dependent on the result of resolving that l ibrary.
6010 * 6410 *
6011 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock]. 6411 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
6012 * 6412 *
6013 * <b>Note:</b> Any cache entries that were accessed before this method was in voked must be 6413 * <b>Note:</b> Any cache entries that were accessed before this method was in voked must be
6014 * re-accessed after this method returns. 6414 * re-accessed after this method returns.
6015 * 6415 *
6016 * @param librarySource the source of the library being invalidated 6416 * @param librarySource the source of the library being invalidated
6017 * @param writer the writer to which debugging information should be written 6417 * @param writer the writer to which debugging information should be written
6018 */ 6418 */
6019 void _invalidateLibraryResolution(Source librarySource, PrintStringWriter writ er) { 6419 void _invalidateLibraryResolution(Source librarySource, PrintStringWriter writ er) {
6020 // TODO(brianwilkerson) This could be optimized. There's no need to flush al l of these caches if 6420 // TODO(brianwilkerson) This could be optimized. There's no need to flush al l of these caches if
6021 // the public namespace hasn't changed, which will be a fairly common case. The question is 6421 // the public namespace hasn't changed, which will be a fairly common case. The question is
6022 // whether we can afford the time to compute the namespace to look for diffe rences. 6422 // whether we can afford the time to compute the namespace to look for diffe rences.
6023 DartEntry libraryEntry = _getReadableDartEntry(librarySource); 6423 DartEntry libraryEntry = _getReadableDartEntry(librarySource);
6024 if (libraryEntry != null) { 6424 if (libraryEntry != null) {
6025 List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PART S); 6425 List<Source> includedParts = libraryEntry.getValue(DartEntry.INCLUDED_PART S);
6026 DartEntryImpl libraryCopy = libraryEntry.writableCopy; 6426 DartEntryImpl libraryCopy = libraryEntry.writableCopy;
6027 int oldTime = libraryCopy.modificationTime; 6427 // long oldTime = libraryCopy.getModificationTime();
6028 libraryCopy.invalidateAllResolutionInformation(); 6428 libraryCopy.invalidateAllResolutionInformation();
6029 _cache.put(librarySource, libraryCopy); 6429 _cache.put(librarySource, libraryCopy);
6030 _workManager.add(librarySource, SourcePriority.LIBRARY); 6430 _workManager.add(librarySource, SourcePriority.LIBRARY);
6031 if (writer != null) { 6431 // if (writer != null) {
6032 writer.println(" Invalidated library source: ${_debuggingString(library Source)} (previously modified at ${oldTime})"); 6432 // writer.println(" Invalidated library source: " + debuggingStrin g(librarySource)
6033 } 6433 // + " (previously modified at " + oldTime + ")");
6434 // }
6034 for (Source partSource in includedParts) { 6435 for (Source partSource in includedParts) {
6035 SourceEntry partEntry = _cache.get(partSource); 6436 SourceEntry partEntry = _cache.get(partSource);
6036 if (partEntry is DartEntry) { 6437 if (partEntry is DartEntry) {
6037 DartEntryImpl partCopy = partEntry.writableCopy; 6438 DartEntryImpl partCopy = partEntry.writableCopy;
6038 oldTime = partCopy.modificationTime; 6439 // oldTime = partCopy.getModificationTime();
6039 if (partEntry != libraryCopy) { 6440 if (partEntry != libraryCopy) {
6040 partCopy.removeContainingLibrary(librarySource); 6441 partCopy.removeContainingLibrary(librarySource);
6041 _workManager.add(librarySource, SourcePriority.NORMAL_PART); 6442 _workManager.add(librarySource, SourcePriority.NORMAL_PART);
6042 } 6443 }
6043 partCopy.invalidateAllResolutionInformation(); 6444 partCopy.invalidateAllResolutionInformation();
6044 _cache.put(partSource, partCopy); 6445 _cache.put(partSource, partCopy);
6045 if (writer != null) {
6046 writer.println(" Invalidated part source: ${_debuggingString(partSo urce)} (previously modified at ${oldTime})");
6047 }
6048 } 6446 }
6049 } 6447 }
6050 } 6448 }
6051 // invalidate Angular applications 6449 // invalidate Angular applications
6052 List<AngularApplication> angularApplicationsCopy = []; 6450 List<AngularApplication> angularApplicationsCopy = [];
6053 for (AngularApplication application in angularApplicationsCopy) { 6451 for (AngularApplication application in angularApplicationsCopy) {
6054 if (application.dependsOn(librarySource)) { 6452 if (application.dependsOn(librarySource)) {
6055 Source entryPointSource = application.entryPoint; 6453 Source entryPointSource = application.entryPoint;
6056 HtmlEntry entry = _getReadableHtmlEntry(entryPointSource); 6454 HtmlEntry entry = _getReadableHtmlEntry(entryPointSource);
6057 HtmlEntryImpl entryCopy = entry.writableCopy; 6455 HtmlEntryImpl entryCopy = entry.writableCopy;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
6145 } 6543 }
6146 } 6544 }
6147 // update Dart sources errors 6545 // update Dart sources errors
6148 List<Source> newElementSources = application.elementSources; 6546 List<Source> newElementSources = application.elementSources;
6149 for (Source elementSource in newElementSources) { 6547 for (Source elementSource in newElementSources) {
6150 DartEntry dartEntry = _getReadableDartEntry(elementSource); 6548 DartEntry dartEntry = _getReadableDartEntry(elementSource);
6151 DartEntryImpl dartCopy = dartEntry.writableCopy; 6549 DartEntryImpl dartCopy = dartEntry.writableCopy;
6152 dartCopy.setValue(DartEntry.ANGULAR_ERRORS, task.getErrors(elementSource )); 6550 dartCopy.setValue(DartEntry.ANGULAR_ERRORS, task.getErrors(elementSource ));
6153 _cache.put(elementSource, dartCopy); 6551 _cache.put(elementSource, dartCopy);
6154 // notify about Dart errors 6552 // notify about Dart errors
6155 ChangeNoticeImpl notice = _getNotice(elementSource); 6553 if (_generateSdkErrors || !elementSource.isInSystemLibrary) {
6156 notice.setErrors(dartCopy.allErrors, computeLineInfo(elementSource)); 6554 ChangeNoticeImpl notice = _getNotice(elementSource);
6555 notice.setErrors(dartCopy.allErrors, computeLineInfo(elementSource));
6556 }
6157 } 6557 }
6158 } 6558 }
6159 // remember Angular entry point 6559 // remember Angular entry point
6160 entry.setValue(HtmlEntry.ANGULAR_ENTRY, application); 6560 entry.setValue(HtmlEntry.ANGULAR_ENTRY, application);
6161 } 6561 }
6162 6562
6163 /** 6563 /**
6164 * Given a cache entry and a library element, record the library element and o ther information 6564 * Given a cache entry and a library element, record the library element and o ther information
6165 * gleaned from the element in the cache entry. 6565 * gleaned from the element in the cache entry.
6166 * 6566 *
6167 * @param dartEntry the original cache entry from which the copy was made 6567 * @param dartEntry the original cache entry from which the copy was made
6168 * @param dartCopy the cache entry in which data is to be recorded 6568 * @param dartCopy the cache entry in which data is to be recorded
6169 * @param library the library element used to record information 6569 * @param library the library element used to record information
6170 * @param librarySource the source for the library used to record information 6570 * @param librarySource the source for the library used to record information
6171 * @param htmlSource the source for the HTML library 6571 * @param htmlSource the source for the HTML library
6172 */ 6572 */
6173 void _recordElementData(DartEntry dartEntry, DartEntryImpl dartCopy, LibraryEl ement library, Source librarySource, Source htmlSource) { 6573 void _recordElementData(DartEntry dartEntry, DartEntryImpl dartCopy, LibraryEl ement library, Source librarySource, Source htmlSource) {
6174 dartCopy.setValue(DartEntry.ELEMENT, library); 6574 dartCopy.setValue(DartEntry.ELEMENT, library);
6175 dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null); 6575 dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
6176 dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new Se t<LibraryElement>())); 6576 dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new Se t<LibraryElement>()));
6177 // TODO(brianwilkerson) Understand why we're doing this both here and in
6178 // ResolveDartDependenciesTask and whether we should also be capturing the i mported and exported
6179 // sources here.
6180 _removeFromParts(librarySource, dartEntry);
6181 List<CompilationUnitElement> parts = library.parts;
6182 int count = parts.length;
6183 List<Source> unitSources = new List<Source>(count + 1);
6184 unitSources[0] = library.definingCompilationUnit.source;
6185 for (int i = 0; i < count; i++) {
6186 Source unitSource = parts[i].source;
6187 unitSources[i + 1] = unitSource;
6188 DartEntry unitEntry = _getReadableDartEntry(unitSource);
6189 if (unitSource != null) {
6190 DartEntryImpl unitCopy = unitEntry.writableCopy;
6191 unitCopy.addContainingLibrary(librarySource);
6192 _cache.put(unitSource, unitCopy);
6193 }
6194 }
6195 dartCopy.setValue(DartEntry.INCLUDED_PARTS, unitSources);
6196 } 6577 }
6197 6578
6198 /** 6579 /**
6199 * Record the results produced by performing a [GenerateDartErrorsTask]. If th e results were 6580 * Record the results produced by performing a [GenerateDartErrorsTask]. If th e results were
6200 * computed from data that is now out-of-date, then the results will not be re corded. 6581 * computed from data that is now out-of-date, then the results will not be re corded.
6201 * 6582 *
6202 * @param task the task that was performed 6583 * @param task the task that was performed
6203 * @return an entry containing the computed results 6584 * @return an entry containing the computed results
6204 * @throws AnalysisException if the results could not be recorded 6585 * @throws AnalysisException if the results could not be recorded
6205 */ 6586 */
(...skipping 18 matching lines...) Expand all
6224 // The source has changed without the context being notified. Simulate n otification. 6605 // The source has changed without the context being notified. Simulate n otification.
6225 _sourceChanged(source); 6606 _sourceChanged(source);
6226 dartEntry = _getReadableDartEntry(source); 6607 dartEntry = _getReadableDartEntry(source);
6227 if (dartEntry == null) { 6608 if (dartEntry == null) {
6228 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}"); 6609 throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
6229 } 6610 }
6230 } 6611 }
6231 DartEntryImpl dartCopy = dartEntry.writableCopy; 6612 DartEntryImpl dartCopy = dartEntry.writableCopy;
6232 if (thrownException == null) { 6613 if (thrownException == null) {
6233 dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, task.errors); 6614 dartCopy.setValueInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, task.errors);
6234 ChangeNoticeImpl notice = _getNotice(source); 6615 if (_generateSdkErrors || !source.isInSystemLibrary) {
6235 notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_ INFO)); 6616 ChangeNoticeImpl notice = _getNotice(source);
6617 notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LIN E_INFO));
6618 }
6236 } else { 6619 } else {
6237 dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR); 6620 dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.ERROR);
6238 } 6621 }
6239 dartCopy.exception = thrownException; 6622 dartCopy.exception = thrownException;
6240 _cache.put(source, dartCopy); 6623 _cache.put(source, dartCopy);
6241 dartEntry = dartCopy; 6624 dartEntry = dartCopy;
6242 } else { 6625 } else {
6243 _logInformation2("Generated errors discarded for ${_debuggingString(source )}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEn try.modificationTime}", thrownException); 6626 _logInformation2("Generated errors discarded for ${_debuggingString(source )}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEn try.modificationTime}", thrownException);
6244 DartEntryImpl dartCopy = dartEntry.writableCopy; 6627 DartEntryImpl dartCopy = dartEntry.writableCopy;
6245 if (thrownException == null || resultTime >= 0) { 6628 if (thrownException == null || resultTime >= 0) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
6324 // The source has changed without the context being notified. Simulate notification. 6707 // The source has changed without the context being notified. Simulate notification.
6325 _sourceChanged(unitSource); 6708 _sourceChanged(unitSource);
6326 dartEntry = _getReadableDartEntry(unitSource); 6709 dartEntry = _getReadableDartEntry(unitSource);
6327 if (dartEntry == null) { 6710 if (dartEntry == null) {
6328 throw new AnalysisException.con1("A Dart file became a non-Dart file : ${unitSource.fullName}"); 6711 throw new AnalysisException.con1("A Dart file became a non-Dart file : ${unitSource.fullName}");
6329 } 6712 }
6330 } 6713 }
6331 DartEntryImpl dartCopy = dartEntry.writableCopy; 6714 DartEntryImpl dartCopy = dartEntry.writableCopy;
6332 if (thrownException == null) { 6715 if (thrownException == null) {
6333 dartCopy.setValueInLibrary(DartEntry.HINTS, librarySource, results.dat a); 6716 dartCopy.setValueInLibrary(DartEntry.HINTS, librarySource, results.dat a);
6334 ChangeNoticeImpl notice = _getNotice(unitSource); 6717 if (_generateSdkErrors || !unitSource.isInSystemLibrary) {
6335 notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LIN E_INFO)); 6718 ChangeNoticeImpl notice = _getNotice(unitSource);
6719 notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.L INE_INFO));
6720 }
6336 } else { 6721 } else {
6337 dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState. ERROR); 6722 dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState. ERROR);
6338 } 6723 }
6339 dartCopy.exception = thrownException; 6724 dartCopy.exception = thrownException;
6340 _cache.put(unitSource, dartCopy); 6725 _cache.put(unitSource, dartCopy);
6341 dartEntry = dartCopy; 6726 dartEntry = dartCopy;
6342 } else { 6727 } else {
6343 _logInformation2("Generated hints discarded for ${_debuggingString(unitS ource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${d artEntry.modificationTime}", thrownException); 6728 _logInformation2("Generated hints discarded for ${_debuggingString(unitS ource)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${d artEntry.modificationTime}", thrownException);
6344 if (identical(dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource ), CacheState.IN_PROCESS)) { 6729 if (identical(dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource ), CacheState.IN_PROCESS)) {
6345 DartEntryImpl dartCopy = dartEntry.writableCopy; 6730 DartEntryImpl dartCopy = dartEntry.writableCopy;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
6412 /** 6797 /**
6413 * Record the results produced by performing a [IncrementalAnalysisTask]. 6798 * Record the results produced by performing a [IncrementalAnalysisTask].
6414 * 6799 *
6415 * @param task the task that was performed 6800 * @param task the task that was performed
6416 * @return an entry containing the computed results 6801 * @return an entry containing the computed results
6417 * @throws AnalysisException if the results could not be recorded 6802 * @throws AnalysisException if the results could not be recorded
6418 */ 6803 */
6419 DartEntry _recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) { 6804 DartEntry _recordIncrementalAnalysisTaskResults(IncrementalAnalysisTask task) {
6420 CompilationUnit unit = task.compilationUnit; 6805 CompilationUnit unit = task.compilationUnit;
6421 if (unit != null) { 6806 if (unit != null) {
6422 ChangeNoticeImpl notice = _getNotice(task.source); 6807 if (_generateSdkErrors || !task.source.isInSystemLibrary) {
6423 notice.compilationUnit = unit; 6808 ChangeNoticeImpl notice = _getNotice(task.source);
6809 notice.compilationUnit = unit;
6810 }
6424 _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult(task.cach e, unit); 6811 _incrementalAnalysisCache = IncrementalAnalysisCache.cacheResult(task.cach e, unit);
6425 } 6812 }
6426 return null; 6813 return null;
6427 } 6814 }
6428 6815
6429 /** 6816 /**
6430 * Record the results produced by performing a [ParseDartTask]. If the results were computed 6817 * Record the results produced by performing a [ParseDartTask]. If the results were computed
6431 * from data that is now out-of-date, then the results will not be recorded. 6818 * from data that is now out-of-date, then the results will not be recorded.
6432 * 6819 *
6433 * @param task the task that was performed 6820 * @param task the task that was performed
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
6479 partCopy.addContainingLibrary(source); 6866 partCopy.addContainingLibrary(source);
6480 _cache.put(partSource, partCopy); 6867 _cache.put(partSource, partCopy);
6481 } 6868 }
6482 } 6869 }
6483 dartCopy.setValue(DartEntry.PARSED_UNIT, task.compilationUnit); 6870 dartCopy.setValue(DartEntry.PARSED_UNIT, task.compilationUnit);
6484 dartCopy.setValue(DartEntry.PARSE_ERRORS, task.errors); 6871 dartCopy.setValue(DartEntry.PARSE_ERRORS, task.errors);
6485 dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources); 6872 dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
6486 dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources); 6873 dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
6487 dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts); 6874 dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
6488 _cache.storedAst(source); 6875 _cache.storedAst(source);
6489 ChangeNoticeImpl notice = _getNotice(source); 6876 if (_generateSdkErrors || !source.isInSystemLibrary) {
6490 notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_ INFO)); 6877 ChangeNoticeImpl notice = _getNotice(source);
6878 notice.setErrors(dartCopy.allErrors, task.lineInfo);
6879 }
6491 // Verify that the incrementally parsed and resolved unit in the increme ntal cache 6880 // Verify that the incrementally parsed and resolved unit in the increme ntal cache
6492 // is structurally equivalent to the fully parsed unit 6881 // is structurally equivalent to the fully parsed unit
6493 _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_in crementalAnalysisCache, source, task.compilationUnit); 6882 _incrementalAnalysisCache = IncrementalAnalysisCache.verifyStructure(_in crementalAnalysisCache, source, task.compilationUnit);
6494 } else { 6883 } else {
6495 _removeFromParts(source, dartEntry); 6884 _removeFromParts(source, dartEntry);
6496 dartCopy.recordParseError(); 6885 dartCopy.recordParseError();
6497 _cache.removedAst(source); 6886 _cache.removedAst(source);
6498 } 6887 }
6499 dartCopy.exception = thrownException; 6888 dartCopy.exception = thrownException;
6500 _cache.put(source, dartCopy); 6889 _cache.put(source, dartCopy);
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6565 } 6954 }
6566 HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy; 6955 HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
6567 if (thrownException == null) { 6956 if (thrownException == null) {
6568 LineInfo lineInfo = task.lineInfo; 6957 LineInfo lineInfo = task.lineInfo;
6569 ht.HtmlUnit unit = task.htmlUnit; 6958 ht.HtmlUnit unit = task.htmlUnit;
6570 htmlCopy.setValue(SourceEntry.LINE_INFO, lineInfo); 6959 htmlCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
6571 htmlCopy.setValue(HtmlEntry.PARSED_UNIT, unit); 6960 htmlCopy.setValue(HtmlEntry.PARSED_UNIT, unit);
6572 htmlCopy.setValue(HtmlEntry.PARSE_ERRORS, task.errors); 6961 htmlCopy.setValue(HtmlEntry.PARSE_ERRORS, task.errors);
6573 htmlCopy.setValue(HtmlEntry.REFERENCED_LIBRARIES, task.referencedLibrari es); 6962 htmlCopy.setValue(HtmlEntry.REFERENCED_LIBRARIES, task.referencedLibrari es);
6574 _cache.storedAst(source); 6963 _cache.storedAst(source);
6575 ChangeNoticeImpl notice = _getNotice(source); 6964 if (_generateSdkErrors || !source.isInSystemLibrary) {
6576 notice.setErrors(htmlCopy.allErrors, lineInfo); 6965 ChangeNoticeImpl notice = _getNotice(source);
6966 notice.setErrors(htmlCopy.allErrors, lineInfo);
6967 }
6577 } else { 6968 } else {
6578 htmlCopy.recordParseError(); 6969 htmlCopy.recordParseError();
6579 _cache.removedAst(source); 6970 _cache.removedAst(source);
6580 } 6971 }
6581 htmlCopy.exception = thrownException; 6972 htmlCopy.exception = thrownException;
6582 _cache.put(source, htmlCopy); 6973 _cache.put(source, htmlCopy);
6583 htmlEntry = htmlCopy; 6974 htmlEntry = htmlCopy;
6584 } else { 6975 } else {
6585 _logInformation2("Parse results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry .modificationTime}", thrownException); 6976 _logInformation2("Parse results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${htmlEntry .modificationTime}", thrownException);
6586 HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy; 6977 HtmlEntryImpl htmlCopy = (sourceEntry as HtmlEntry).writableCopy;
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
6650 _sourceChanged(source); 7041 _sourceChanged(source);
6651 htmlEntry = _getReadableHtmlEntry(source); 7042 htmlEntry = _getReadableHtmlEntry(source);
6652 if (htmlEntry == null) { 7043 if (htmlEntry == null) {
6653 throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}"); 7044 throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
6654 } 7045 }
6655 } 7046 }
6656 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 7047 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
6657 if (thrownException == null) { 7048 if (thrownException == null) {
6658 htmlCopy.setValue(HtmlEntry.ANGULAR_ERRORS, task.resolutionErrors); 7049 htmlCopy.setValue(HtmlEntry.ANGULAR_ERRORS, task.resolutionErrors);
6659 // notify about errors 7050 // notify about errors
6660 ChangeNoticeImpl notice = _getNotice(source); 7051 if (_generateSdkErrors || !source.isInSystemLibrary) {
6661 notice.htmlUnit = task.resolvedUnit; 7052 ChangeNoticeImpl notice = _getNotice(source);
6662 notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_ INFO)); 7053 notice.htmlUnit = task.resolvedUnit;
7054 notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LIN E_INFO));
7055 }
6663 } else { 7056 } else {
6664 htmlCopy.recordResolutionError(); 7057 htmlCopy.recordResolutionError();
6665 } 7058 }
6666 htmlCopy.exception = thrownException; 7059 htmlCopy.exception = thrownException;
6667 _cache.put(source, htmlCopy); 7060 _cache.put(source, htmlCopy);
6668 htmlEntry = htmlCopy; 7061 htmlEntry = htmlCopy;
6669 } else { 7062 } else {
6670 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 7063 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
6671 if (thrownException == null || resultTime >= 0) { 7064 if (thrownException == null || resultTime >= 0) {
6672 // 7065 //
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
6732 htmlEntry = _getReadableHtmlEntry(source); 7125 htmlEntry = _getReadableHtmlEntry(source);
6733 if (htmlEntry == null) { 7126 if (htmlEntry == null) {
6734 throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}"); 7127 throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
6735 } 7128 }
6736 } 7129 }
6737 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 7130 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
6738 if (thrownException == null) { 7131 if (thrownException == null) {
6739 htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit); 7132 htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit);
6740 _recordAngularEntryPoint(htmlCopy, task); 7133 _recordAngularEntryPoint(htmlCopy, task);
6741 _cache.storedAst(source); 7134 _cache.storedAst(source);
6742 ChangeNoticeImpl notice = _getNotice(source); 7135 if (_generateSdkErrors || !source.isInSystemLibrary) {
6743 notice.htmlUnit = task.resolvedUnit; 7136 ChangeNoticeImpl notice = _getNotice(source);
6744 notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_ INFO)); 7137 notice.htmlUnit = task.resolvedUnit;
7138 notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LIN E_INFO));
7139 }
6745 } else { 7140 } else {
6746 htmlCopy.recordResolutionError(); 7141 htmlCopy.recordResolutionError();
6747 } 7142 }
6748 htmlCopy.exception = thrownException; 7143 htmlCopy.exception = thrownException;
6749 _cache.put(source, htmlCopy); 7144 _cache.put(source, htmlCopy);
6750 htmlEntry = htmlCopy; 7145 htmlEntry = htmlCopy;
6751 } else { 7146 } else {
6752 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 7147 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
6753 if (thrownException == null || resultTime >= 0) { 7148 if (thrownException == null || resultTime >= 0) {
6754 // 7149 //
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
6895 throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}"); 7290 throw new AnalysisException.con1("An HTML file became a non-HTML file: ${source.fullName}");
6896 } 7291 }
6897 } 7292 }
6898 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 7293 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
6899 if (thrownException == null) { 7294 if (thrownException == null) {
6900 htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED); 7295 htmlCopy.setState(HtmlEntry.PARSED_UNIT, CacheState.FLUSHED);
6901 htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit); 7296 htmlCopy.setValue(HtmlEntry.RESOLVED_UNIT, task.resolvedUnit);
6902 htmlCopy.setValue(HtmlEntry.ELEMENT, task.element); 7297 htmlCopy.setValue(HtmlEntry.ELEMENT, task.element);
6903 htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, task.resolutionErrors); 7298 htmlCopy.setValue(HtmlEntry.RESOLUTION_ERRORS, task.resolutionErrors);
6904 _cache.storedAst(source); 7299 _cache.storedAst(source);
6905 ChangeNoticeImpl notice = _getNotice(source); 7300 if (_generateSdkErrors || !source.isInSystemLibrary) {
6906 notice.htmlUnit = task.resolvedUnit; 7301 ChangeNoticeImpl notice = _getNotice(source);
6907 notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LINE_ INFO)); 7302 notice.htmlUnit = task.resolvedUnit;
7303 notice.setErrors(htmlCopy.allErrors, htmlCopy.getValue(SourceEntry.LIN E_INFO));
7304 }
6908 } else { 7305 } else {
6909 htmlCopy.recordResolutionError(); 7306 htmlCopy.recordResolutionError();
6910 _cache.removedAst(source); 7307 _cache.removedAst(source);
6911 } 7308 }
6912 htmlCopy.exception = thrownException; 7309 htmlCopy.exception = thrownException;
6913 _cache.put(source, htmlCopy); 7310 _cache.put(source, htmlCopy);
6914 htmlEntry = htmlCopy; 7311 htmlEntry = htmlCopy;
6915 } else { 7312 } else {
6916 _logInformation2("Resolution results discarded for ${_debuggingString(sour ce)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${html Entry.modificationTime}", thrownException); 7313 _logInformation2("Resolution results discarded for ${_debuggingString(sour ce)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${html Entry.modificationTime}", thrownException);
6917 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy; 7314 HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
6980 } 7377 }
6981 } 7378 }
6982 DartEntryImpl dartCopy = dartEntry.writableCopy; 7379 DartEntryImpl dartCopy = dartEntry.writableCopy;
6983 if (thrownException == null) { 7380 if (thrownException == null) {
6984 LineInfo lineInfo = task.lineInfo; 7381 LineInfo lineInfo = task.lineInfo;
6985 dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo); 7382 dartCopy.setValue(SourceEntry.LINE_INFO, lineInfo);
6986 dartCopy.setValue(DartEntry.TOKEN_STREAM, task.tokenStream); 7383 dartCopy.setValue(DartEntry.TOKEN_STREAM, task.tokenStream);
6987 dartCopy.setValue(DartEntry.SCAN_ERRORS, task.errors); 7384 dartCopy.setValue(DartEntry.SCAN_ERRORS, task.errors);
6988 _cache.storedAst(source); 7385 _cache.storedAst(source);
6989 _workManager.add(source, SourcePriority.NORMAL_PART); 7386 _workManager.add(source, SourcePriority.NORMAL_PART);
6990 ChangeNoticeImpl notice = _getNotice(source); 7387 if (_generateSdkErrors || !source.isInSystemLibrary) {
6991 notice.setErrors(dartEntry.allErrors, lineInfo); 7388 ChangeNoticeImpl notice = _getNotice(source);
7389 notice.setErrors(dartEntry.allErrors, lineInfo);
7390 }
6992 } else { 7391 } else {
6993 _removeFromParts(source, dartEntry); 7392 _removeFromParts(source, dartEntry);
6994 dartCopy.recordScanError(); 7393 dartCopy.recordScanError();
6995 _cache.removedAst(source); 7394 _cache.removedAst(source);
6996 } 7395 }
6997 dartCopy.exception = thrownException; 7396 dartCopy.exception = thrownException;
6998 _cache.put(source, dartCopy); 7397 _cache.put(source, dartCopy);
6999 dartEntry = dartCopy; 7398 dartEntry = dartCopy;
7000 } else { 7399 } else {
7001 _logInformation2("Scan results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry. modificationTime}", thrownException); 7400 _logInformation2("Scan results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry. modificationTime}", thrownException);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
7079 * 7478 *
7080 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock]. 7479 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
7081 * 7480 *
7082 * @param source the source that has been added 7481 * @param source the source that has been added
7083 * @return `true` if the new source is a Dart file 7482 * @return `true` if the new source is a Dart file
7084 */ 7483 */
7085 bool _sourceAvailable(Source source) { 7484 bool _sourceAvailable(Source source) {
7086 SourceEntry sourceEntry = _cache.get(source); 7485 SourceEntry sourceEntry = _cache.get(source);
7087 if (sourceEntry == null) { 7486 if (sourceEntry == null) {
7088 sourceEntry = _createSourceEntry(source); 7487 sourceEntry = _createSourceEntry(source);
7089 _logInformation("Added new source: ${_debuggingString(source)}");
7090 } else { 7488 } else {
7091 SourceEntryImpl sourceCopy = sourceEntry.writableCopy; 7489 SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
7092 int oldTime = sourceCopy.modificationTime; 7490 // long oldTime = sourceCopy.getModificationTime();
7093 sourceCopy.modificationTime = getModificationStamp(source); 7491 sourceCopy.modificationTime = getModificationStamp(source);
7094 // TODO(brianwilkerson) Understand why we're not invalidating the cache. 7492 // TODO(brianwilkerson) Understand why we're not invalidating the cache.
7095 _cache.put(source, sourceCopy); 7493 _cache.put(source, sourceCopy);
7096 _logInformation("Added new source: ${_debuggingString(source)} (previously modified at ${oldTime})");
7097 } 7494 }
7098 if (sourceEntry is HtmlEntry) { 7495 if (sourceEntry is HtmlEntry) {
7099 _workManager.add(source, SourcePriority.HTML); 7496 _workManager.add(source, SourcePriority.HTML);
7100 } else { 7497 } else {
7101 _workManager.add(source, SourcePriority.UNKNOWN); 7498 _workManager.add(source, SourcePriority.UNKNOWN);
7102 } 7499 }
7103 return sourceEntry is DartEntry; 7500 return sourceEntry is DartEntry;
7104 } 7501 }
7105 7502
7106 /** 7503 /**
7107 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock]. 7504 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
7108 * 7505 *
7109 * @param source the source that has been changed 7506 * @param source the source that has been changed
7110 */ 7507 */
7111 void _sourceChanged(Source source) { 7508 void _sourceChanged(Source source) {
7112 SourceEntry sourceEntry = _cache.get(source); 7509 SourceEntry sourceEntry = _cache.get(source);
7113 if (sourceEntry == null || sourceEntry.modificationTime == getModificationSt amp(source)) { 7510 if (sourceEntry == null || sourceEntry.modificationTime == getModificationSt amp(source)) {
7114 // Either we have removed this source, in which case we don't care that it is changed, or we 7511 // Either we have removed this source, in which case we don't care that it is changed, or we
7115 // have already invalidated the cache and don't need to invalidate it agai n. 7512 // have already invalidated the cache and don't need to invalidate it agai n.
7116 if (sourceEntry == null) { 7513 // if (sourceEntry == null) {
7117 _logInformation("Modified source, but there is no entry: ${_debuggingStr ing(source)}"); 7514 // logInformation("Modified source, but there is no entry: " + debu ggingString(source));
7118 } else { 7515 // } else {
7119 _logInformation("Modified source, but modification time matches: ${_debu ggingString(source)}"); 7516 // logInformation("Modified source, but modification time matches: " + debuggingString(source));
7120 } 7517 // }
7121 return; 7518 return;
7122 } 7519 }
7123 if (sourceEntry is HtmlEntry) { 7520 if (sourceEntry is HtmlEntry) {
7124 HtmlEntryImpl htmlCopy = sourceEntry.writableCopy; 7521 HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
7125 int oldTime = htmlCopy.modificationTime; 7522 // long oldTime = htmlCopy.getModificationTime();
7126 htmlCopy.modificationTime = getModificationStamp(source); 7523 htmlCopy.modificationTime = getModificationStamp(source);
7127 _invalidateAngularResolution(htmlCopy); 7524 _invalidateAngularResolution(htmlCopy);
7128 htmlCopy.invalidateAllInformation(); 7525 htmlCopy.invalidateAllInformation();
7129 _cache.put(source, htmlCopy); 7526 _cache.put(source, htmlCopy);
7130 _cache.removedAst(source); 7527 _cache.removedAst(source);
7131 _workManager.add(source, SourcePriority.HTML); 7528 _workManager.add(source, SourcePriority.HTML);
7132 _logInformation("Modified HTML source: ${_debuggingString(source)} (previo usly modified at ${oldTime})");
7133 } else if (sourceEntry is DartEntry) { 7529 } else if (sourceEntry is DartEntry) {
7134 List<Source> containingLibraries = getLibrariesContaining(source); 7530 List<Source> containingLibraries = getLibrariesContaining(source);
7135 Set<Source> librariesToInvalidate = new Set<Source>(); 7531 Set<Source> librariesToInvalidate = new Set<Source>();
7136 for (Source containingLibrary in containingLibraries) { 7532 for (Source containingLibrary in containingLibraries) {
7137 librariesToInvalidate.add(containingLibrary); 7533 librariesToInvalidate.add(containingLibrary);
7138 for (Source dependentLibrary in getLibrariesDependingOn(containingLibrar y)) { 7534 for (Source dependentLibrary in getLibrariesDependingOn(containingLibrar y)) {
7139 librariesToInvalidate.add(dependentLibrary); 7535 librariesToInvalidate.add(dependentLibrary);
7140 } 7536 }
7141 } 7537 }
7142 PrintStringWriter writer = new PrintStringWriter(); 7538 PrintStringWriter writer = new PrintStringWriter();
7143 int oldTime = sourceEntry.modificationTime;
7144 writer.println("Modified Dart source: ${_debuggingString(source)} (previou sly modified at ${oldTime})");
7145 for (Source library in librariesToInvalidate) { 7539 for (Source library in librariesToInvalidate) {
7146 // for (Source library : containingLibraries) { 7540 // for (Source library : containingLibraries) {
7147 _invalidateLibraryResolution(library, writer); 7541 _invalidateLibraryResolution(library, writer);
7148 } 7542 }
7149 _removeFromParts(source, _cache.get(source) as DartEntry); 7543 _removeFromParts(source, _cache.get(source) as DartEntry);
7150 DartEntryImpl dartCopy = (_cache.get(source) as DartEntry).writableCopy; 7544 DartEntryImpl dartCopy = (_cache.get(source) as DartEntry).writableCopy;
7151 dartCopy.modificationTime = getModificationStamp(source); 7545 dartCopy.modificationTime = getModificationStamp(source);
7152 dartCopy.invalidateAllInformation(); 7546 dartCopy.invalidateAllInformation();
7153 _cache.put(source, dartCopy); 7547 _cache.put(source, dartCopy);
7154 _cache.removedAst(source); 7548 _cache.removedAst(source);
7155 _workManager.add(source, SourcePriority.UNKNOWN); 7549 _workManager.add(source, SourcePriority.UNKNOWN);
7156 _logInformation(writer.toString());
7157 } 7550 }
7158 } 7551 }
7159 7552
7160 /** 7553 /**
7161 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock]. 7554 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
7162 * 7555 *
7163 * @param source the source that has been deleted 7556 * @param source the source that has been deleted
7164 */ 7557 */
7165 void _sourceRemoved(Source source) { 7558 void _sourceRemoved(Source source) {
7166 PrintStringWriter writer = new PrintStringWriter(); 7559 PrintStringWriter writer = new PrintStringWriter();
7167 writer.println("Removed source: ${_debuggingString(source)}");
7168 SourceEntry sourceEntry = _cache.get(source); 7560 SourceEntry sourceEntry = _cache.get(source);
7169 if (sourceEntry is HtmlEntry) { 7561 if (sourceEntry is HtmlEntry) {
7170 HtmlEntryImpl htmlCopy = sourceEntry.writableCopy; 7562 HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
7171 _invalidateAngularResolution(htmlCopy); 7563 _invalidateAngularResolution(htmlCopy);
7172 } else if (sourceEntry is DartEntry) { 7564 } else if (sourceEntry is DartEntry) {
7173 Set<Source> libraries = new Set<Source>(); 7565 Set<Source> libraries = new Set<Source>();
7174 for (Source librarySource in getLibrariesContaining(source)) { 7566 for (Source librarySource in getLibrariesContaining(source)) {
7175 libraries.add(librarySource); 7567 libraries.add(librarySource);
7176 for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) { 7568 for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
7177 libraries.add(dependentLibrary); 7569 libraries.add(dependentLibrary);
7178 } 7570 }
7179 } 7571 }
7180 for (Source librarySource in libraries) { 7572 for (Source librarySource in libraries) {
7181 _invalidateLibraryResolution(librarySource, writer); 7573 _invalidateLibraryResolution(librarySource, writer);
7182 } 7574 }
7183 } 7575 }
7184 _cache.remove(source); 7576 _cache.remove(source);
7185 _workManager.remove(source); 7577 _workManager.remove(source);
7186 _removeFromPriorityOrder(source); 7578 _removeFromPriorityOrder(source);
7187 _logInformation(writer.toString());
7188 } 7579 }
7189 7580
7190 /** 7581 /**
7191 * Check the cache for any invalid entries (entries whose modification time do es not match the 7582 * Check the cache for any invalid entries (entries whose modification time do es not match the
7192 * modification time of the source associated with the entry). Invalid entries will be marked as 7583 * modification time of the source associated with the entry). Invalid entries will be marked as
7193 * invalid so that the source will be re-analyzed. 7584 * invalid so that the source will be re-analyzed.
7194 * 7585 *
7195 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock]. 7586 * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
7196 * 7587 *
7197 * @return `true` if at least one entry was invalid 7588 * @return `true` if at least one entry was invalid
(...skipping 10 matching lines...) Expand all
7208 _sourceChanged(source); 7599 _sourceChanged(source);
7209 inconsistentCount++; 7600 inconsistentCount++;
7210 } 7601 }
7211 if (sourceEntry.exception != null) { 7602 if (sourceEntry.exception != null) {
7212 if (!exists(source)) { 7603 if (!exists(source)) {
7213 missingSources.add(source); 7604 missingSources.add(source);
7214 } 7605 }
7215 } 7606 }
7216 } 7607 }
7217 int consistencyCheckEnd = JavaSystem.nanoTime(); 7608 int consistencyCheckEnd = JavaSystem.nanoTime();
7218 PrintStringWriter writer = new PrintStringWriter(); 7609 if (inconsistentCount > 0 || missingSources.length > 0) {
7219 writer.print("Consistency check took "); 7610 PrintStringWriter writer = new PrintStringWriter();
7220 writer.print((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); 7611 writer.print("Consistency check took ");
7221 writer.println(" ms and found"); 7612 writer.print((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
7222 writer.print(" "); 7613 writer.println(" ms and found");
7223 writer.print(inconsistentCount); 7614 writer.print(" ");
7224 writer.println(" inconsistent entries"); 7615 writer.print(inconsistentCount);
7225 writer.print(" "); 7616 writer.println(" inconsistent entries");
7226 writer.print(missingSources.length); 7617 writer.print(" ");
7227 writer.println(" missing sources"); 7618 writer.print(missingSources.length);
7228 for (Source source in missingSources) { 7619 writer.println(" missing sources");
7229 writer.print(" "); 7620 for (Source source in missingSources) {
7230 writer.println(source.fullName); 7621 writer.print(" ");
7622 writer.println(source.fullName);
7623 }
7624 _logInformation(writer.toString());
7231 } 7625 }
7232 _logInformation(writer.toString());
7233 return inconsistentCount > 0; 7626 return inconsistentCount > 0;
7234 } 7627 }
7235 } 7628 }
7236 7629
7237 /** 7630 /**
7238 * Instances of the class `AnalysisTaskResultRecorder` are used by an analysis c ontext to 7631 * Instances of the class `AnalysisTaskResultRecorder` are used by an analysis c ontext to
7239 * record the results of a task. 7632 * record the results of a task.
7240 */ 7633 */
7241 class AnalysisContextImpl_AnalysisTaskResultRecorder implements AnalysisTaskVisi tor<SourceEntry> { 7634 class AnalysisContextImpl_AnalysisTaskResultRecorder implements AnalysisTaskVisi tor<SourceEntry> {
7242 final AnalysisContextImpl AnalysisContextImpl_this; 7635 final AnalysisContextImpl AnalysisContextImpl_this;
(...skipping 18 matching lines...) Expand all
7261 @override 7654 @override
7262 HtmlEntry visitParseHtmlTask(ParseHtmlTask task) => AnalysisContextImpl_this._ recordParseHtmlTaskResults(task); 7655 HtmlEntry visitParseHtmlTask(ParseHtmlTask task) => AnalysisContextImpl_this._ recordParseHtmlTaskResults(task);
7263 7656
7264 @override 7657 @override
7265 HtmlEntry visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemp lateTask task) => AnalysisContextImpl_this._recordResolveAngularComponentTemplat eTaskResults(task); 7658 HtmlEntry visitResolveAngularComponentTemplateTask(ResolveAngularComponentTemp lateTask task) => AnalysisContextImpl_this._recordResolveAngularComponentTemplat eTaskResults(task);
7266 7659
7267 @override 7660 @override
7268 HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) = > AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task); 7661 HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) = > AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task);
7269 7662
7270 @override 7663 @override
7664 DartEntry visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task) = > AnalysisContextImpl_this.recordResolveDartLibraryCycleTaskResults(task);
7665
7666 @override
7271 DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => Analysis ContextImpl_this.recordResolveDartLibraryTaskResults(task); 7667 DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => Analysis ContextImpl_this.recordResolveDartLibraryTaskResults(task);
7272 7668
7273 @override 7669 @override
7274 DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) => AnalysisContex tImpl_this._recordResolveDartUnitTaskResults(task); 7670 DartEntry visitResolveDartUnitTask(ResolveDartUnitTask task) => AnalysisContex tImpl_this._recordResolveDartUnitTaskResults(task);
7275 7671
7276 @override 7672 @override
7277 HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) => AnalysisContextImpl_th is._recordResolveHtmlTaskResults(task); 7673 HtmlEntry visitResolveHtmlTask(ResolveHtmlTask task) => AnalysisContextImpl_th is._recordResolveHtmlTaskResults(task);
7278 7674
7279 @override 7675 @override
7280 DartEntry visitScanDartTask(ScanDartTask task) => AnalysisContextImpl_this._re cordScanDartTaskResults(task); 7676 DartEntry visitScanDartTask(ScanDartTask task) => AnalysisContextImpl_this._re cordScanDartTaskResults(task);
7281 } 7677 }
7282 7678
7283 class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy { 7679 class AnalysisContextImpl_ContextRetentionPolicy implements CacheRetentionPolicy {
7284 final AnalysisContextImpl AnalysisContextImpl_this; 7680 final AnalysisContextImpl AnalysisContextImpl_this;
7285 7681
7286 AnalysisContextImpl_ContextRetentionPolicy(this.AnalysisContextImpl_this); 7682 AnalysisContextImpl_ContextRetentionPolicy(this.AnalysisContextImpl_this);
7287 7683
7288 @override 7684 @override
7289 RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) { 7685 RetentionPriority getAstPriority(Source source, SourceEntry sourceEntry) {
7290 for (Source prioritySource in AnalysisContextImpl_this._priorityOrder) { 7686 int priorityCount = AnalysisContextImpl_this._priorityOrder.length;
7291 if (source == prioritySource) { 7687 for (int i = 0; i < priorityCount; i++) {
7688 if (source == AnalysisContextImpl_this._priorityOrder[i]) {
7292 return RetentionPriority.HIGH; 7689 return RetentionPriority.HIGH;
7293 } 7690 }
7294 } 7691 }
7692 if (AnalysisContextImpl_this._neededForResolution != null && AnalysisContext Impl_this._neededForResolution.contains(source)) {
7693 return RetentionPriority.HIGH;
7694 }
7295 if (sourceEntry is DartEntry) { 7695 if (sourceEntry is DartEntry) {
7296 DartEntry dartEntry = sourceEntry; 7696 DartEntry dartEntry = sourceEntry;
7297 if (_astIsNeeded(dartEntry)) { 7697 if (_astIsNeeded(dartEntry)) {
7298 return RetentionPriority.MEDIUM; 7698 return RetentionPriority.MEDIUM;
7299 } 7699 }
7300 } 7700 }
7301 return RetentionPriority.LOW; 7701 return RetentionPriority.LOW;
7302 } 7702 }
7303 7703
7304 bool _astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.H INTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.ha sInvalidData(DartEntry.RESOLUTION_ERRORS); 7704 bool _astIsNeeded(DartEntry dartEntry) => dartEntry.hasInvalidData(DartEntry.H INTS) || dartEntry.hasInvalidData(DartEntry.VERIFICATION_ERRORS) || dartEntry.ha sInvalidData(DartEntry.RESOLUTION_ERRORS);
7305 } 7705 }
7306 7706
7307 /** 7707 /**
7708 * Instances of the class `LibraryPair` hold a library and a list of the (source , entry)
7709 * pairs for compilation units in the library.
7710 */
7711 class CycleBuilder_LibraryPair {
7712 /**
7713 * The library containing the compilation units.
7714 */
7715 ResolvableLibrary library;
7716
7717 /**
7718 * The (source, entry) pairs representing the compilation units in the library .
7719 */
7720 List<CycleBuilder_SourceEntryPair> entryPairs;
7721
7722 /**
7723 * Initialize a newly created pair.
7724 *
7725 * @param library the library containing the compilation units
7726 * @param entryPairs the (source, entry) pairs representing the compilation un its in the
7727 * library
7728 */
7729 CycleBuilder_LibraryPair(ResolvableLibrary library, List<CycleBuilder_SourceEn tryPair> entryPairs) {
7730 this.library = library;
7731 this.entryPairs = entryPairs;
7732 }
7733 }
7734
7735 /**
7736 * Instances of the class `SourceEntryPair` hold a source and the cache entry as sociated
7737 * with that source. They are used to reduce the number of times an entry must b e looked up in
7738 * the [cache].
7739 */
7740 class CycleBuilder_SourceEntryPair {
7741 /**
7742 * The source associated with the entry.
7743 */
7744 Source source;
7745
7746 /**
7747 * The entry associated with the source.
7748 */
7749 DartEntry entry;
7750
7751 /**
7752 * Initialize a newly created pair.
7753 *
7754 * @param source the source associated with the entry
7755 * @param entry the entry associated with the source
7756 */
7757 CycleBuilder_SourceEntryPair(Source source, DartEntry entry) {
7758 this.source = source;
7759 this.entry = entry;
7760 }
7761 }
7762
7763 /**
7764 * Instances of the class `CycleBuilder` are used to construct a list of the lib raries that
7765 * must be resolved together in order to resolve any one of the libraries.
7766 */
7767 class AnalysisContextImpl_CycleBuilder {
7768 final AnalysisContextImpl AnalysisContextImpl_this;
7769
7770 /**
7771 * A table mapping the sources of the defining compilation units of libraries to the
7772 * representation of the library that has the information needed to resolve th e library.
7773 */
7774 Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary >();
7775
7776 /**
7777 * The dependency graph used to compute the libraries in the cycle.
7778 */
7779 DirectedGraph<ResolvableLibrary> _dependencyGraph;
7780
7781 /**
7782 * A list containing the libraries that are ready to be resolved.
7783 */
7784 List<ResolvableLibrary> _librariesInCycle;
7785
7786 /**
7787 * The analysis task that needs to be performed before the cycle of libraries can be resolved,
7788 * or `null` if the libraries are ready to be resolved.
7789 */
7790 AnalysisContextImpl_TaskData _taskData;
7791
7792 /**
7793 * Initialize a newly created cycle builder.
7794 */
7795 AnalysisContextImpl_CycleBuilder(this.AnalysisContextImpl_this) : super();
7796
7797 /**
7798 * Compute a list of the libraries that need to be resolved together in order to resolve the
7799 * given library.
7800 *
7801 * @param librarySource the source of the library to be resolved
7802 * @throws AnalysisException if the core library cannot be found
7803 */
7804 void computeCycleContaining(Source librarySource) {
7805 //
7806 // Create the object representing the library being resolved.
7807 //
7808 ResolvableLibrary targetLibrary = _createLibrary(librarySource);
7809 //
7810 // Compute the set of libraries that need to be resolved together.
7811 //
7812 _dependencyGraph = new DirectedGraph<ResolvableLibrary>();
7813 _computeLibraryDependencies(targetLibrary);
7814 if (_taskData != null) {
7815 return;
7816 }
7817 _librariesInCycle = _dependencyGraph.findCycleContaining(targetLibrary);
7818 //
7819 // Ensure that all of the data needed to resolve them has been computed.
7820 //
7821 _ensureImportsAndExports();
7822 if (_taskData != null) {
7823 // At least one imported library needs to be resolved before the target li brary.
7824 AnalysisTask task = _taskData.task;
7825 if (task is ResolveDartLibraryTask) {
7826 AnalysisContextImpl_this._workManager.addFirst(task.librarySource, Sourc ePriority.LIBRARY);
7827 }
7828 return;
7829 }
7830 _computePartsInCycle(librarySource);
7831 if (_taskData != null) {
7832 // At least one part needs to be parsed.
7833 return;
7834 }
7835 // All of the AST's necessary to perform a resolution of the library cycle h ave been
7836 // gathered, so it is no longer necessary to retain them in the cache.
7837 AnalysisContextImpl_this._neededForResolution = null;
7838 }
7839
7840 /**
7841 * Return a list containing the libraries that are ready to be resolved (assum ing that
7842 * [getTaskData] returns `null`).
7843 *
7844 * @return the libraries that are ready to be resolved
7845 */
7846 List<ResolvableLibrary> get librariesInCycle => _librariesInCycle;
7847
7848 /**
7849 * Return a representation of an analysis task that needs to be performed befo re the cycle of
7850 * libraries can be resolved, or `null` if the libraries are ready to be resol ved.
7851 *
7852 * @return the analysis task that needs to be performed before the cycle of li braries can be
7853 * resolved
7854 */
7855 AnalysisContextImpl_TaskData get taskData => _taskData;
7856
7857 /**
7858 * Recursively traverse the libraries reachable from the given library, creati ng instances of
7859 * the class [Library] to represent them, and record the references in the lib rary
7860 * objects.
7861 *
7862 * @param library the library to be processed to find libraries that have not yet been traversed
7863 * @throws AnalysisException if some portion of the library graph could not be traversed
7864 */
7865 void _computeLibraryDependencies(ResolvableLibrary library) {
7866 Source librarySource = library.librarySource;
7867 DartEntry dartEntry = AnalysisContextImpl_this._getReadableDartEntry(library Source);
7868 List<Source> importedSources = _getSources(librarySource, dartEntry, DartEnt ry.IMPORTED_LIBRARIES);
7869 if (_taskData != null) {
7870 return;
7871 }
7872 List<Source> exportedSources = _getSources(librarySource, dartEntry, DartEnt ry.EXPORTED_LIBRARIES);
7873 if (_taskData != null) {
7874 return;
7875 }
7876 _computeLibraryDependenciesFromDirectives(library, importedSources, exported Sources);
7877 }
7878
7879 /**
7880 * Recursively traverse the libraries reachable from the given library, creati ng instances of
7881 * the class [Library] to represent them, and record the references in the lib rary
7882 * objects.
7883 *
7884 * @param library the library to be processed to find libraries that have not yet been traversed
7885 * @param importedSources an array containing the sources that are imported in to the given
7886 * library
7887 * @param exportedSources an array containing the sources that are exported fr om the given
7888 * library
7889 */
7890 void _computeLibraryDependenciesFromDirectives(ResolvableLibrary library, List <Source> importedSources, List<Source> exportedSources) {
7891 int importCount = importedSources.length;
7892 if (importCount > 0) {
7893 List<ResolvableLibrary> importedLibraries = new List<ResolvableLibrary>();
7894 bool explicitlyImportsCore = false;
7895 for (int i = 0; i < importCount; i++) {
7896 Source importedSource = importedSources[i];
7897 if (importedSource == AnalysisContextImpl_this._coreLibrarySource) {
7898 explicitlyImportsCore = true;
7899 }
7900 ResolvableLibrary importedLibrary = _libraryMap[importedSource];
7901 if (importedLibrary == null) {
7902 importedLibrary = _createLibraryOrNull(importedSource);
7903 if (importedLibrary != null) {
7904 _computeLibraryDependencies(importedLibrary);
7905 if (_taskData != null) {
7906 return;
7907 }
7908 }
7909 }
7910 if (importedLibrary != null) {
7911 importedLibraries.add(importedLibrary);
7912 _dependencyGraph.addEdge(library, importedLibrary);
7913 }
7914 }
7915 library.explicitlyImportsCore = explicitlyImportsCore;
7916 if (!explicitlyImportsCore && AnalysisContextImpl_this._coreLibrarySource != library.librarySource) {
7917 ResolvableLibrary importedLibrary = _libraryMap[AnalysisContextImpl_this ._coreLibrarySource];
7918 if (importedLibrary == null) {
7919 importedLibrary = _createLibraryOrNull(AnalysisContextImpl_this._coreL ibrarySource);
7920 if (importedLibrary != null) {
7921 _computeLibraryDependencies(importedLibrary);
7922 if (_taskData != null) {
7923 return;
7924 }
7925 }
7926 }
7927 if (importedLibrary != null) {
7928 importedLibraries.add(importedLibrary);
7929 _dependencyGraph.addEdge(library, importedLibrary);
7930 }
7931 }
7932 library.importedLibraries = new List.from(importedLibraries);
7933 } else {
7934 library.explicitlyImportsCore = false;
7935 ResolvableLibrary importedLibrary = _libraryMap[AnalysisContextImpl_this._ coreLibrarySource];
7936 if (importedLibrary == null) {
7937 importedLibrary = _createLibraryOrNull(AnalysisContextImpl_this._coreLib rarySource);
7938 if (importedLibrary != null) {
7939 _computeLibraryDependencies(importedLibrary);
7940 if (_taskData != null) {
7941 return;
7942 }
7943 }
7944 }
7945 if (importedLibrary != null) {
7946 _dependencyGraph.addEdge(library, importedLibrary);
7947 library.importedLibraries = <ResolvableLibrary> [importedLibrary];
7948 }
7949 }
7950 int exportCount = exportedSources.length;
7951 if (exportCount > 0) {
7952 List<ResolvableLibrary> exportedLibraries = new List<ResolvableLibrary>();
7953 for (int i = 0; i < exportCount; i++) {
7954 Source exportedSource = exportedSources[i];
7955 ResolvableLibrary exportedLibrary = _libraryMap[exportedSource];
7956 if (exportedLibrary == null) {
7957 exportedLibrary = _createLibraryOrNull(exportedSource);
7958 if (exportedLibrary != null) {
7959 _computeLibraryDependencies(exportedLibrary);
7960 if (_taskData != null) {
7961 return;
7962 }
7963 }
7964 }
7965 if (exportedLibrary != null) {
7966 exportedLibraries.add(exportedLibrary);
7967 _dependencyGraph.addEdge(library, exportedLibrary);
7968 }
7969 }
7970 library.exportedLibraries = new List.from(exportedLibraries);
7971 }
7972 }
7973
7974 /**
7975 * Gather the resolvable AST structures for each of the compilation units in e ach of the
7976 * libraries in the cycle. This is done in two phases: first we ensure that we have cached an
7977 * AST structure for each compilation unit, then we gather them. We split the work this way
7978 * because getting the AST structures can change the state of the cache in suc h a way that we
7979 * would have more work to do if any compilation unit didn't have a resolvable AST structure.
7980 */
7981 void _computePartsInCycle(Source librarySource) {
7982 int count = _librariesInCycle.length;
7983 List<CycleBuilder_LibraryPair> libraryData = new List<CycleBuilder_LibraryPa ir>();
7984 for (int i = 0; i < count; i++) {
7985 ResolvableLibrary library = _librariesInCycle[i];
7986 libraryData.add(new CycleBuilder_LibraryPair(library, _ensurePartsInLibrar y(library)));
7987 }
7988 AnalysisContextImpl_this._neededForResolution = _gatherSources(libraryData);
7989 if (AnalysisContextImpl._TRACE_PERFORM_TASK) {
7990 print(" preserve resolution data for ${AnalysisContextImpl_this._neededFo rResolution.length} sources while resolving ${librarySource.fullName}");
7991 }
7992 if (_taskData != null) {
7993 return;
7994 }
7995 for (int i = 0; i < count; i++) {
7996 _computePartsInLibrary(libraryData[i]);
7997 }
7998 }
7999
8000 /**
8001 * Gather the resolvable compilation units for each of the compilation units i n the specified
8002 * library.
8003 *
8004 * @param libraryPair a holder containing both the library and a list of (sour ce, entry) pairs
8005 * for all of the compilation units in the library
8006 */
8007 void _computePartsInLibrary(CycleBuilder_LibraryPair libraryPair) {
8008 ResolvableLibrary library = libraryPair.library;
8009 List<CycleBuilder_SourceEntryPair> entryPairs = libraryPair.entryPairs;
8010 int count = entryPairs.length;
8011 List<ResolvableCompilationUnit> units = new List<ResolvableCompilationUnit>( count);
8012 for (int i = 0; i < count; i++) {
8013 CycleBuilder_SourceEntryPair entryPair = entryPairs[i];
8014 Source source = entryPair.source;
8015 DartEntryImpl dartCopy = entryPair.entry.writableCopy;
8016 units[i] = new ResolvableCompilationUnit.con2(dartCopy.modificationTime, d artCopy.resolvableCompilationUnit, source);
8017 AnalysisContextImpl_this._cache.put(source, dartCopy);
8018 }
8019 library.resolvableCompilationUnits = units;
8020 }
8021
8022 /**
8023 * Create an object to represent the information about the library defined by the compilation
8024 * unit with the given source.
8025 *
8026 * @param librarySource the source of the library's defining compilation unit
8027 * @return the library object that was created
8028 */
8029 ResolvableLibrary _createLibrary(Source librarySource) {
8030 ResolvableLibrary library = new ResolvableLibrary(librarySource);
8031 SourceEntry sourceEntry = AnalysisContextImpl_this._cache.get(librarySource) ;
8032 if (sourceEntry is DartEntry) {
8033 LibraryElementImpl libraryElement = sourceEntry.getValue(DartEntry.ELEMENT ) as LibraryElementImpl;
8034 if (libraryElement != null) {
8035 library.libraryElement = libraryElement;
8036 }
8037 }
8038 _libraryMap[librarySource] = library;
8039 return library;
8040 }
8041
8042 /**
8043 * Create an object to represent the information about the library defined by the compilation
8044 * unit with the given source.
8045 *
8046 * @param librarySource the source of the library's defining compilation unit
8047 * @return the library object that was created
8048 */
8049 ResolvableLibrary _createLibraryOrNull(Source librarySource) {
8050 if (!AnalysisContextImpl_this.exists(librarySource)) {
8051 return null;
8052 }
8053 ResolvableLibrary library = new ResolvableLibrary(librarySource);
8054 SourceEntry sourceEntry = AnalysisContextImpl_this._cache.get(librarySource) ;
8055 if (sourceEntry is DartEntry) {
8056 LibraryElementImpl libraryElement = sourceEntry.getValue(DartEntry.ELEMENT ) as LibraryElementImpl;
8057 if (libraryElement != null) {
8058 library.libraryElement = libraryElement;
8059 }
8060 }
8061 _libraryMap[librarySource] = library;
8062 return library;
8063 }
8064
8065 /**
8066 * Ensure that all of the libraries that are exported by the given library (bu t are not
8067 * themselves in the cycle) have element models built for them.
8068 *
8069 * @param library the library being tested
8070 */
8071 void _ensureExports(ResolvableLibrary library, Set<Source> visitedLibraries) {
8072 List<ResolvableLibrary> dependencies = library.exports;
8073 int dependencyCount = dependencies.length;
8074 for (int i = 0; i < dependencyCount; i++) {
8075 ResolvableLibrary dependency = dependencies[i];
8076 if (!_librariesInCycle.contains(dependency) && visitedLibraries.add(depend ency.librarySource)) {
8077 if (dependency.libraryElement == null) {
8078 Source dependencySource = dependency.librarySource;
8079 AnalysisContextImpl_this._workManager.addFirst(dependencySource, Sourc ePriority.LIBRARY);
8080 if (_taskData == null) {
8081 _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask(d ependencySource, AnalysisContextImpl_this._getReadableDartEntry(dependencySource ));
8082 }
8083 } else {
8084 _ensureExports(dependency, visitedLibraries);
8085 }
8086 }
8087 }
8088 }
8089
8090 /**
8091 * Ensure that all of the libraries that are exported by the given library (bu t are not
8092 * themselves in the cycle) have element models built for them.
8093 *
8094 * @param library the library being tested
8095 * @throws MissingDataException if there is at least one library being depende d on that does not
8096 * have an element model built for it
8097 */
8098 void _ensureImports(ResolvableLibrary library) {
8099 List<ResolvableLibrary> dependencies = library.imports;
8100 int dependencyCount = dependencies.length;
8101 for (int i = 0; i < dependencyCount; i++) {
8102 ResolvableLibrary dependency = dependencies[i];
8103 if (!_librariesInCycle.contains(dependency) && dependency.libraryElement = = null) {
8104 Source dependencySource = dependency.librarySource;
8105 AnalysisContextImpl_this._workManager.addFirst(dependencySource, SourceP riority.LIBRARY);
8106 if (_taskData == null) {
8107 _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask(dep endencySource, AnalysisContextImpl_this._getReadableDartEntry(dependencySource)) ;
8108 }
8109 }
8110 }
8111 }
8112
8113 /**
8114 * Ensure that all of the libraries that are either imported or exported by li braries in the
8115 * cycle (but are not themselves in the cycle) have element models built for t hem.
8116 */
8117 void _ensureImportsAndExports() {
8118 Set<Source> visitedLibraries = new Set<Source>();
8119 int libraryCount = _librariesInCycle.length;
8120 for (int i = 0; i < libraryCount; i++) {
8121 ResolvableLibrary library = _librariesInCycle[i];
8122 _ensureImports(library);
8123 _ensureExports(library, visitedLibraries);
8124 }
8125 }
8126
8127 /**
8128 * Ensure that there is a resolvable compilation unit available for all of the compilation units
8129 * in the given library.
8130 *
8131 * @param library the library for which resolvable compilation units must be a vailable
8132 * @return a list of (source, entry) pairs for all of the compilation units in the library
8133 */
8134 List<CycleBuilder_SourceEntryPair> _ensurePartsInLibrary(ResolvableLibrary lib rary) {
8135 List<CycleBuilder_SourceEntryPair> pairs = new List<CycleBuilder_SourceEntry Pair>();
8136 Source librarySource = library.librarySource;
8137 DartEntry libraryEntry = AnalysisContextImpl_this._getReadableDartEntry(libr arySource);
8138 _ensureResolvableCompilationUnit(librarySource, libraryEntry);
8139 pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
8140 List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntr y.INCLUDED_PARTS);
8141 int count = partSources.length;
8142 for (int i = 0; i < count; i++) {
8143 Source partSource = partSources[i];
8144 DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partS ource);
8145 if (partEntry != null) {
8146 _ensureResolvableCompilationUnit(partSource, partEntry);
8147 pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
8148 }
8149 }
8150 return pairs;
8151 }
8152
8153 /**
8154 * Ensure that there is a resolvable compilation unit available for the given source.
8155 *
8156 * @param source the source for which a resolvable compilation unit must be av ailable
8157 * @param dartEntry the entry associated with the source
8158 */
8159 void _ensureResolvableCompilationUnit(Source source, DartEntry dartEntry) {
8160 if (!dartEntry.hasResolvableCompilationUnit) {
8161 if (_taskData == null) {
8162 _taskData = AnalysisContextImpl_this._createParseDartTask(source, dartEn try);
8163 }
8164 }
8165 }
8166
8167 Set<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
8168 int libraryCount = libraryData.length;
8169 Set<Source> sources = new Set<Source>();
8170 for (int i = 0; i < libraryCount; i++) {
8171 List<CycleBuilder_SourceEntryPair> entryPairs = libraryData[i].entryPairs;
8172 int entryCount = entryPairs.length;
8173 for (int j = 0; j < entryCount; j++) {
8174 sources.add(entryPairs[j].source);
8175 }
8176 }
8177 return sources;
8178 }
8179
8180 /**
8181 * Return the sources described by the given descriptor.
8182 *
8183 * @param source the source with which the sources are associated
8184 * @param dartEntry the entry corresponding to the source
8185 * @param descriptor the descriptor indicating which sources are to be returne d
8186 * @return the sources described by the given descriptor
8187 */
8188 List<Source> _getSources(Source source, DartEntry dartEntry, DataDescriptor<Li st<Source>> descriptor) {
8189 if (dartEntry == null) {
8190 return Source.EMPTY_ARRAY;
8191 }
8192 CacheState exportState = dartEntry.getState(descriptor);
8193 if (identical(exportState, CacheState.ERROR)) {
8194 return Source.EMPTY_ARRAY;
8195 } else if (exportState != CacheState.VALID) {
8196 if (_taskData == null) {
8197 _taskData = AnalysisContextImpl_this._createParseDartTask(source, dartEn try);
8198 }
8199 return Source.EMPTY_ARRAY;
8200 }
8201 return dartEntry.getValue(descriptor);
8202 }
8203 }
8204
8205 /**
7308 * Instances of the class `TaskData` represent information about the next task t o be 8206 * Instances of the class `TaskData` represent information about the next task t o be
7309 * performed. Each data has an implicit associated source: the source that might need to be 8207 * performed. Each data has an implicit associated source: the source that might need to be
7310 * analyzed. There are essentially three states that can be represented: 8208 * analyzed. There are essentially three states that can be represented:
7311 * * If [getTask] returns a non-`null` value, then that is the task that should 8209 * * If [getTask] returns a non-`null` value, then that is the task that should
7312 * be executed to further analyze the associated source. 8210 * be executed to further analyze the associated source.
7313 * * Otherwise, if [isBlocked] returns `true`, then there is no work that can be 8211 * * Otherwise, if [isBlocked] returns `true`, then there is no work that can be
7314 * done, but analysis for the associated source is not complete. 8212 * done, but analysis for the associated source is not complete.
7315 * * Otherwise, [getDependentSource] should return a source that needs to be ana lyzed 8213 * * Otherwise, [getDependentSource] should return a source that needs to be ana lyzed
7316 * before the analysis of the associated source can be completed. 8214 * before the analysis of the associated source can be completed.
7317 */ 8215 */
(...skipping 22 matching lines...) Expand all
7340 } 8238 }
7341 8239
7342 /** 8240 /**
7343 * Return `true` if the associated source is blocked waiting for its contents to be 8241 * Return `true` if the associated source is blocked waiting for its contents to be
7344 * loaded. 8242 * loaded.
7345 * 8243 *
7346 * @return `true` if the associated source is blocked waiting for its contents to be 8244 * @return `true` if the associated source is blocked waiting for its contents to be
7347 * loaded 8245 * loaded
7348 */ 8246 */
7349 bool get isBlocked => _blocked; 8247 bool get isBlocked => _blocked;
8248
8249 @override
8250 String toString() {
8251 if (task == null) {
8252 return "blocked: ${_blocked}";
8253 }
8254 return task.toString();
8255 }
7350 } 8256 }
7351 8257
7352 /** 8258 /**
7353 * Instances of the class `AnalysisErrorInfoImpl` represent the analysis errors and line info 8259 * Instances of the class `AnalysisErrorInfoImpl` represent the analysis errors and line info
7354 * associated with a source. 8260 * associated with a source.
7355 */ 8261 */
7356 class AnalysisErrorInfoImpl implements AnalysisErrorInfo { 8262 class AnalysisErrorInfoImpl implements AnalysisErrorInfo {
7357 /** 8263 /**
7358 * The analysis errors associated with a source, or `null` if there are no err ors. 8264 * The analysis errors associated with a source, or `null` if there are no err ors.
7359 */ 8265 */
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
8228 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getAnalysisOptions"); 9134 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getAnalysisOptions");
8229 _checkThread(instrumentation); 9135 _checkThread(instrumentation);
8230 try { 9136 try {
8231 instrumentation.metric3("contextId", _contextId); 9137 instrumentation.metric3("contextId", _contextId);
8232 return _basis.analysisOptions; 9138 return _basis.analysisOptions;
8233 } finally { 9139 } finally {
8234 instrumentation.log(); 9140 instrumentation.log();
8235 } 9141 }
8236 } 9142 }
8237 9143
9144 @override
9145 AngularApplication getAngularApplicationWithHtml(Source htmlSource) {
9146 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getAngularApplication");
9147 _checkThread(instrumentation);
9148 try {
9149 instrumentation.metric3("contextId", _contextId);
9150 return _basis.getAngularApplicationWithHtml(htmlSource);
9151 } finally {
9152 instrumentation.log();
9153 }
9154 }
9155
8238 /** 9156 /**
8239 * @return the underlying [AnalysisContext]. 9157 * @return the underlying [AnalysisContext].
8240 */ 9158 */
8241 AnalysisContext get basis => _basis; 9159 AnalysisContext get basis => _basis;
8242 9160
8243 @override 9161 @override
8244 CompilationUnitElement getCompilationUnitElement(Source unitSource, Source lib rarySource) { 9162 CompilationUnitElement getCompilationUnitElement(Source unitSource, Source lib rarySource) {
8245 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getCompilationUnitElement"); 9163 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getCompilationUnitElement");
8246 _checkThread(instrumentation); 9164 _checkThread(instrumentation);
8247 try { 9165 try {
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
8397 if (ret != null) { 9315 if (ret != null) {
8398 instrumentation.metric2("Source-count", ret.length); 9316 instrumentation.metric2("Source-count", ret.length);
8399 } 9317 }
8400 return ret; 9318 return ret;
8401 } finally { 9319 } finally {
8402 instrumentation.log(); 9320 instrumentation.log();
8403 } 9321 }
8404 } 9322 }
8405 9323
8406 @override 9324 @override
9325 List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
9326 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getLibrariesReferencedFromHtml");
9327 _checkThread(instrumentation);
9328 try {
9329 instrumentation.metric3("contextId", _contextId);
9330 return _basis.getLibrariesReferencedFromHtml(htmlSource);
9331 } finally {
9332 instrumentation.log();
9333 }
9334 }
9335
9336 @override
8407 LibraryElement getLibraryElement(Source source) { 9337 LibraryElement getLibraryElement(Source source) {
8408 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getLibraryElement"); 9338 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getLibraryElement");
8409 _checkThread(instrumentation); 9339 _checkThread(instrumentation);
8410 try { 9340 try {
8411 instrumentation.metric3("contextId", _contextId); 9341 instrumentation.metric3("contextId", _contextId);
8412 return _basis.getLibraryElement(source); 9342 return _basis.getLibraryElement(source);
8413 } finally { 9343 } finally {
8414 instrumentation.log(); 9344 instrumentation.log();
8415 } 9345 }
8416 } 9346 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
8502 instrumentation.metric3("contextId", _contextId); 9432 instrumentation.metric3("contextId", _contextId);
8503 return _basis.getResolvedHtmlUnit(htmlSource); 9433 return _basis.getResolvedHtmlUnit(htmlSource);
8504 } finally { 9434 } finally {
8505 instrumentation.log2(2); 9435 instrumentation.log2(2);
8506 } 9436 }
8507 } 9437 }
8508 9438
8509 @override 9439 @override
8510 SourceFactory get sourceFactory { 9440 SourceFactory get sourceFactory {
8511 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getSourceFactory"); 9441 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- getSourceFactory");
8512 _checkThread(instrumentation);
8513 try { 9442 try {
8514 instrumentation.metric3("contextId", _contextId); 9443 instrumentation.metric3("contextId", _contextId);
8515 return _basis.sourceFactory; 9444 return _basis.sourceFactory;
8516 } finally { 9445 } finally {
8517 instrumentation.log2(2); 9446 instrumentation.log2(2);
8518 } 9447 }
8519 } 9448 }
8520 9449
8521 @override 9450 @override
8522 AnalysisContentStatistics get statistics => _basis.statistics; 9451 AnalysisContentStatistics get statistics => _basis.statistics;
8523 9452
8524 @override 9453 @override
8525 TypeProvider get typeProvider => _basis.typeProvider; 9454 TypeProvider get typeProvider => _basis.typeProvider;
8526 9455
8527 @override 9456 @override
8528 TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSou rce, LibraryElement libraryElement) => _basis.internalResolveCompilationUnit(uni tSource, libraryElement);
8529
8530 @override
8531 bool isClientLibrary(Source librarySource) { 9457 bool isClientLibrary(Source librarySource) {
8532 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- isClientLibrary"); 9458 InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis- isClientLibrary");
8533 _checkThread(instrumentation); 9459 _checkThread(instrumentation);
8534 try { 9460 try {
8535 instrumentation.metric3("contextId", _contextId); 9461 instrumentation.metric3("contextId", _contextId);
8536 return _basis.isClientLibrary(librarySource); 9462 return _basis.isClientLibrary(librarySource);
8537 } finally { 9463 } finally {
8538 instrumentation.log(); 9464 instrumentation.log();
8539 } 9465 }
8540 } 9466 }
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
8811 /** 9737 /**
8812 * Returns a type provider for this context or throws an exception if dart:cor e cannot be 9738 * Returns a type provider for this context or throws an exception if dart:cor e cannot be
8813 * resolved. 9739 * resolved.
8814 * 9740 *
8815 * @return the type provider (not `null`) 9741 * @return the type provider (not `null`)
8816 * @throws AnalysisException if dart:core cannot be resolved 9742 * @throws AnalysisException if dart:core cannot be resolved
8817 */ 9743 */
8818 TypeProvider get typeProvider; 9744 TypeProvider get typeProvider;
8819 9745
8820 /** 9746 /**
8821 * Return a time-stamped fully-resolved compilation unit for the given source in the given
8822 * library.
8823 *
8824 * @param unitSource the source of the compilation unit for which a resolved A ST structure is to
8825 * be returned
8826 * @param libraryElement the element representing the library in which the com pilation unit is to
8827 * be resolved
8828 * @return a time-stamped fully-resolved compilation unit for the source
8829 * @throws AnalysisException if the resolved compilation unit could not be com puted
8830 */
8831 TimestampedData<CompilationUnit> internalResolveCompilationUnit(Source unitSou rce, LibraryElement libraryElement);
8832
8833 /**
8834 * Given a table mapping the source for the libraries represented by the corre sponding elements to 9747 * Given a table mapping the source for the libraries represented by the corre sponding elements to
8835 * the elements representing the libraries, record those mappings. 9748 * the elements representing the libraries, record those mappings.
8836 * 9749 *
8837 * @param elementMap a table mapping the source for the libraries represented by the elements to 9750 * @param elementMap a table mapping the source for the libraries represented by the elements to
8838 * the elements representing the libraries 9751 * the elements representing the libraries
8839 */ 9752 */
8840 void recordLibraryElements(Map<Source, LibraryElement> elementMap); 9753 void recordLibraryElements(Map<Source, LibraryElement> elementMap);
8841 } 9754 }
8842 9755
8843 /** 9756 /**
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
9274 * Record that the given source is fully analyzed. 10187 * Record that the given source is fully analyzed.
9275 * 10188 *
9276 * @param source the source that is fully analyzed 10189 * @param source the source that is fully analyzed
9277 */ 10190 */
9278 void remove(Source source) { 10191 void remove(Source source) {
9279 int queueCount = _workQueues.length; 10192 int queueCount = _workQueues.length;
9280 for (int i = 0; i < queueCount; i++) { 10193 for (int i = 0; i < queueCount; i++) {
9281 _workQueues[i].remove(source); 10194 _workQueues[i].remove(source);
9282 } 10195 }
9283 } 10196 }
10197
10198 @override
10199 String toString() {
10200 JavaStringBuilder builder = new JavaStringBuilder();
10201 List<SourcePriority> priorities = SourcePriority.values;
10202 bool needsSeparator = false;
10203 int queueCount = _workQueues.length;
10204 for (int i = 0; i < queueCount; i++) {
10205 List<Source> queue = _workQueues[i];
10206 if (!queue.isEmpty) {
10207 if (needsSeparator) {
10208 builder.append("; ");
10209 }
10210 builder.append(priorities[i]);
10211 builder.append(": ");
10212 int queueSize = queue.length;
10213 for (int j = 0; j < queueSize; j++) {
10214 if (j > 0) {
10215 builder.append(", ");
10216 }
10217 builder.append(queue[j].fullName);
10218 }
10219 needsSeparator = true;
10220 }
10221 }
10222 return builder.toString();
10223 }
9284 } 10224 }
9285 10225
9286 /** 10226 /**
9287 * Instances of the class `WorkIterator` implement an iterator that returns the sources in a 10227 * Instances of the class `WorkIterator` implement an iterator that returns the sources in a
9288 * work manager in the order in which they are to be analyzed. 10228 * work manager in the order in which they are to be analyzed.
9289 */ 10229 */
9290 class WorkManager_WorkIterator { 10230 class WorkManager_WorkIterator {
9291 final WorkManager WorkManager_this; 10231 final WorkManager WorkManager_this;
9292 10232
9293 /** 10233 /**
(...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after
10432 } 11372 }
10433 } 11373 }
10434 } 11374 }
10435 // 11375 //
10436 for (AngularPropertyElement property in _element.properties) { 11376 for (AngularPropertyElement property in _element.properties) {
10437 // prepare attribute name 11377 // prepare attribute name
10438 String name = property.name; 11378 String name = property.name;
10439 if (name == ".") { 11379 if (name == ".") {
10440 name = selectorAttributeName; 11380 name = selectorAttributeName;
10441 } 11381 }
10442 // resolve attribute expression 11382 // prepare attribute
10443 ht.XmlAttributeNode attribute = node.getAttribute(name); 11383 ht.XmlAttributeNode attribute = node.getAttribute(name);
10444 if (attribute != null) { 11384 if (attribute == null) {
10445 // if not resolved as the selector, resolve as a property 11385 continue;
10446 if (name != selectorAttributeName) { 11386 }
10447 attribute.element = property; 11387 // if not resolved as the selector, resolve as a property
10448 } 11388 if (name != selectorAttributeName) {
10449 // resolve if binding 11389 attribute.element = property;
10450 if (property.propertyKind != AngularPropertyKind.ATTR) { 11390 }
10451 resolver._pushNameScope(); 11391 // skip if attribute has no value
10452 try { 11392 if (!NgDirectiveProcessor.hasValue(attribute)) {
10453 _onNgEventDirective(resolver); 11393 continue;
10454 AngularExpression expression = parseAngularExpression(resolver, attr ibute); 11394 }
10455 resolver._resolveExpression(expression); 11395 // resolve if binding
10456 setAngularExpression(attribute, expression); 11396 if (property.propertyKind != AngularPropertyKind.ATTR) {
10457 } finally { 11397 resolver._pushNameScope();
10458 resolver._popNameScope(); 11398 try {
10459 } 11399 _onNgEventDirective(resolver);
11400 AngularExpression expression = parseAngularExpression(resolver, attrib ute);
11401 resolver._resolveExpression(expression);
11402 setAngularExpression(attribute, expression);
11403 } finally {
11404 resolver._popNameScope();
10460 } 11405 }
10461 } 11406 }
10462 } 11407 }
10463 } 11408 }
10464 11409
10465 @override 11410 @override
10466 bool canApply(ht.XmlTagNode node) => _element.selector.apply(node); 11411 bool canApply(ht.XmlTagNode node) => _element.selector.apply(node);
10467 11412
10468 /** 11413 /**
10469 * Support for <code>$event</code> variable in <code>NgEventDirective</code>. 11414 * Support for <code>$event</code> variable in <code>NgEventDirective</code>.
10470 */ 11415 */
10471 void _onNgEventDirective(AngularHtmlUnitResolver resolver) { 11416 void _onNgEventDirective(AngularHtmlUnitResolver resolver) {
10472 if (_element.isClass("NgEventDirective")) { 11417 if (_element.isClass("NgEventDirective")) {
10473 DartType dynamicType = resolver.typeProvider.dynamicType; 11418 DartType dynamicType = resolver.typeProvider.dynamicType;
10474 resolver._defineVariable(resolver._createLocalVariableWithName(dynamicType , "\$event")); 11419 resolver._defineVariable(resolver._createLocalVariableWithName(dynamicType , "\$event"));
10475 } 11420 }
10476 } 11421 }
10477 } 11422 }
10478 11423
10479 /** 11424 /**
10480 * [NgDirectiveProcessor] describes any <code>NgDirective</code> annotation inst ance. 11425 * [NgDirectiveProcessor] describes any <code>NgDirective</code> annotation inst ance.
10481 */ 11426 */
10482 abstract class NgDirectiveProcessor extends NgProcessor { 11427 abstract class NgDirectiveProcessor extends NgProcessor {
11428 static bool hasValue(ht.XmlAttributeNode attribute) {
11429 ht.Token valueToken = attribute.valueToken;
11430 return valueToken != null && !valueToken.isSynthetic;
11431 }
11432
10483 static AngularRawXmlExpression newAngularRawXmlExpression(AngularExpression e) => new AngularRawXmlExpression(e); 11433 static AngularRawXmlExpression newAngularRawXmlExpression(AngularExpression e) => new AngularRawXmlExpression(e);
10484 11434
10485 static ht.RawXmlExpression newRawXmlExpression(Expression e) => new ht.RawXmlE xpression(e); 11435 static ht.RawXmlExpression newRawXmlExpression(Expression e) => new ht.RawXmlE xpression(e);
10486 11436
10487 AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver, ht. XmlAttributeNode attribute) { 11437 AngularExpression parseAngularExpression(AngularHtmlUnitResolver resolver, ht. XmlAttributeNode attribute) {
10488 Token token = _scanAttribute(resolver, attribute); 11438 Token token = _scanAttribute(resolver, attribute);
10489 return resolver._parseAngularExpressionInToken(token); 11439 return resolver._parseAngularExpressionInToken(token);
10490 } 11440 }
10491 11441
10492 Expression parseDartExpression(AngularHtmlUnitResolver resolver, ht.XmlAttribu teNode attribute) { 11442 Expression parseDartExpression(AngularHtmlUnitResolver resolver, ht.XmlAttribu teNode attribute) {
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
10757 /** 11707 /**
10758 * Visit a [ResolveAngularEntryHtmlTask]. 11708 * Visit a [ResolveAngularEntryHtmlTask].
10759 * 11709 *
10760 * @param task the task to be visited 11710 * @param task the task to be visited
10761 * @return the result of visiting the task 11711 * @return the result of visiting the task
10762 * @throws AnalysisException if the visitor throws an exception for some reaso n 11712 * @throws AnalysisException if the visitor throws an exception for some reaso n
10763 */ 11713 */
10764 E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task); 11714 E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
10765 11715
10766 /** 11716 /**
11717 * Visit a [ResolveDartLibraryCycleTask].
11718 *
11719 * @param task the task to be visited
11720 * @return the result of visiting the task
11721 * @throws AnalysisException if the visitor throws an exception for some reaso n
11722 */
11723 E visitResolveDartLibraryCycleTask(ResolveDartLibraryCycleTask task);
11724
11725 /**
10767 * Visit a [ResolveDartLibraryTask]. 11726 * Visit a [ResolveDartLibraryTask].
10768 * 11727 *
10769 * @param task the task to be visited 11728 * @param task the task to be visited
10770 * @return the result of visiting the task 11729 * @return the result of visiting the task
10771 * @throws AnalysisException if the visitor throws an exception for some reaso n 11730 * @throws AnalysisException if the visitor throws an exception for some reaso n
10772 */ 11731 */
10773 E visitResolveDartLibraryTask(ResolveDartLibraryTask task); 11732 E visitResolveDartLibraryTask(ResolveDartLibraryTask task);
10774 11733
10775 /** 11734 /**
10776 * Visit a [ResolveDartUnitTask]. 11735 * Visit a [ResolveDartUnitTask].
(...skipping 27 matching lines...) Expand all
10804 * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single 11763 * Instances of the class `GenerateDartErrorsTask` generate errors and warnings for a single
10805 * Dart source. 11764 * Dart source.
10806 */ 11765 */
10807 class GenerateDartErrorsTask extends AnalysisTask { 11766 class GenerateDartErrorsTask extends AnalysisTask {
10808 /** 11767 /**
10809 * The source for which errors and warnings are to be produced. 11768 * The source for which errors and warnings are to be produced.
10810 */ 11769 */
10811 Source source; 11770 Source source;
10812 11771
10813 /** 11772 /**
11773 * The time at which the contents of the source were last modified.
11774 */
11775 int modificationTime = 0;
11776
11777 /**
11778 * The compilation unit used to resolve the dependencies.
11779 */
11780 CompilationUnit _unit;
11781
11782 /**
10814 * The element model for the library containing the source. 11783 * The element model for the library containing the source.
10815 */ 11784 */
10816 LibraryElement libraryElement; 11785 LibraryElement libraryElement;
10817 11786
10818 /** 11787 /**
10819 * The time at which the contents of the source were last modified.
10820 */
10821 int _modificationTime = -1;
10822
10823 /**
10824 * The errors that were generated for the source. 11788 * The errors that were generated for the source.
10825 */ 11789 */
10826 List<AnalysisError> _errors; 11790 List<AnalysisError> _errors;
10827 11791
10828 /** 11792 /**
10829 * Initialize a newly created task to perform analysis within the given contex t. 11793 * Initialize a newly created task to perform analysis within the given contex t.
10830 * 11794 *
10831 * @param context the context in which the task is to be performed 11795 * @param context the context in which the task is to be performed
10832 * @param source the source for which errors and warnings are to be produced 11796 * @param source the source for which errors and warnings are to be produced
11797 * @param modificationTime the time at which the contents of the source were l ast modified
11798 * @param unit the compilation unit used to resolve the dependencies
10833 * @param libraryElement the element model for the library containing the sour ce 11799 * @param libraryElement the element model for the library containing the sour ce
10834 */ 11800 */
10835 GenerateDartErrorsTask(InternalAnalysisContext context, Source source, Library Element libraryElement) : super(context) { 11801 GenerateDartErrorsTask(InternalAnalysisContext context, Source source, int mod ificationTime, CompilationUnit unit, LibraryElement libraryElement) : super(cont ext) {
10836 this.source = source; 11802 this.source = source;
11803 this.modificationTime = modificationTime;
11804 this._unit = unit;
10837 this.libraryElement = libraryElement; 11805 this.libraryElement = libraryElement;
10838 } 11806 }
10839 11807
10840 @override 11808 @override
10841 accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(thi s); 11809 accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(thi s);
10842 11810
10843 /** 11811 /**
10844 * Return the errors that were generated for the source. 11812 * Return the errors that were generated for the source.
10845 * 11813 *
10846 * @return the errors that were generated for the source 11814 * @return the errors that were generated for the source
10847 */ 11815 */
10848 List<AnalysisError> get errors => _errors; 11816 List<AnalysisError> get errors => _errors;
10849 11817
10850 /**
10851 * Return the time at which the contents of the source that was verified were last modified, or a
10852 * negative value if the task has not yet been performed or if an exception oc curred.
10853 *
10854 * @return the time at which the contents of the source that was verified were last modified
10855 */
10856 int get modificationTime => _modificationTime;
10857
10858 @override 11818 @override
10859 String get taskDescription => "generate errors and warnings for ${source.fullN ame}"; 11819 String get taskDescription => "generate errors and warnings for ${source.fullN ame}";
10860 11820
10861 @override 11821 @override
10862 void internalPerform() { 11822 void internalPerform() {
10863 InternalAnalysisContext context = this.context;
10864 TimestampedData<CompilationUnit> data = context.internalResolveCompilationUn it(source, libraryElement);
10865 TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.errors.sta rt(); 11823 TimeCounter_TimeCounterHandle timeCounter = PerformanceStatistics.errors.sta rt();
10866 try { 11824 try {
10867 _modificationTime = data.modificationTime;
10868 CompilationUnit unit = data.data;
10869 RecordingErrorListener errorListener = new RecordingErrorListener(); 11825 RecordingErrorListener errorListener = new RecordingErrorListener();
10870 ErrorReporter errorReporter = new ErrorReporter(errorListener, source); 11826 ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
10871 TypeProvider typeProvider = context.typeProvider; 11827 TypeProvider typeProvider = context.typeProvider;
10872 // 11828 //
10873 // Use the ConstantVerifier to verify the use of constants. This needs to happen before using 11829 // Use the ConstantVerifier to verify the use of constants. This needs to happen before using
10874 // the ErrorVerifier because some error codes need the computed constant v alues. 11830 // the ErrorVerifier because some error codes need the computed constant v alues.
10875 // 11831 //
10876 ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, ty peProvider); 11832 ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, ty peProvider);
10877 unit.accept(constantVerifier); 11833 _unit.accept(constantVerifier);
10878 // 11834 //
10879 // Use the ErrorVerifier to compute the rest of the errors. 11835 // Use the ErrorVerifier to compute the rest of the errors.
10880 // 11836 //
10881 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElem ent, typeProvider, new InheritanceManager(libraryElement)); 11837 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, libraryElem ent, typeProvider, new InheritanceManager(libraryElement));
10882 unit.accept(errorVerifier); 11838 _unit.accept(errorVerifier);
10883 _errors = errorListener.getErrorsForSource(source); 11839 _errors = errorListener.getErrorsForSource(source);
10884 } finally { 11840 } finally {
10885 timeCounter.stop(); 11841 timeCounter.stop();
10886 } 11842 }
10887 } 11843 }
10888 } 11844 }
10889 11845
10890 /** 11846 /**
10891 * Instances of the class `GenerateDartHintsTask` generate hints for a single Da rt library. 11847 * Instances of the class `GenerateDartHintsTask` generate hints for a single Da rt library.
10892 */ 11848 */
10893 class GenerateDartHintsTask extends AnalysisTask { 11849 class GenerateDartHintsTask extends AnalysisTask {
10894 /** 11850 /**
11851 * The compilation units that comprise the library, with the defining compilat ion unit appearing
11852 * first in the array.
11853 */
11854 List<TimestampedData<CompilationUnit>> _units;
11855
11856 /**
10895 * The element model for the library being analyzed. 11857 * The element model for the library being analyzed.
10896 */ 11858 */
10897 LibraryElement libraryElement; 11859 LibraryElement libraryElement;
10898 11860
10899 /** 11861 /**
10900 * A table mapping the sources that were analyzed to the hints that were gener ated for the 11862 * A table mapping the sources that were analyzed to the hints that were gener ated for the
10901 * sources. 11863 * sources.
10902 */ 11864 */
10903 Map<Source, TimestampedData<List<AnalysisError>>> _hintMap; 11865 Map<Source, TimestampedData<List<AnalysisError>>> _hintMap;
10904 11866
10905 /** 11867 /**
10906 * Initialize a newly created task to perform analysis within the given contex t. 11868 * Initialize a newly created task to perform analysis within the given contex t.
10907 * 11869 *
10908 * @param context the context in which the task is to be performed 11870 * @param context the context in which the task is to be performed
11871 * @param units the compilation units that comprise the library, with the defi ning compilation
11872 * unit appearing first in the array
10909 * @param libraryElement the element model for the library being analyzed 11873 * @param libraryElement the element model for the library being analyzed
10910 */ 11874 */
10911 GenerateDartHintsTask(InternalAnalysisContext context, LibraryElement libraryE lement) : super(context) { 11875 GenerateDartHintsTask(InternalAnalysisContext context, List<TimestampedData<Co mpilationUnit>> units, LibraryElement libraryElement) : super(context) {
11876 this._units = units;
10912 this.libraryElement = libraryElement; 11877 this.libraryElement = libraryElement;
10913 } 11878 }
10914 11879
10915 @override 11880 @override
10916 accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this ); 11881 accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this );
10917 11882
10918 /** 11883 /**
10919 * Return a table mapping the sources that were analyzed to the hints that wer e generated for the 11884 * Return a table mapping the sources that were analyzed to the hints that wer e generated for the
10920 * sources, or `null` if the task has not been performed or if the analysis di d not complete 11885 * sources, or `null` if the task has not been performed or if the analysis di d not complete
10921 * normally. 11886 * normally.
10922 * 11887 *
10923 * @return a table mapping the sources that were analyzed to the hints that we re generated for the 11888 * @return a table mapping the sources that were analyzed to the hints that we re generated for the
10924 * sources 11889 * sources
10925 */ 11890 */
10926 Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap; 11891 Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
10927 11892
10928 @override 11893 @override
10929 String get taskDescription { 11894 String get taskDescription {
10930 Source librarySource = libraryElement.source; 11895 Source librarySource = libraryElement.source;
10931 if (librarySource == null) { 11896 if (librarySource == null) {
10932 return "generate Dart hints for library without source"; 11897 return "generate Dart hints for library without source";
10933 } 11898 }
10934 return "generate Dart hints for ${librarySource.fullName}"; 11899 return "generate Dart hints for ${librarySource.fullName}";
10935 } 11900 }
10936 11901
10937 @override 11902 @override
10938 void internalPerform() { 11903 void internalPerform() {
10939 RecordingErrorListener errorListener = new RecordingErrorListener();
10940 List<CompilationUnitElement> parts = libraryElement.parts;
10941 int partCount = parts.length;
10942 List<CompilationUnit> compilationUnits = new List<CompilationUnit>(partCount + 1);
10943 Map<Source, TimestampedData<CompilationUnit>> timestampMap = new Map<Source, TimestampedData<CompilationUnit>>();
10944 // 11904 //
10945 // Get all of the (fully resolved) compilation units that will be analyzed. 11905 // Gather the compilation units.
10946 // 11906 //
10947 Source unitSource = libraryElement.definingCompilationUnit.source; 11907 int unitCount = _units.length;
10948 TimestampedData<CompilationUnit> resolvedUnit = _getCompilationUnit(unitSour ce); 11908 List<CompilationUnit> compilationUnits = new List<CompilationUnit>(unitCount );
10949 timestampMap[unitSource] = resolvedUnit; 11909 for (int i = 0; i < unitCount; i++) {
10950 CompilationUnit unit = resolvedUnit.data; 11910 compilationUnits[i] = _units[i].data;
10951 if (unit == null) {
10952 throw new AnalysisException.con1("Internal error: GenerateDartHintsTask fa iled to access resolved compilation unit for ${unitSource.fullName}");
10953 }
10954 compilationUnits[0] = unit;
10955 for (int i = 0; i < partCount; i++) {
10956 unitSource = parts[i].source;
10957 resolvedUnit = _getCompilationUnit(unitSource);
10958 timestampMap[unitSource] = resolvedUnit;
10959 unit = resolvedUnit.data;
10960 if (unit == null) {
10961 throw new AnalysisException.con1("Internal error: GenerateDartHintsTask failed to access resolved compilation unit for ${unitSource.fullName}");
10962 }
10963 compilationUnits[i + 1] = unit;
10964 } 11911 }
10965 // 11912 //
10966 // Analyze all of the units. 11913 // Analyze all of the units.
10967 // 11914 //
11915 RecordingErrorListener errorListener = new RecordingErrorListener();
10968 HintGenerator hintGenerator = new HintGenerator(compilationUnits, context, e rrorListener); 11916 HintGenerator hintGenerator = new HintGenerator(compilationUnits, context, e rrorListener);
10969 hintGenerator.generateForLibrary(); 11917 hintGenerator.generateForLibrary();
10970 // 11918 //
10971 // Store the results. 11919 // Store the results.
10972 // 11920 //
10973 _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>(); 11921 _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>();
10974 for (MapEntry<Source, TimestampedData<CompilationUnit>> entry in getMapEntry Set(timestampMap)) { 11922 for (int i = 0; i < unitCount; i++) {
10975 Source source = entry.getKey(); 11923 int modificationTime = _units[i].modificationTime;
10976 TimestampedData<CompilationUnit> unitData = entry.getValue(); 11924 Source source = _units[i].data.element.source;
10977 List<AnalysisError> errors = errorListener.getErrorsForSource(source); 11925 List<AnalysisError> errors = errorListener.getErrorsForSource(source);
10978 _hintMap[source] = new TimestampedData<List<AnalysisError>>(unitData.modif icationTime, errors); 11926 _hintMap[source] = new TimestampedData<List<AnalysisError>>(modificationTi me, errors);
10979 } 11927 }
10980 } 11928 }
10981
10982 /**
10983 * Return the resolved compilation unit associated with the given source.
10984 *
10985 * @param unitSource the source for the compilation unit whose resolved AST is to be returned
10986 * @return the resolved compilation unit associated with the given source
10987 * @throws AnalysisException if the resolved compilation unit could not be com puted
10988 */
10989 TimestampedData<CompilationUnit> _getCompilationUnit(Source unitSource) => con text.internalResolveCompilationUnit(unitSource, libraryElement);
10990 } 11929 }
10991 11930
10992 /** 11931 /**
10993 * Instances of the class `GetContentTask` get the contents of a source. 11932 * Instances of the class `GetContentTask` get the contents of a source.
10994 */ 11933 */
10995 class GetContentTask extends AnalysisTask { 11934 class GetContentTask extends AnalysisTask {
10996 /** 11935 /**
10997 * The source to be read. 11936 * The source to be read.
10998 */ 11937 */
10999 Source source; 11938 Source source;
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
11182 int modificationTime = 0; 12121 int modificationTime = 0;
11183 12122
11184 /** 12123 /**
11185 * The head of the token stream used for parsing. 12124 * The head of the token stream used for parsing.
11186 */ 12125 */
11187 Token _tokenStream; 12126 Token _tokenStream;
11188 12127
11189 /** 12128 /**
11190 * The line information associated with the source. 12129 * The line information associated with the source.
11191 */ 12130 */
11192 LineInfo _lineInfo; 12131 LineInfo lineInfo;
11193 12132
11194 /** 12133 /**
11195 * The compilation unit that was produced by parsing the source. 12134 * The compilation unit that was produced by parsing the source.
11196 */ 12135 */
11197 CompilationUnit _unit; 12136 CompilationUnit _unit;
11198 12137
11199 /** 12138 /**
11200 * A flag indicating whether the source contains a 'library' directive. 12139 * A flag indicating whether the source contains a 'library' directive.
11201 */ 12140 */
11202 bool _containsLibraryDirective = false; 12141 bool _containsLibraryDirective = false;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
11237 * @param context the context in which the task is to be performed 12176 * @param context the context in which the task is to be performed
11238 * @param source the source to be parsed 12177 * @param source the source to be parsed
11239 * @param modificationTime the time at which the contents of the source were l ast modified 12178 * @param modificationTime the time at which the contents of the source were l ast modified
11240 * @param tokenStream the head of the token stream used for parsing 12179 * @param tokenStream the head of the token stream used for parsing
11241 * @param lineInfo the line information associated with the source 12180 * @param lineInfo the line information associated with the source
11242 */ 12181 */
11243 ParseDartTask(InternalAnalysisContext context, Source source, int modification Time, Token tokenStream, LineInfo lineInfo) : super(context) { 12182 ParseDartTask(InternalAnalysisContext context, Source source, int modification Time, Token tokenStream, LineInfo lineInfo) : super(context) {
11244 this.source = source; 12183 this.source = source;
11245 this.modificationTime = modificationTime; 12184 this.modificationTime = modificationTime;
11246 this._tokenStream = tokenStream; 12185 this._tokenStream = tokenStream;
11247 this._lineInfo = lineInfo; 12186 this.lineInfo = lineInfo;
11248 } 12187 }
11249 12188
11250 @override 12189 @override
11251 accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this); 12190 accept(AnalysisTaskVisitor visitor) => visitor.visitParseDartTask(this);
11252 12191
11253 /** 12192 /**
11254 * Return the compilation unit that was produced by parsing the source, or `nu ll` if the 12193 * Return the compilation unit that was produced by parsing the source, or `nu ll` if the
11255 * task has not yet been performed or if an exception occurred. 12194 * task has not yet been performed or if an exception occurred.
11256 * 12195 *
11257 * @return the compilation unit that was produced by parsing the source 12196 * @return the compilation unit that was produced by parsing the source
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
11318 void internalPerform() { 12257 void internalPerform() {
11319 // 12258 //
11320 // Then parse the token stream. 12259 // Then parse the token stream.
11321 // 12260 //
11322 TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse .start(); 12261 TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse .start();
11323 try { 12262 try {
11324 RecordingErrorListener errorListener = new RecordingErrorListener(); 12263 RecordingErrorListener errorListener = new RecordingErrorListener();
11325 Parser parser = new Parser(source, errorListener); 12264 Parser parser = new Parser(source, errorListener);
11326 parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies ; 12265 parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies ;
11327 _unit = parser.parseCompilationUnit(_tokenStream); 12266 _unit = parser.parseCompilationUnit(_tokenStream);
11328 _unit.lineInfo = _lineInfo; 12267 _unit.lineInfo = lineInfo;
11329 _errors = errorListener.getErrorsForSource(source); 12268 _errors = errorListener.getErrorsForSource(source);
11330 for (Directive directive in _unit.directives) { 12269 for (Directive directive in _unit.directives) {
11331 if (directive is ExportDirective) { 12270 if (directive is ExportDirective) {
11332 Source exportSource = _resolveSource(source, directive, errorListener) ; 12271 Source exportSource = _resolveSource(source, directive, errorListener) ;
11333 if (exportSource != null) { 12272 if (exportSource != null) {
11334 _exportedSources.add(exportSource); 12273 _exportedSources.add(exportSource);
11335 } 12274 }
11336 } else if (directive is ImportDirective) { 12275 } else if (directive is ImportDirective) {
11337 Source importSource = _resolveSource(source, directive, errorListener) ; 12276 Source importSource = _resolveSource(source, directive, errorListener) ;
11338 if (importSource != null) { 12277 if (importSource != null) {
11339 _importedSources.add(importSource); 12278 _importedSources.add(importSource);
11340 } 12279 }
11341 } else if (directive is LibraryDirective) { 12280 } else if (directive is LibraryDirective) {
11342 _containsLibraryDirective = true; 12281 _containsLibraryDirective = true;
11343 } else if (directive is PartDirective) { 12282 } else if (directive is PartDirective) {
11344 Source partSource = _resolveSource(source, directive, errorListener); 12283 Source partSource = _resolveSource(source, directive, errorListener);
11345 if (partSource != null) { 12284 if (partSource != null && partSource != source) {
11346 _includedSources.add(partSource); 12285 _includedSources.add(partSource);
11347 } 12286 }
11348 } else if (directive is PartOfDirective) { 12287 } else if (directive is PartOfDirective) {
11349 _containsPartOfDirective = true; 12288 _containsPartOfDirective = true;
11350 } 12289 }
11351 } 12290 }
11352 } finally { 12291 } finally {
11353 timeCounterParse.stop(); 12292 timeCounterParse.stop();
11354 } 12293 }
11355 } 12294 }
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
11774 // 12713 //
11775 // Remember the resolved unit. 12714 // Remember the resolved unit.
11776 // 12715 //
11777 _resolvedUnit = _unit; 12716 _resolvedUnit = _unit;
11778 } 12717 }
11779 } 12718 }
11780 12719
11781 /** 12720 /**
11782 * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart libra ry. 12721 * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart libra ry.
11783 */ 12722 */
12723 class ResolveDartLibraryCycleTask extends AnalysisTask {
12724 /**
12725 * The source representing the file whose compilation unit is to be returned. TODO(brianwilkerson)
12726 * This should probably be removed, but is being left in for now to ease the t ransition.
12727 */
12728 Source unitSource;
12729
12730 /**
12731 * The source representing the library to be resolved.
12732 */
12733 Source librarySource;
12734
12735 /**
12736 * The libraries that are part of the cycle containing the library to be resol ved.
12737 */
12738 List<ResolvableLibrary> _librariesInCycle;
12739
12740 /**
12741 * The library resolver holding information about the libraries that were reso lved.
12742 */
12743 LibraryResolver2 _resolver;
12744
12745 /**
12746 * Initialize a newly created task to perform analysis within the given contex t.
12747 *
12748 * @param context the context in which the task is to be performed
12749 * @param unitSource the source representing the file whose compilation unit i s to be returned
12750 * @param librarySource the source representing the library to be resolved
12751 * @param librariesInCycle the libraries that are part of the cycle containing the library to be
12752 * resolved
12753 */
12754 ResolveDartLibraryCycleTask(InternalAnalysisContext context, Source unitSource , Source librarySource, List<ResolvableLibrary> librariesInCycle) : super(contex t) {
12755 this.unitSource = unitSource;
12756 this.librarySource = librarySource;
12757 this._librariesInCycle = librariesInCycle;
12758 }
12759
12760 @override
12761 accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryCycleTas k(this);
12762
12763 /**
12764 * Return the library resolver holding information about the libraries that we re resolved.
12765 *
12766 * @return the library resolver holding information about the libraries that w ere resolved
12767 */
12768 LibraryResolver2 get libraryResolver => _resolver;
12769
12770 @override
12771 String get taskDescription {
12772 if (librarySource == null) {
12773 return "resolve library null source";
12774 }
12775 return "resolve library ${librarySource.fullName}";
12776 }
12777
12778 @override
12779 void internalPerform() {
12780 _resolver = new LibraryResolver2(context);
12781 _resolver.resolveLibrary(librarySource, _librariesInCycle);
12782 }
12783 }
12784
12785 /**
12786 * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart libra ry.
12787 */
11784 class ResolveDartLibraryTask extends AnalysisTask { 12788 class ResolveDartLibraryTask extends AnalysisTask {
11785 /** 12789 /**
11786 * The source representing the file whose compilation unit is to be returned. 12790 * The source representing the file whose compilation unit is to be returned.
11787 */ 12791 */
11788 Source unitSource; 12792 Source unitSource;
11789 12793
11790 /** 12794 /**
11791 * The source representing the library to be resolved. 12795 * The source representing the library to be resolved.
11792 */ 12796 */
11793 Source librarySource; 12797 Source librarySource;
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
12256 } 13260 }
12257 13261
12258 @override 13262 @override
12259 void logInformation(String message) { 13263 void logInformation(String message) {
12260 } 13264 }
12261 13265
12262 @override 13266 @override
12263 void logInformation2(String message, Exception exception) { 13267 void logInformation2(String message, Exception exception) {
12264 } 13268 }
12265 } 13269 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698