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

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

Issue 1400473008: Roll Observatory packages and add a roll script (Closed) Base URL: git@github.com:dart-lang/observatory_pub_packages.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 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
6 // significant change. Please see the README file for more information.
7
8 library engine; 5 library engine;
9 6
10 import 'dart:async'; 7 import 'dart:async';
11 import 'dart:collection'; 8 import 'dart:collection';
12 import 'dart:math' as math; 9 import 'dart:math' as math;
13 10
14 import 'package:analyzer/src/cancelable_future.dart'; 11 import 'package:analyzer/src/cancelable_future.dart';
15 import 'package:analyzer/src/context/cache.dart' as cache; 12 import 'package:analyzer/src/context/cache.dart' as cache;
16 import 'package:analyzer/src/context/context.dart' as newContext; 13 import 'package:analyzer/src/context/context.dart' as newContext;
17 import 'package:analyzer/src/generated/incremental_resolution_validator.dart'; 14 import 'package:analyzer/src/generated/incremental_resolution_validator.dart';
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 } 199 }
203 } 200 }
204 _partitions[i].put(source, entry); 201 _partitions[i].put(source, entry);
205 return; 202 return;
206 } 203 }
207 } 204 }
208 } 205 }
209 206
210 /** 207 /**
211 * Remove all information related to the given [source] from this cache. 208 * Remove all information related to the given [source] from this cache.
209 * Return the entry associated with the source, or `null` if there was cache
210 * entry for the source.
212 */ 211 */
213 void remove(Source source) { 212 SourceEntry remove(Source source) {
214 int count = _partitions.length; 213 int count = _partitions.length;
215 for (int i = 0; i < count; i++) { 214 for (int i = 0; i < count; i++) {
216 if (_partitions[i].contains(source)) { 215 if (_partitions[i].contains(source)) {
217 if (_TRACE_CHANGES) { 216 if (_TRACE_CHANGES) {
218 try { 217 try {
219 AnalysisEngine.instance.logger.logInformation( 218 AnalysisEngine.instance.logger.logInformation(
220 "Removed the cache entry for ${source.fullName}'."); 219 "Removed the cache entry for ${source.fullName}'.");
221 } catch (exception) { 220 } catch (exception) {
222 // Ignored 221 // Ignored
223 JavaSystem.currentTimeMillis(); 222 JavaSystem.currentTimeMillis();
224 } 223 }
225 } 224 }
226 _partitions[i].remove(source); 225 return _partitions[i].remove(source);
227 return;
228 } 226 }
229 } 227 }
228 return null;
230 } 229 }
231 230
232 /** 231 /**
233 * Record that the AST associated with the given [source] was just removed 232 * Record that the AST associated with the given [source] was just removed
234 * from the cache. 233 * from the cache.
235 */ 234 */
236 void removedAst(Source source) { 235 void removedAst(Source source) {
237 int count = _partitions.length; 236 int count = _partitions.length;
238 for (int i = 0; i < count; i++) { 237 for (int i = 0; i < count; i++) {
239 if (_partitions[i].contains(source)) { 238 if (_partitions[i].contains(source)) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 */ 345 */
347 DeclaredVariables get declaredVariables; 346 DeclaredVariables get declaredVariables;
348 347
349 /** 348 /**
350 * Return a list containing all of the sources known to this context that 349 * Return a list containing all of the sources known to this context that
351 * represent HTML files. The contents of the list can be incomplete. 350 * represent HTML files. The contents of the list can be incomplete.
352 */ 351 */
353 List<Source> get htmlSources; 352 List<Source> get htmlSources;
354 353
355 /** 354 /**
355 * The stream that is notified when a source either starts or stops being
356 * analyzed implicitly.
357 */
358 Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents;
359
360 /**
356 * Returns `true` if this context was disposed using [dispose]. 361 * Returns `true` if this context was disposed using [dispose].
357 */ 362 */
358 bool get isDisposed; 363 bool get isDisposed;
359 364
360 /** 365 /**
361 * Return a list containing all of the sources known to this context that 366 * Return a list containing all of the sources known to this context that
362 * represent the defining compilation unit of a library that can be run within 367 * represent the defining compilation unit of a library that can be run within
363 * a browser. The sources that are returned represent libraries that have a 368 * a browser. The sources that are returned represent libraries that have a
364 * 'main' method and are either referenced by an HTML file or import, directly 369 * 'main' method and are either referenced by an HTML file or import, directly
365 * or indirectly, a client-only library. The contents of the list can be 370 * or indirectly, a client-only library. The contents of the list can be
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 */ 422 */
418 List<Source> get sources; 423 List<Source> get sources;
419 424
420 /** 425 /**
421 * Return a type provider for this context or throw [AnalysisException] if 426 * Return a type provider for this context or throw [AnalysisException] if
422 * either `dart:core` or `dart:async` cannot be resolved. 427 * either `dart:core` or `dart:async` cannot be resolved.
423 */ 428 */
424 TypeProvider get typeProvider; 429 TypeProvider get typeProvider;
425 430
426 /** 431 /**
432 * Return a type system for this context.
433 */
434 TypeSystem get typeSystem;
435
436 /**
427 * Add the given [listener] to the list of objects that are to be notified 437 * Add the given [listener] to the list of objects that are to be notified
428 * when various analysis results are produced in this context. 438 * when various analysis results are produced in this context.
429 */ 439 */
430 void addListener(AnalysisListener listener); 440 void addListener(AnalysisListener listener);
431 441
432 /** 442 /**
433 * Apply the given [delta] to change the level of analysis that will be 443 * Apply the given [delta] to change the level of analysis that will be
434 * performed for the sources known to this context. 444 * performed for the sources known to this context.
435 */ 445 */
436 void applyAnalysisDelta(AnalysisDelta delta); 446 void applyAnalysisDelta(AnalysisDelta delta);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
541 * If the resolved AST can't be computed for some reason, the future will be 551 * If the resolved AST can't be computed for some reason, the future will be
542 * completed with an error. One possible error is AnalysisNotScheduledError, 552 * completed with an error. One possible error is AnalysisNotScheduledError,
543 * which means that the resolved AST can't be computed because the given 553 * which means that the resolved AST can't be computed because the given
544 * source file is not scheduled to be analyzed within the context of the 554 * source file is not scheduled to be analyzed within the context of the
545 * given library. 555 * given library.
546 */ 556 */
547 CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync( 557 CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
548 Source source, Source librarySource); 558 Source source, Source librarySource);
549 559
550 /** 560 /**
561 * Perform work until the given [result] has been computed for the given
562 * [target]. Return the computed value.
563 */
564 Object /*V*/ computeResult(
565 AnalysisTarget target, ResultDescriptor /*<V>*/ result);
566
567 /**
551 * Notifies the context that the client is going to stop using this context. 568 * Notifies the context that the client is going to stop using this context.
552 */ 569 */
553 void dispose(); 570 void dispose();
554 571
555 /** 572 /**
556 * Return `true` if the given [source] exists. 573 * Return `true` if the given [source] exists.
557 * 574 *
558 * This method should be used rather than the method [Source.exists] because 575 * This method should be used rather than the method [Source.exists] because
559 * contexts can have local overrides of the content of a source that the 576 * contexts can have local overrides of the content of a source that the
560 * source is not aware of and a source with local content is considered to 577 * source is not aware of and a source with local content is considered to
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 /** 723 /**
707 * Return the fully resolved HTML unit defined by the given [htmlSource], or 724 * Return the fully resolved HTML unit defined by the given [htmlSource], or
708 * `null` if the resolved unit is not already computed. 725 * `null` if the resolved unit is not already computed.
709 * 726 *
710 * See [resolveHtmlUnit]. 727 * See [resolveHtmlUnit].
711 */ 728 */
712 @deprecated 729 @deprecated
713 ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource); 730 ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource);
714 731
715 /** 732 /**
733 * Return the value of the given [result] for the given [target].
734 *
735 * If the corresponding [target] does not exist, or the [result] is not
736 * computed yet, then the default value is returned.
737 */
738 Object /*V*/ getResult(
739 AnalysisTarget target, ResultDescriptor /*<V>*/ result);
740
741 /**
716 * Return a list of the sources being analyzed in this context whose full path 742 * Return a list of the sources being analyzed in this context whose full path
717 * is equal to the given [path]. 743 * is equal to the given [path].
718 */ 744 */
719 List<Source> getSourcesWithFullName(String path); 745 List<Source> getSourcesWithFullName(String path);
720 746
721 /** 747 /**
722 * Invalidates hints in the given [librarySource] and included parts. 748 * Invalidates hints in the given [librarySource] and included parts.
723 */ 749 */
724 void invalidateLibraryHints(Source librarySource); 750 void invalidateLibraryHints(Source librarySource);
725 751
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 * Cached information used in incremental analysis or `null` if none. 1038 * Cached information used in incremental analysis or `null` if none.
1013 */ 1039 */
1014 IncrementalAnalysisCache _incrementalAnalysisCache; 1040 IncrementalAnalysisCache _incrementalAnalysisCache;
1015 1041
1016 /** 1042 /**
1017 * The [TypeProvider] for this context, `null` if not yet created. 1043 * The [TypeProvider] for this context, `null` if not yet created.
1018 */ 1044 */
1019 TypeProvider _typeProvider; 1045 TypeProvider _typeProvider;
1020 1046
1021 /** 1047 /**
1048 * The [TypeSystem] for this context, `null` if not yet created.
1049 */
1050 TypeSystem _typeSystem;
1051
1052 /**
1022 * The object used to manage the list of sources that need to be analyzed. 1053 * The object used to manage the list of sources that need to be analyzed.
1023 */ 1054 */
1024 WorkManager _workManager = new WorkManager(); 1055 WorkManager _workManager = new WorkManager();
1025 1056
1026 /** 1057 /**
1027 * The [Stopwatch] of the current "perform tasks cycle". 1058 * The [Stopwatch] of the current "perform tasks cycle".
1028 */ 1059 */
1029 Stopwatch _performAnalysisTaskStopwatch; 1060 Stopwatch _performAnalysisTaskStopwatch;
1030 1061
1031 /** 1062 /**
1032 * The controller for sending [SourcesChangedEvent]s. 1063 * The controller for sending [SourcesChangedEvent]s.
1033 */ 1064 */
1034 StreamController<SourcesChangedEvent> _onSourcesChangedController; 1065 StreamController<SourcesChangedEvent> _onSourcesChangedController;
1035 1066
1036 /** 1067 /**
1068 * A subscription for a stream of events indicating when files are (and are
1069 * not) being implicitly analyzed.
1070 */
1071 StreamController<ImplicitAnalysisEvent> _implicitAnalysisEventsController;
1072
1073 /**
1037 * The listeners that are to be notified when various analysis results are 1074 * The listeners that are to be notified when various analysis results are
1038 * produced in this context. 1075 * produced in this context.
1039 */ 1076 */
1040 List<AnalysisListener> _listeners = new List<AnalysisListener>(); 1077 List<AnalysisListener> _listeners = new List<AnalysisListener>();
1041 1078
1042 /** 1079 /**
1043 * The most recently incrementally resolved source, or `null` when it was 1080 * The most recently incrementally resolved source, or `null` when it was
1044 * already validated, or the most recent change was not incrementally resolved . 1081 * already validated, or the most recent change was not incrementally resolved .
1045 */ 1082 */
1046 Source incrementalResolutionValidation_lastUnitSource; 1083 Source incrementalResolutionValidation_lastUnitSource;
(...skipping 24 matching lines...) Expand all
1071 /** 1108 /**
1072 * A factory to override how [LibraryResolver] is created. 1109 * A factory to override how [LibraryResolver] is created.
1073 */ 1110 */
1074 LibraryResolverFactory libraryResolverFactory; 1111 LibraryResolverFactory libraryResolverFactory;
1075 1112
1076 /** 1113 /**
1077 * Initialize a newly created analysis context. 1114 * Initialize a newly created analysis context.
1078 */ 1115 */
1079 AnalysisContextImpl() { 1116 AnalysisContextImpl() {
1080 _resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this); 1117 _resultRecorder = new AnalysisContextImpl_AnalysisTaskResultRecorder(this);
1081 _privatePartition = new UniversalCachePartition(this, 1118 _privatePartition = new UniversalCachePartition(
1119 this,
1082 AnalysisOptionsImpl.DEFAULT_CACHE_SIZE, 1120 AnalysisOptionsImpl.DEFAULT_CACHE_SIZE,
1083 new AnalysisContextImpl_ContextRetentionPolicy(this)); 1121 new AnalysisContextImpl_ContextRetentionPolicy(this));
1084 _cache = createCacheFromSourceFactory(null); 1122 _cache = createCacheFromSourceFactory(null);
1085 _onSourcesChangedController = 1123 _onSourcesChangedController =
1086 new StreamController<SourcesChangedEvent>.broadcast(); 1124 new StreamController<SourcesChangedEvent>.broadcast();
1125 _implicitAnalysisEventsController =
1126 new StreamController<ImplicitAnalysisEvent>.broadcast();
1087 } 1127 }
1088 1128
1089 @override 1129 @override
1090 AnalysisCache get analysisCache => _cache; 1130 AnalysisCache get analysisCache => _cache;
1091 1131
1092 @override 1132 @override
1093 AnalysisOptions get analysisOptions => _options; 1133 AnalysisOptions get analysisOptions => _options;
1094 1134
1095 @override 1135 @override
1096 void set analysisOptions(AnalysisOptions options) { 1136 void set analysisOptions(AnalysisOptions options) {
1097 bool needsRecompute = this._options.analyzeFunctionBodiesPredicate != 1137 bool needsRecompute = this._options.analyzeFunctionBodiesPredicate !=
1098 options.analyzeFunctionBodiesPredicate || 1138 options.analyzeFunctionBodiesPredicate ||
1099 this._options.generateImplicitErrors != 1139 this._options.generateImplicitErrors !=
1100 options.generateImplicitErrors || 1140 options.generateImplicitErrors ||
1101 this._options.generateSdkErrors != options.generateSdkErrors || 1141 this._options.generateSdkErrors != options.generateSdkErrors ||
1102 this._options.dart2jsHint != options.dart2jsHint || 1142 this._options.dart2jsHint != options.dart2jsHint ||
1103 (this._options.hint && !options.hint) || 1143 (this._options.hint && !options.hint) ||
1104 this._options.preserveComments != options.preserveComments || 1144 this._options.preserveComments != options.preserveComments ||
1105 this._options.enableStrictCallChecks != options.enableStrictCallChecks; 1145 this._options.strongMode != options.strongMode ||
1146 this._options.enableStrictCallChecks !=
1147 options.enableStrictCallChecks ||
1148 this._options.enableSuperMixins != options.enableSuperMixins;
1106 int cacheSize = options.cacheSize; 1149 int cacheSize = options.cacheSize;
1107 if (this._options.cacheSize != cacheSize) { 1150 if (this._options.cacheSize != cacheSize) {
1108 this._options.cacheSize = cacheSize; 1151 this._options.cacheSize = cacheSize;
1109 //cache.setMaxCacheSize(cacheSize); 1152 //cache.setMaxCacheSize(cacheSize);
1110 _privatePartition.maxCacheSize = cacheSize; 1153 _privatePartition.maxCacheSize = cacheSize;
1111 // 1154 //
1112 // Cap the size of the priority list to being less than the cache size. 1155 // Cap the size of the priority list to being less than the cache size.
1113 // Failure to do so can result in an infinite loop in 1156 // Failure to do so can result in an infinite loop in
1114 // performAnalysisTask() because re-caching one AST structure 1157 // performAnalysisTask() because re-caching one AST structure
1115 // can cause another priority source's AST structure to be flushed. 1158 // can cause another priority source's AST structure to be flushed.
1116 // 1159 //
1117 // TODO(brianwilkerson) Remove this constraint when the new task model is 1160 // TODO(brianwilkerson) Remove this constraint when the new task model is
1118 // implemented. 1161 // implemented.
1119 // 1162 //
1120 int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA; 1163 int maxPriorityOrderSize = cacheSize - _PRIORITY_ORDER_SIZE_DELTA;
1121 if (_priorityOrder.length > maxPriorityOrderSize) { 1164 if (_priorityOrder.length > maxPriorityOrderSize) {
1122 _priorityOrder = _priorityOrder.sublist(0, maxPriorityOrderSize); 1165 _priorityOrder = _priorityOrder.sublist(0, maxPriorityOrderSize);
1123 } 1166 }
1124 } 1167 }
1125 this._options.analyzeFunctionBodiesPredicate = 1168 this._options.analyzeFunctionBodiesPredicate =
1126 options.analyzeFunctionBodiesPredicate; 1169 options.analyzeFunctionBodiesPredicate;
1127 this._options.generateImplicitErrors = options.generateImplicitErrors; 1170 this._options.generateImplicitErrors = options.generateImplicitErrors;
1128 this._options.generateSdkErrors = options.generateSdkErrors; 1171 this._options.generateSdkErrors = options.generateSdkErrors;
1129 this._options.dart2jsHint = options.dart2jsHint; 1172 this._options.dart2jsHint = options.dart2jsHint;
1130 this._options.enableStrictCallChecks = options.enableStrictCallChecks; 1173 this._options.enableStrictCallChecks = options.enableStrictCallChecks;
1174 this._options.enableSuperMixins = options.enableSuperMixins;
1131 this._options.hint = options.hint; 1175 this._options.hint = options.hint;
1132 this._options.incremental = options.incremental; 1176 this._options.incremental = options.incremental;
1133 this._options.incrementalApi = options.incrementalApi; 1177 this._options.incrementalApi = options.incrementalApi;
1134 this._options.incrementalValidation = options.incrementalValidation; 1178 this._options.incrementalValidation = options.incrementalValidation;
1135 this._options.lint = options.lint; 1179 this._options.lint = options.lint;
1136 this._options.preserveComments = options.preserveComments; 1180 this._options.preserveComments = options.preserveComments;
1181 this._options.strongMode = options.strongMode;
1137 _generateImplicitErrors = options.generateImplicitErrors; 1182 _generateImplicitErrors = options.generateImplicitErrors;
1138 _generateSdkErrors = options.generateSdkErrors; 1183 _generateSdkErrors = options.generateSdkErrors;
1139 if (needsRecompute) { 1184 if (needsRecompute) {
1140 _invalidateAllLocalResolutionInformation(false); 1185 _invalidateAllLocalResolutionInformation(false);
1141 } 1186 }
1142 } 1187 }
1143 1188
1144 @override 1189 @override
1145 void set analysisPriorityOrder(List<Source> sources) { 1190 void set analysisPriorityOrder(List<Source> sources) {
1146 if (sources == null || sources.isEmpty) { 1191 if (sources == null || sources.isEmpty) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 targets.add(iterator.key); 1236 targets.add(iterator.key);
1192 } 1237 }
1193 } 1238 }
1194 return targets; 1239 return targets;
1195 } 1240 }
1196 1241
1197 @override 1242 @override
1198 List<Source> get htmlSources => _getSources(SourceKind.HTML); 1243 List<Source> get htmlSources => _getSources(SourceKind.HTML);
1199 1244
1200 @override 1245 @override
1246 Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents =>
1247 _implicitAnalysisEventsController.stream;
1248
1249 @override
1201 bool get isDisposed => _disposed; 1250 bool get isDisposed => _disposed;
1202 1251
1203 @override 1252 @override
1204 List<Source> get launchableClientLibrarySources { 1253 List<Source> get launchableClientLibrarySources {
1205 // TODO(brianwilkerson) This needs to filter out libraries that do not 1254 // TODO(brianwilkerson) This needs to filter out libraries that do not
1206 // reference dart:html, either directly or indirectly. 1255 // reference dart:html, either directly or indirectly.
1207 List<Source> sources = new List<Source>(); 1256 List<Source> sources = new List<Source>();
1208 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); 1257 MapIterator<Source, SourceEntry> iterator = _cache.iterator();
1209 while (iterator.moveNext()) { 1258 while (iterator.moveNext()) {
1210 Source source = iterator.key; 1259 Source source = iterator.key;
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
1504 } 1553 }
1505 1554
1506 /** 1555 /**
1507 * Sets the [TypeProvider] for this context. 1556 * Sets the [TypeProvider] for this context.
1508 */ 1557 */
1509 void set typeProvider(TypeProvider typeProvider) { 1558 void set typeProvider(TypeProvider typeProvider) {
1510 _typeProvider = typeProvider; 1559 _typeProvider = typeProvider;
1511 } 1560 }
1512 1561
1513 @override 1562 @override
1563 TypeSystem get typeSystem {
1564 if (_typeSystem == null) {
1565 _typeSystem = TypeSystem.create(this);
1566 }
1567 return _typeSystem;
1568 }
1569
1570 @override
1514 void addListener(AnalysisListener listener) { 1571 void addListener(AnalysisListener listener) {
1515 if (!_listeners.contains(listener)) { 1572 if (!_listeners.contains(listener)) {
1516 _listeners.add(listener); 1573 _listeners.add(listener);
1517 } 1574 }
1518 } 1575 }
1519 1576
1520 @override 1577 @override
1521 void applyAnalysisDelta(AnalysisDelta delta) { 1578 void applyAnalysisDelta(AnalysisDelta delta) {
1522 ChangeSet changeSet = new ChangeSet(); 1579 ChangeSet changeSet = new ChangeSet();
1523 delta.analysisLevels.forEach((Source source, AnalysisLevel level) { 1580 delta.analysisLevels.forEach((Source source, AnalysisLevel level) {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1577 1634
1578 @override 1635 @override
1579 String computeDocumentationComment(Element element) { 1636 String computeDocumentationComment(Element element) {
1580 if (element == null) { 1637 if (element == null) {
1581 return null; 1638 return null;
1582 } 1639 }
1583 Source source = element.source; 1640 Source source = element.source;
1584 if (source == null) { 1641 if (source == null) {
1585 return null; 1642 return null;
1586 } 1643 }
1587 CompilationUnit unit = parseCompilationUnit(source); 1644 SourceRange docRange = element.docRange;
1588 if (unit == null) { 1645 if (docRange == null) {
1589 return null; 1646 return null;
1590 } 1647 }
1591 NodeLocator locator = new NodeLocator(element.nameOffset); 1648 String code = getContents(source).data;
1592 AstNode nameNode = locator.searchWithin(unit); 1649 String comment = code.substring(docRange.offset, docRange.end);
1593 while (nameNode != null) { 1650 return comment.replaceAll('\r\n', '\n');
1594 if (nameNode is AnnotatedNode) {
1595 Comment comment = nameNode.documentationComment;
1596 if (comment == null) {
1597 return null;
1598 }
1599 StringBuffer buffer = new StringBuffer();
1600 List<Token> tokens = comment.tokens;
1601 for (int i = 0; i < tokens.length; i++) {
1602 if (i > 0) {
1603 buffer.write("\n");
1604 }
1605 buffer.write(tokens[i].lexeme);
1606 }
1607 return buffer.toString();
1608 }
1609 nameNode = nameNode.parent;
1610 }
1611 return null;
1612 } 1651 }
1613 1652
1614 @override 1653 @override
1615 List<AnalysisError> computeErrors(Source source) { 1654 List<AnalysisError> computeErrors(Source source) {
1616 bool enableHints = _options.hint; 1655 bool enableHints = _options.hint;
1617 bool enableLints = _options.lint; 1656 bool enableLints = _options.lint;
1618 1657
1619 SourceEntry sourceEntry = _getReadableSourceEntry(source); 1658 SourceEntry sourceEntry = _getReadableSourceEntry(source);
1620 if (sourceEntry is DartEntry) { 1659 if (sourceEntry is DartEntry) {
1621 List<AnalysisError> errors = new List<AnalysisError>(); 1660 List<AnalysisError> errors = new List<AnalysisError>();
1622 try { 1661 try {
1623 DartEntry dartEntry = sourceEntry; 1662 DartEntry dartEntry = sourceEntry;
1624 ListUtilities.addAll( 1663 ListUtilities.addAll(
1625 errors, _getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS)); 1664 errors, _getDartScanData(source, dartEntry, DartEntry.SCAN_ERRORS));
1626 dartEntry = _getReadableDartEntry(source); 1665 dartEntry = _getReadableDartEntry(source);
1627 ListUtilities.addAll(errors, 1666 ListUtilities.addAll(errors,
1628 _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS)); 1667 _getDartParseData(source, dartEntry, DartEntry.PARSE_ERRORS));
1629 dartEntry = _getReadableDartEntry(source); 1668 dartEntry = _getReadableDartEntry(source);
1630 if (dartEntry.getValue(DartEntry.SOURCE_KIND) == SourceKind.LIBRARY) { 1669 if (dartEntry.getValue(DartEntry.SOURCE_KIND) == SourceKind.LIBRARY) {
1631 ListUtilities.addAll(errors, _getDartResolutionData( 1670 ListUtilities.addAll(
1632 source, source, dartEntry, DartEntry.RESOLUTION_ERRORS)); 1671 errors,
1672 _getDartResolutionData(
1673 source, source, dartEntry, DartEntry.RESOLUTION_ERRORS));
1633 dartEntry = _getReadableDartEntry(source); 1674 dartEntry = _getReadableDartEntry(source);
1634 ListUtilities.addAll(errors, _getDartVerificationData( 1675 ListUtilities.addAll(
1635 source, source, dartEntry, DartEntry.VERIFICATION_ERRORS)); 1676 errors,
1677 _getDartVerificationData(
1678 source, source, dartEntry, DartEntry.VERIFICATION_ERRORS));
1636 if (enableHints) { 1679 if (enableHints) {
1637 dartEntry = _getReadableDartEntry(source); 1680 dartEntry = _getReadableDartEntry(source);
1638 ListUtilities.addAll(errors, 1681 ListUtilities.addAll(errors,
1639 _getDartHintData(source, source, dartEntry, DartEntry.HINTS)); 1682 _getDartHintData(source, source, dartEntry, DartEntry.HINTS));
1640 } 1683 }
1641 if (enableLints) { 1684 if (enableLints) {
1642 dartEntry = _getReadableDartEntry(source); 1685 dartEntry = _getReadableDartEntry(source);
1643 ListUtilities.addAll(errors, 1686 ListUtilities.addAll(errors,
1644 _getDartLintData(source, source, dartEntry, DartEntry.LINTS)); 1687 _getDartLintData(source, source, dartEntry, DartEntry.LINTS));
1645 } 1688 }
1646 } else { 1689 } else {
1647 List<Source> libraries = getLibrariesContaining(source); 1690 List<Source> libraries = getLibrariesContaining(source);
1648 for (Source librarySource in libraries) { 1691 for (Source librarySource in libraries) {
1649 ListUtilities.addAll(errors, _getDartResolutionData( 1692 ListUtilities.addAll(
1650 source, librarySource, dartEntry, DartEntry.RESOLUTION_ERRORS)); 1693 errors,
1694 _getDartResolutionData(source, librarySource, dartEntry,
1695 DartEntry.RESOLUTION_ERRORS));
1651 dartEntry = _getReadableDartEntry(source); 1696 dartEntry = _getReadableDartEntry(source);
1652 ListUtilities.addAll(errors, _getDartVerificationData(source, 1697 ListUtilities.addAll(
1653 librarySource, dartEntry, DartEntry.VERIFICATION_ERRORS)); 1698 errors,
1699 _getDartVerificationData(source, librarySource, dartEntry,
1700 DartEntry.VERIFICATION_ERRORS));
1654 if (enableHints) { 1701 if (enableHints) {
1655 dartEntry = _getReadableDartEntry(source); 1702 dartEntry = _getReadableDartEntry(source);
1656 ListUtilities.addAll(errors, _getDartHintData( 1703 ListUtilities.addAll(
1657 source, librarySource, dartEntry, DartEntry.HINTS)); 1704 errors,
1705 _getDartHintData(
1706 source, librarySource, dartEntry, DartEntry.HINTS));
1658 } 1707 }
1659 if (enableLints) { 1708 if (enableLints) {
1660 dartEntry = _getReadableDartEntry(source); 1709 dartEntry = _getReadableDartEntry(source);
1661 ListUtilities.addAll(errors, _getDartLintData( 1710 ListUtilities.addAll(
1662 source, librarySource, dartEntry, DartEntry.LINTS)); 1711 errors,
1712 _getDartLintData(
1713 source, librarySource, dartEntry, DartEntry.LINTS));
1663 } 1714 }
1664 } 1715 }
1665 } 1716 }
1666 } on ObsoleteSourceAnalysisException catch (exception, stackTrace) { 1717 } on ObsoleteSourceAnalysisException catch (exception, stackTrace) {
1667 AnalysisEngine.instance.logger.logInformation( 1718 AnalysisEngine.instance.logger.logInformation(
1668 "Could not compute errors", 1719 "Could not compute errors",
1669 new CaughtException(exception, stackTrace)); 1720 new CaughtException(exception, stackTrace));
1670 } 1721 }
1671 if (errors.isEmpty) { 1722 if (errors.isEmpty) {
1672 return AnalysisError.NO_ERRORS; 1723 return AnalysisError.NO_ERRORS;
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1748 throw new AnalysisException( 1799 throw new AnalysisException(
1749 "Internal error: computeResolvableCompilationUnit could not parse ${so urce.fullName}", 1800 "Internal error: computeResolvableCompilationUnit could not parse ${so urce.fullName}",
1750 new CaughtException(dartEntry.exception, null)); 1801 new CaughtException(dartEntry.exception, null));
1751 } 1802 }
1752 return unit; 1803 return unit;
1753 } 1804 }
1754 1805
1755 @override 1806 @override
1756 CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync( 1807 CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
1757 Source unitSource, Source librarySource) { 1808 Source unitSource, Source librarySource) {
1758 return new _AnalysisFutureHelper<CompilationUnit>(this).computeAsync( 1809 return new _AnalysisFutureHelper<CompilationUnit>(this)
1759 unitSource, (SourceEntry sourceEntry) { 1810 .computeAsync(unitSource, (SourceEntry sourceEntry) {
1760 if (sourceEntry is DartEntry) { 1811 if (sourceEntry is DartEntry) {
1761 if (sourceEntry.getStateInLibrary( 1812 if (sourceEntry.getStateInLibrary(
1762 DartEntry.RESOLVED_UNIT, librarySource) == 1813 DartEntry.RESOLVED_UNIT, librarySource) ==
1763 CacheState.ERROR) { 1814 CacheState.ERROR) {
1764 throw sourceEntry.exception; 1815 throw sourceEntry.exception;
1765 } 1816 }
1766 return sourceEntry.getValueInLibrary( 1817 return sourceEntry.getValueInLibrary(
1767 DartEntry.RESOLVED_UNIT, librarySource); 1818 DartEntry.RESOLVED_UNIT, librarySource);
1768 } 1819 }
1769 throw new AnalysisNotScheduledError(); 1820 throw new AnalysisNotScheduledError();
1770 }); 1821 });
1771 } 1822 }
1772 1823
1824 @override
1825 Object computeResult(AnalysisTarget target, ResultDescriptor result) {
1826 return result.defaultValue;
1827 }
1828
1773 /** 1829 /**
1774 * Create an analysis cache based on the given source [factory]. 1830 * Create an analysis cache based on the given source [factory].
1775 */ 1831 */
1776 AnalysisCache createCacheFromSourceFactory(SourceFactory factory) { 1832 AnalysisCache createCacheFromSourceFactory(SourceFactory factory) {
1777 if (factory == null) { 1833 if (factory == null) {
1778 return new AnalysisCache(<CachePartition>[_privatePartition]); 1834 return new AnalysisCache(<CachePartition>[_privatePartition]);
1779 } 1835 }
1780 DartSdk sdk = factory.dartSdk; 1836 DartSdk sdk = factory.dartSdk;
1781 if (sdk == null) { 1837 if (sdk == null) {
1782 return new AnalysisCache(<CachePartition>[_privatePartition]); 1838 return new AnalysisCache(<CachePartition>[_privatePartition]);
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2090 Namespace namespace = null; 2146 Namespace namespace = null;
2091 if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) { 2147 if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
2092 namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE); 2148 namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
2093 } 2149 }
2094 if (namespace == null) { 2150 if (namespace == null) {
2095 NamespaceBuilder builder = new NamespaceBuilder(); 2151 NamespaceBuilder builder = new NamespaceBuilder();
2096 namespace = builder.createPublicNamespaceForLibrary(library); 2152 namespace = builder.createPublicNamespaceForLibrary(library);
2097 if (dartEntry == null) { 2153 if (dartEntry == null) {
2098 AnalysisEngine.instance.logger.logError( 2154 AnalysisEngine.instance.logger.logError(
2099 "Could not compute the public namespace for ${library.source.fullNam e}", 2155 "Could not compute the public namespace for ${library.source.fullNam e}",
2100 new CaughtException(new AnalysisException( 2156 new CaughtException(
2157 new AnalysisException(
2101 "A Dart file became a non-Dart file: ${source.fullName}"), 2158 "A Dart file became a non-Dart file: ${source.fullName}"),
2102 null)); 2159 null));
2103 return null; 2160 return null;
2104 } 2161 }
2105 if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) { 2162 if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
2106 dartEntry.setValue(DartEntry.PUBLIC_NAMESPACE, namespace); 2163 dartEntry.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
2107 } 2164 }
2108 } 2165 }
2109 return namespace; 2166 return namespace;
2110 } 2167 }
(...skipping 29 matching lines...) Expand all
2140 ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) { 2197 ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
2141 SourceEntry sourceEntry = getReadableSourceEntryOrNull(htmlSource); 2198 SourceEntry sourceEntry = getReadableSourceEntryOrNull(htmlSource);
2142 if (sourceEntry is HtmlEntry) { 2199 if (sourceEntry is HtmlEntry) {
2143 HtmlEntry htmlEntry = sourceEntry; 2200 HtmlEntry htmlEntry = sourceEntry;
2144 return htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT); 2201 return htmlEntry.getValue(HtmlEntry.RESOLVED_UNIT);
2145 } 2202 }
2146 return null; 2203 return null;
2147 } 2204 }
2148 2205
2149 @override 2206 @override
2207 Object getResult(AnalysisTarget target, ResultDescriptor result) {
2208 return result.defaultValue;
2209 }
2210
2211 @override
2150 List<Source> getSourcesWithFullName(String path) { 2212 List<Source> getSourcesWithFullName(String path) {
2151 List<Source> sources = <Source>[]; 2213 List<Source> sources = <Source>[];
2152 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); 2214 MapIterator<Source, SourceEntry> iterator = _cache.iterator();
2153 while (iterator.moveNext()) { 2215 while (iterator.moveNext()) {
2154 if (iterator.key.fullName == path) { 2216 if (iterator.key.fullName == path) {
2155 sources.add(iterator.key); 2217 sources.add(iterator.key);
2156 } 2218 }
2157 } 2219 }
2158 return sources; 2220 return sources;
2159 } 2221 }
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 } 2347 }
2286 return PerformanceStatistics.performAnaysis.makeCurrentWhile(() { 2348 return PerformanceStatistics.performAnaysis.makeCurrentWhile(() {
2287 int getStart = JavaSystem.currentTimeMillis(); 2349 int getStart = JavaSystem.currentTimeMillis();
2288 AnalysisTask task = PerformanceStatistics.nextTask 2350 AnalysisTask task = PerformanceStatistics.nextTask
2289 .makeCurrentWhile(() => nextAnalysisTask); 2351 .makeCurrentWhile(() => nextAnalysisTask);
2290 int getEnd = JavaSystem.currentTimeMillis(); 2352 int getEnd = JavaSystem.currentTimeMillis();
2291 if (task == null) { 2353 if (task == null) {
2292 _validateLastIncrementalResolutionResult(); 2354 _validateLastIncrementalResolutionResult();
2293 if (_performAnalysisTaskStopwatch != null) { 2355 if (_performAnalysisTaskStopwatch != null) {
2294 AnalysisEngine.instance.instrumentationService.logPerformance( 2356 AnalysisEngine.instance.instrumentationService.logPerformance(
2295 AnalysisPerformanceKind.FULL, _performAnalysisTaskStopwatch, 2357 AnalysisPerformanceKind.FULL,
2358 _performAnalysisTaskStopwatch,
2296 'context_id=$_id'); 2359 'context_id=$_id');
2297 _performAnalysisTaskStopwatch = null; 2360 _performAnalysisTaskStopwatch = null;
2298 } 2361 }
2299 return new AnalysisResult( 2362 return new AnalysisResult(
2300 _getChangeNotices(true), getEnd - getStart, null, -1); 2363 _getChangeNotices(true), getEnd - getStart, null, -1);
2301 } 2364 }
2302 if (_performAnalysisTaskStopwatch == null) { 2365 if (_performAnalysisTaskStopwatch == null) {
2303 _performAnalysisTaskStopwatch = new Stopwatch()..start(); 2366 _performAnalysisTaskStopwatch = new Stopwatch()..start();
2304 } 2367 }
2305 String taskDescription = task.toString(); 2368 String taskDescription = task.toString();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
2403 // during resolution. 2466 // during resolution.
2404 // 2467 //
2405 if (thrownException == null) { 2468 if (thrownException == null) {
2406 var message = "In recordResolveDartLibraryCycleTaskResults, " 2469 var message = "In recordResolveDartLibraryCycleTaskResults, "
2407 "resolvedLibraries was null and there was no thrown exception"; 2470 "resolvedLibraries was null and there was no thrown exception";
2408 unitEntry.recordResolutionError( 2471 unitEntry.recordResolutionError(
2409 new CaughtException(new AnalysisException(message), null)); 2472 new CaughtException(new AnalysisException(message), null));
2410 } else { 2473 } else {
2411 unitEntry.recordResolutionError(thrownException); 2474 unitEntry.recordResolutionError(thrownException);
2412 } 2475 }
2413 _cache.remove(unitSource); 2476 _removeFromCache(unitSource);
2414 if (thrownException != null) { 2477 if (thrownException != null) {
2415 throw new AnalysisException('<rethrow>', thrownException); 2478 throw new AnalysisException('<rethrow>', thrownException);
2416 } 2479 }
2417 return unitEntry; 2480 return unitEntry;
2418 } 2481 }
2419 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML); 2482 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
2420 RecordingErrorListener errorListener = resolver.errorListener; 2483 RecordingErrorListener errorListener = resolver.errorListener;
2421 for (ResolvableLibrary library in resolvedLibraries) { 2484 for (ResolvableLibrary library in resolvedLibraries) {
2422 Source librarySource = library.librarySource; 2485 Source librarySource = library.librarySource;
2423 for (Source source in library.compilationUnitSources) { 2486 for (Source source in library.compilationUnitSources) {
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
2476 // during resolution. 2539 // during resolution.
2477 // 2540 //
2478 if (thrownException == null) { 2541 if (thrownException == null) {
2479 String message = "In recordResolveDartLibraryTaskResults, " 2542 String message = "In recordResolveDartLibraryTaskResults, "
2480 "resolvedLibraries was null and there was no thrown exception"; 2543 "resolvedLibraries was null and there was no thrown exception";
2481 unitEntry.recordResolutionError( 2544 unitEntry.recordResolutionError(
2482 new CaughtException(new AnalysisException(message), null)); 2545 new CaughtException(new AnalysisException(message), null));
2483 } else { 2546 } else {
2484 unitEntry.recordResolutionError(thrownException); 2547 unitEntry.recordResolutionError(thrownException);
2485 } 2548 }
2486 _cache.remove(unitSource); 2549 _removeFromCache(unitSource);
2487 if (thrownException != null) { 2550 if (thrownException != null) {
2488 throw new AnalysisException('<rethrow>', thrownException); 2551 throw new AnalysisException('<rethrow>', thrownException);
2489 } 2552 }
2490 return unitEntry; 2553 return unitEntry;
2491 } 2554 }
2492 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML); 2555 Source htmlSource = sourceFactory.forUri(DartSdk.DART_HTML);
2493 RecordingErrorListener errorListener = resolver.errorListener; 2556 RecordingErrorListener errorListener = resolver.errorListener;
2494 for (Library library in resolvedLibraries) { 2557 for (Library library in resolvedLibraries) {
2495 Source librarySource = library.librarySource; 2558 Source librarySource = library.librarySource;
2496 for (Source source in library.compilationUnitSources) { 2559 for (Source source in library.compilationUnitSources) {
2497 CompilationUnit unit = library.getAST(source); 2560 CompilationUnit unit = library.getAST(source);
2498 List<AnalysisError> errors = errorListener.getErrorsForSource(source); 2561 List<AnalysisError> errors = errorListener.getErrorsForSource(source);
2499 LineInfo lineInfo = getLineInfo(source); 2562 LineInfo lineInfo = getLineInfo(source);
2500 DartEntry dartEntry = _cache.get(source); 2563 DartEntry dartEntry = _cache.get(source);
2501 if (thrownException == null) { 2564 if (thrownException == null) {
2502 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo); 2565 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
2503 dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED); 2566 dartEntry.setState(DartEntry.PARSED_UNIT, CacheState.FLUSHED);
2504 dartEntry.setValueInLibrary( 2567 dartEntry.setValueInLibrary(
2505 DartEntry.RESOLVED_UNIT, librarySource, unit); 2568 DartEntry.RESOLVED_UNIT, librarySource, unit);
2506 dartEntry.setValueInLibrary( 2569 dartEntry.setValueInLibrary(
2507 DartEntry.RESOLUTION_ERRORS, librarySource, errors); 2570 DartEntry.RESOLUTION_ERRORS, librarySource, errors);
2508 if (source == librarySource) { 2571 if (source == librarySource) {
2509 _recordElementData( 2572 _recordElementData(
2510 dartEntry, library.libraryElement, librarySource, htmlSource); 2573 dartEntry, library.libraryElement, librarySource, htmlSource);
2511 } 2574 }
2512 _cache.storedAst(source); 2575 _cache.storedAst(source);
2513 } else { 2576 } else {
2514 dartEntry.recordResolutionErrorInLibrary( 2577 dartEntry.recordResolutionErrorInLibrary(
2515 librarySource, thrownException); 2578 librarySource, thrownException);
2516 _cache.remove(source); 2579 _removeFromCache(source);
2517 } 2580 }
2518 if (source != librarySource) { 2581 if (source != librarySource) {
2519 _workManager.add(source, SourcePriority.PRIORITY_PART); 2582 _workManager.add(source, SourcePriority.PRIORITY_PART);
2520 } 2583 }
2521 ChangeNoticeImpl notice = getNotice(source); 2584 ChangeNoticeImpl notice = getNotice(source);
2522 notice.resolvedDartUnit = unit; 2585 notice.resolvedDartUnit = unit;
2523 notice.setErrors(dartEntry.allErrors, lineInfo); 2586 notice.setErrors(dartEntry.allErrors, lineInfo);
2524 } 2587 }
2525 } 2588 }
2526 } 2589 }
(...skipping 12 matching lines...) Expand all
2539 CompilationUnit resolveCompilationUnit( 2602 CompilationUnit resolveCompilationUnit(
2540 Source unitSource, LibraryElement library) { 2603 Source unitSource, LibraryElement library) {
2541 if (library == null) { 2604 if (library == null) {
2542 return null; 2605 return null;
2543 } 2606 }
2544 return resolveCompilationUnit2(unitSource, library.source); 2607 return resolveCompilationUnit2(unitSource, library.source);
2545 } 2608 }
2546 2609
2547 @override 2610 @override
2548 CompilationUnit resolveCompilationUnit2( 2611 CompilationUnit resolveCompilationUnit2(
2549 Source unitSource, Source librarySource) => _getDartResolutionData2( 2612 Source unitSource, Source librarySource) =>
2613 _getDartResolutionData2(
2550 unitSource, librarySource, DartEntry.RESOLVED_UNIT, null); 2614 unitSource, librarySource, DartEntry.RESOLVED_UNIT, null);
2551 2615
2552 @override 2616 @override
2553 @deprecated 2617 @deprecated
2554 ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { 2618 ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
2555 computeHtmlElement(htmlSource); 2619 computeHtmlElement(htmlSource);
2556 return parseHtmlUnit(htmlSource); 2620 return parseHtmlUnit(htmlSource);
2557 } 2621 }
2558 2622
2559 @override 2623 @override
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2608 } 2672 }
2609 } 2673 }
2610 int count = changedSources.length; 2674 int count = changedSources.length;
2611 for (int i = 0; i < count; i++) { 2675 for (int i = 0; i < count; i++) {
2612 _sourceChanged(changedSources[i]); 2676 _sourceChanged(changedSources[i]);
2613 } 2677 }
2614 int removalCount = 0; 2678 int removalCount = 0;
2615 for (Source source in missingSources) { 2679 for (Source source in missingSources) {
2616 if (getLibrariesContaining(source).isEmpty && 2680 if (getLibrariesContaining(source).isEmpty &&
2617 getLibrariesDependingOn(source).isEmpty) { 2681 getLibrariesDependingOn(source).isEmpty) {
2618 _cache.remove(source); 2682 _removeFromCache(source);
2619 removalCount++; 2683 removalCount++;
2620 } 2684 }
2621 } 2685 }
2622 int consistencyCheckEnd = JavaSystem.nanoTime(); 2686 int consistencyCheckEnd = JavaSystem.nanoTime();
2623 if (changedSources.length > 0 || missingSources.length > 0) { 2687 if (changedSources.length > 0 || missingSources.length > 0) {
2624 StringBuffer buffer = new StringBuffer(); 2688 StringBuffer buffer = new StringBuffer();
2625 buffer.write("Consistency check took "); 2689 buffer.write("Consistency check took ");
2626 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); 2690 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
2627 buffer.writeln(" ms and found"); 2691 buffer.writeln(" ms and found");
2628 buffer.write(" "); 2692 buffer.write(" ");
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
2863 // 2927 //
2864 // Check to see whether we already have the information being requested. 2928 // Check to see whether we already have the information being requested.
2865 // 2929 //
2866 CacheState state = dartEntry.getState(descriptor); 2930 CacheState state = dartEntry.getState(descriptor);
2867 while (state != CacheState.ERROR && state != CacheState.VALID) { 2931 while (state != CacheState.ERROR && state != CacheState.VALID) {
2868 // 2932 //
2869 // If not, compute the information. Unless the modification date of the 2933 // If not, compute the information. Unless the modification date of the
2870 // source continues to change, this loop will eventually terminate. 2934 // source continues to change, this loop will eventually terminate.
2871 // 2935 //
2872 dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM); 2936 dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
2873 dartEntry = new ParseDartTask(this, source, 2937 dartEntry = new ParseDartTask(
2938 this,
2939 source,
2874 dartEntry.getValue(DartEntry.TOKEN_STREAM), 2940 dartEntry.getValue(DartEntry.TOKEN_STREAM),
2875 dartEntry.getValue(SourceEntry.LINE_INFO)) 2941 dartEntry.getValue(SourceEntry.LINE_INFO))
2876 .perform(_resultRecorder) as DartEntry; 2942 .perform(_resultRecorder) as DartEntry;
2877 state = dartEntry.getState(descriptor); 2943 state = dartEntry.getState(descriptor);
2878 } 2944 }
2879 return dartEntry; 2945 return dartEntry;
2880 } 2946 }
2881 2947
2882 /** 2948 /**
2883 * Given a source for a Dart file and the library that contains it, return a 2949 * Given a source for a Dart file and the library that contains it, return a
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2927 // Check to see whether we already have the information being requested. 2993 // Check to see whether we already have the information being requested.
2928 // 2994 //
2929 CacheState state = dartEntry.getState(descriptor); 2995 CacheState state = dartEntry.getState(descriptor);
2930 while (state != CacheState.ERROR && state != CacheState.VALID) { 2996 while (state != CacheState.ERROR && state != CacheState.VALID) {
2931 // 2997 //
2932 // If not, compute the information. Unless the modification date of the 2998 // If not, compute the information. Unless the modification date of the
2933 // source continues to change, this loop will eventually terminate. 2999 // source continues to change, this loop will eventually terminate.
2934 // 3000 //
2935 try { 3001 try {
2936 if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { 3002 if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
2937 dartEntry = new GetContentTask(this, source) 3003 dartEntry = new GetContentTask(this, source).perform(_resultRecorder)
2938 .perform(_resultRecorder) as DartEntry; 3004 as DartEntry;
2939 } 3005 }
2940 dartEntry = new ScanDartTask( 3006 dartEntry = new ScanDartTask(
2941 this, source, dartEntry.getValue(SourceEntry.CONTENT)) 3007 this, source, dartEntry.getValue(SourceEntry.CONTENT))
2942 .perform(_resultRecorder) as DartEntry; 3008 .perform(_resultRecorder) as DartEntry;
2943 } on AnalysisException catch (exception) { 3009 } on AnalysisException catch (exception) {
2944 throw exception; 3010 throw exception;
2945 } catch (exception, stackTrace) { 3011 } catch (exception, stackTrace) {
2946 throw new AnalysisException( 3012 throw new AnalysisException(
2947 "Exception", new CaughtException(exception, stackTrace)); 3013 "Exception", new CaughtException(exception, stackTrace));
2948 } 3014 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3004 // Check to see whether we already have the information being requested. 3070 // Check to see whether we already have the information being requested.
3005 // 3071 //
3006 CacheState state = htmlEntry.getState(descriptor); 3072 CacheState state = htmlEntry.getState(descriptor);
3007 while (state != CacheState.ERROR && state != CacheState.VALID) { 3073 while (state != CacheState.ERROR && state != CacheState.VALID) {
3008 // 3074 //
3009 // If not, compute the information. Unless the modification date of the 3075 // If not, compute the information. Unless the modification date of the
3010 // source continues to change, this loop will eventually terminate. 3076 // source continues to change, this loop will eventually terminate.
3011 // 3077 //
3012 try { 3078 try {
3013 if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { 3079 if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
3014 htmlEntry = new GetContentTask(this, source) 3080 htmlEntry = new GetContentTask(this, source).perform(_resultRecorder)
3015 .perform(_resultRecorder) as HtmlEntry; 3081 as HtmlEntry;
3016 } 3082 }
3017 htmlEntry = new ParseHtmlTask( 3083 htmlEntry = new ParseHtmlTask(
3018 this, source, htmlEntry.getValue(SourceEntry.CONTENT)) 3084 this, source, htmlEntry.getValue(SourceEntry.CONTENT))
3019 .perform(_resultRecorder) as HtmlEntry; 3085 .perform(_resultRecorder) as HtmlEntry;
3020 } on AnalysisException catch (exception) { 3086 } on AnalysisException catch (exception) {
3021 throw exception; 3087 throw exception;
3022 } catch (exception, stackTrace) { 3088 } catch (exception, stackTrace) {
3023 throw new AnalysisException( 3089 throw new AnalysisException(
3024 "Exception", new CaughtException(exception, stackTrace)); 3090 "Exception", new CaughtException(exception, stackTrace));
3025 } 3091 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
3141 * event where as this method does not. 3207 * event where as this method does not.
3142 */ 3208 */
3143 bool _contentRangeChanged(Source source, String contents, int offset, 3209 bool _contentRangeChanged(Source source, String contents, int offset,
3144 int oldLength, int newLength) { 3210 int oldLength, int newLength) {
3145 bool changed = false; 3211 bool changed = false;
3146 String originalContents = _contentCache.setContents(source, contents); 3212 String originalContents = _contentCache.setContents(source, contents);
3147 if (contents != null) { 3213 if (contents != null) {
3148 if (contents != originalContents) { 3214 if (contents != originalContents) {
3149 if (_options.incremental) { 3215 if (_options.incremental) {
3150 _incrementalAnalysisCache = IncrementalAnalysisCache.update( 3216 _incrementalAnalysisCache = IncrementalAnalysisCache.update(
3151 _incrementalAnalysisCache, source, originalContents, contents, 3217 _incrementalAnalysisCache,
3152 offset, oldLength, newLength, _getReadableSourceEntry(source)); 3218 source,
3219 originalContents,
3220 contents,
3221 offset,
3222 oldLength,
3223 newLength,
3224 _getReadableSourceEntry(source));
3153 } 3225 }
3154 _sourceChanged(source); 3226 _sourceChanged(source);
3155 changed = true; 3227 changed = true;
3156 SourceEntry sourceEntry = _cache.get(source); 3228 SourceEntry sourceEntry = _cache.get(source);
3157 if (sourceEntry != null) { 3229 if (sourceEntry != null) {
3158 sourceEntry.modificationTime = 3230 sourceEntry.modificationTime =
3159 _contentCache.getModificationStamp(source); 3231 _contentCache.getModificationStamp(source);
3160 sourceEntry.setValue(SourceEntry.CONTENT, contents); 3232 sourceEntry.setValue(SourceEntry.CONTENT, contents);
3161 } 3233 }
3162 } 3234 }
(...skipping 27 matching lines...) Expand all
3190 AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source unitSource, 3262 AnalysisContextImpl_TaskData _createGenerateDartErrorsTask(Source unitSource,
3191 DartEntry unitEntry, Source librarySource, DartEntry libraryEntry) { 3263 DartEntry unitEntry, Source librarySource, DartEntry libraryEntry) {
3192 if (unitEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) != 3264 if (unitEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) !=
3193 CacheState.VALID || 3265 CacheState.VALID ||
3194 libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) { 3266 libraryEntry.getState(DartEntry.ELEMENT) != CacheState.VALID) {
3195 return _createResolveDartLibraryTask(librarySource, libraryEntry); 3267 return _createResolveDartLibraryTask(librarySource, libraryEntry);
3196 } 3268 }
3197 CompilationUnit unit = 3269 CompilationUnit unit =
3198 unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource); 3270 unitEntry.getValueInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
3199 if (unit == null) { 3271 if (unit == null) {
3200 CaughtException exception = new CaughtException(new AnalysisException( 3272 CaughtException exception = new CaughtException(
3273 new AnalysisException(
3201 "Entry has VALID state for RESOLVED_UNIT but null value for ${unit Source.fullName} in ${librarySource.fullName}"), 3274 "Entry has VALID state for RESOLVED_UNIT but null value for ${unit Source.fullName} in ${librarySource.fullName}"),
3202 null); 3275 null);
3203 AnalysisEngine.instance.logger.logInformation( 3276 AnalysisEngine.instance.logger
3204 exception.toString(), exception); 3277 .logInformation(exception.toString(), exception);
3205 unitEntry.recordResolutionError(exception); 3278 unitEntry.recordResolutionError(exception);
3206 return new AnalysisContextImpl_TaskData(null, false); 3279 return new AnalysisContextImpl_TaskData(null, false);
3207 } 3280 }
3208 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT); 3281 LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
3209 return new AnalysisContextImpl_TaskData( 3282 return new AnalysisContextImpl_TaskData(
3210 new GenerateDartErrorsTask(this, unitSource, unit, libraryElement), 3283 new GenerateDartErrorsTask(this, unitSource, unit, libraryElement),
3211 false); 3284 false);
3212 } 3285 }
3213 3286
3214 /** 3287 /**
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3292 * Create a [ParseDartTask] for the given [source]. 3365 * Create a [ParseDartTask] for the given [source].
3293 */ 3366 */
3294 AnalysisContextImpl_TaskData _createParseDartTask( 3367 AnalysisContextImpl_TaskData _createParseDartTask(
3295 Source source, DartEntry dartEntry) { 3368 Source source, DartEntry dartEntry) {
3296 if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID || 3369 if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID ||
3297 dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) { 3370 dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
3298 return _createScanDartTask(source, dartEntry); 3371 return _createScanDartTask(source, dartEntry);
3299 } 3372 }
3300 Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM); 3373 Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
3301 dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED); 3374 dartEntry.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
3302 return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, 3375 return new AnalysisContextImpl_TaskData(
3303 tokenStream, dartEntry.getValue(SourceEntry.LINE_INFO)), false); 3376 new ParseDartTask(this, source, tokenStream,
3377 dartEntry.getValue(SourceEntry.LINE_INFO)),
3378 false);
3304 } 3379 }
3305 3380
3306 /** 3381 /**
3307 * Create a [ParseHtmlTask] for the given [source]. 3382 * Create a [ParseHtmlTask] for the given [source].
3308 */ 3383 */
3309 AnalysisContextImpl_TaskData _createParseHtmlTask( 3384 AnalysisContextImpl_TaskData _createParseHtmlTask(
3310 Source source, HtmlEntry htmlEntry) { 3385 Source source, HtmlEntry htmlEntry) {
3311 if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { 3386 if (htmlEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
3312 return _createGetContentTask(source, htmlEntry); 3387 return _createGetContentTask(source, htmlEntry);
3313 } 3388 }
(...skipping 12 matching lines...) Expand all
3326 try { 3401 try {
3327 AnalysisContextImpl_CycleBuilder builder = 3402 AnalysisContextImpl_CycleBuilder builder =
3328 new AnalysisContextImpl_CycleBuilder(this); 3403 new AnalysisContextImpl_CycleBuilder(this);
3329 PerformanceStatistics.cycles.makeCurrentWhile(() { 3404 PerformanceStatistics.cycles.makeCurrentWhile(() {
3330 builder.computeCycleContaining(source); 3405 builder.computeCycleContaining(source);
3331 }); 3406 });
3332 AnalysisContextImpl_TaskData taskData = builder.taskData; 3407 AnalysisContextImpl_TaskData taskData = builder.taskData;
3333 if (taskData != null) { 3408 if (taskData != null) {
3334 return taskData; 3409 return taskData;
3335 } 3410 }
3336 return new AnalysisContextImpl_TaskData(new ResolveDartLibraryCycleTask( 3411 return new AnalysisContextImpl_TaskData(
3337 this, source, source, builder.librariesInCycle), false); 3412 new ResolveDartLibraryCycleTask(
3413 this, source, source, builder.librariesInCycle),
3414 false);
3338 } on AnalysisException catch (exception, stackTrace) { 3415 } on AnalysisException catch (exception, stackTrace) {
3339 dartEntry 3416 dartEntry
3340 .recordResolutionError(new CaughtException(exception, stackTrace)); 3417 .recordResolutionError(new CaughtException(exception, stackTrace));
3341 AnalysisEngine.instance.logger.logError( 3418 AnalysisEngine.instance.logger.logError(
3342 "Internal error trying to create a ResolveDartLibraryTask", 3419 "Internal error trying to create a ResolveDartLibraryTask",
3343 new CaughtException(exception, stackTrace)); 3420 new CaughtException(exception, stackTrace));
3344 } 3421 }
3345 return new AnalysisContextImpl_TaskData(null, false); 3422 return new AnalysisContextImpl_TaskData(null, false);
3346 } 3423 }
3347 3424
3348 /** 3425 /**
3349 * Create a [ResolveHtmlTask] for the given [source], marking the resolved 3426 * Create a [ResolveHtmlTask] for the given [source], marking the resolved
3350 * unit as being in-process. 3427 * unit as being in-process.
3351 */ 3428 */
3352 AnalysisContextImpl_TaskData _createResolveHtmlTask( 3429 AnalysisContextImpl_TaskData _createResolveHtmlTask(
3353 Source source, HtmlEntry htmlEntry) { 3430 Source source, HtmlEntry htmlEntry) {
3354 if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) { 3431 if (htmlEntry.getState(HtmlEntry.PARSED_UNIT) != CacheState.VALID) {
3355 return _createParseHtmlTask(source, htmlEntry); 3432 return _createParseHtmlTask(source, htmlEntry);
3356 } 3433 }
3357 return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, 3434 return new AnalysisContextImpl_TaskData(
3358 htmlEntry.modificationTime, 3435 new ResolveHtmlTask(this, source, htmlEntry.modificationTime,
3359 htmlEntry.getValue(HtmlEntry.PARSED_UNIT)), false); 3436 htmlEntry.getValue(HtmlEntry.PARSED_UNIT)),
3437 false);
3360 } 3438 }
3361 3439
3362 /** 3440 /**
3363 * Create a [ScanDartTask] for the given [source], marking the scan errors as 3441 * Create a [ScanDartTask] for the given [source], marking the scan errors as
3364 * being in-process. 3442 * being in-process.
3365 */ 3443 */
3366 AnalysisContextImpl_TaskData _createScanDartTask( 3444 AnalysisContextImpl_TaskData _createScanDartTask(
3367 Source source, DartEntry dartEntry) { 3445 Source source, DartEntry dartEntry) {
3368 if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) { 3446 if (dartEntry.getState(SourceEntry.CONTENT) != CacheState.VALID) {
3369 return _createGetContentTask(source, dartEntry); 3447 return _createGetContentTask(source, dartEntry);
3370 } 3448 }
3371 String content = dartEntry.getValue(SourceEntry.CONTENT); 3449 String content = dartEntry.getValue(SourceEntry.CONTENT);
3372 dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED); 3450 dartEntry.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
3373 return new AnalysisContextImpl_TaskData( 3451 return new AnalysisContextImpl_TaskData(
3374 new ScanDartTask(this, source, content), false); 3452 new ScanDartTask(this, source, content), false);
3375 } 3453 }
3376 3454
3377 /** 3455 /**
3378 * Create a source entry for the given [source]. Return the source entry that 3456 * Create a source entry for the given [source]. Return the source entry that
3379 * was created, or `null` if the source should not be tracked by this context. 3457 * was created, or `null` if the source should not be tracked by this context.
3380 */ 3458 */
3381 SourceEntry _createSourceEntry(Source source, bool explicitlyAdded) { 3459 SourceEntry _createSourceEntry(Source source, bool explicitlyAdded) {
3382 String name = source.shortName; 3460 String name = source.shortName;
3383 if (AnalysisEngine.isHtmlFileName(name)) { 3461 if (AnalysisEngine.isHtmlFileName(name)) {
3384 HtmlEntry htmlEntry = new HtmlEntry(); 3462 HtmlEntry htmlEntry = new HtmlEntry();
3385 htmlEntry.modificationTime = getModificationStamp(source); 3463 htmlEntry.modificationTime = getModificationStamp(source);
3386 htmlEntry.explicitlyAdded = explicitlyAdded; 3464 htmlEntry.explicitlyAdded = explicitlyAdded;
3387 _cache.put(source, htmlEntry); 3465 _cache.put(source, htmlEntry);
3466 if (!explicitlyAdded) {
3467 _implicitAnalysisEventsController
3468 .add(new ImplicitAnalysisEvent(source, true));
3469 }
3388 return htmlEntry; 3470 return htmlEntry;
3389 } else { 3471 } else {
3390 DartEntry dartEntry = new DartEntry(); 3472 DartEntry dartEntry = new DartEntry();
3391 dartEntry.modificationTime = getModificationStamp(source); 3473 dartEntry.modificationTime = getModificationStamp(source);
3392 dartEntry.explicitlyAdded = explicitlyAdded; 3474 dartEntry.explicitlyAdded = explicitlyAdded;
3393 _cache.put(source, dartEntry); 3475 _cache.put(source, dartEntry);
3476 if (!explicitlyAdded) {
3477 _implicitAnalysisEventsController
3478 .add(new ImplicitAnalysisEvent(source, true));
3479 }
3394 return dartEntry; 3480 return dartEntry;
3395 } 3481 }
3396 } 3482 }
3397 3483
3398 /** 3484 /**
3399 * Return a list containing all of the change notices that are waiting to be 3485 * Return a list containing all of the change notices that are waiting to be
3400 * returned. If there are no notices, then return either `null` or an empty 3486 * returned. If there are no notices, then return either `null` or an empty
3401 * list, depending on the value of [nullIfEmpty]. 3487 * list, depending on the value of [nullIfEmpty].
3402 */ 3488 */
3403 List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) { 3489 List<ChangeNotice> _getChangeNotices(bool nullIfEmpty) {
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
3685 _accessedAst(source); 3771 _accessedAst(source);
3686 } 3772 }
3687 return htmlEntry.getValue(descriptor); 3773 return htmlEntry.getValue(descriptor);
3688 } 3774 }
3689 3775
3690 /** 3776 /**
3691 * Look at the given [source] to see whether a task needs to be performed 3777 * Look at the given [source] to see whether a task needs to be performed
3692 * related to it. Return the task that should be performed, or `null` if there 3778 * related to it. Return the task that should be performed, or `null` if there
3693 * is no more work to be done for the source. 3779 * is no more work to be done for the source.
3694 */ 3780 */
3695 AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, 3781 AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(
3696 SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, 3782 Source source,
3783 SourceEntry sourceEntry,
3784 bool isPriority,
3785 bool hintsEnabled,
3697 bool lintsEnabled) { 3786 bool lintsEnabled) {
3698 // Refuse to generate tasks for html based files that are above 1500 KB 3787 // Refuse to generate tasks for html based files that are above 1500 KB
3699 if (_isTooBigHtmlSourceEntry(source, sourceEntry)) { 3788 if (_isTooBigHtmlSourceEntry(source, sourceEntry)) {
3700 // TODO (jwren) we still need to report an error of some kind back to the 3789 // TODO (jwren) we still need to report an error of some kind back to the
3701 // client. 3790 // client.
3702 return new AnalysisContextImpl_TaskData(null, false); 3791 return new AnalysisContextImpl_TaskData(null, false);
3703 } 3792 }
3704 if (sourceEntry == null) { 3793 if (sourceEntry == null) {
3705 return new AnalysisContextImpl_TaskData(null, false); 3794 return new AnalysisContextImpl_TaskData(null, false);
3706 } 3795 }
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
3876 * the library defined by the given [librarySource], or `null` if the 3965 * the library defined by the given [librarySource], or `null` if the
3877 * information is not cached. 3966 * information is not cached.
3878 */ 3967 */
3879 TimestampedData<CompilationUnit> _getResolvedUnit( 3968 TimestampedData<CompilationUnit> _getResolvedUnit(
3880 CompilationUnitElement element, Source librarySource) { 3969 CompilationUnitElement element, Source librarySource) {
3881 SourceEntry sourceEntry = _cache.get(element.source); 3970 SourceEntry sourceEntry = _cache.get(element.source);
3882 if (sourceEntry is DartEntry) { 3971 if (sourceEntry is DartEntry) {
3883 DartEntry dartEntry = sourceEntry; 3972 DartEntry dartEntry = sourceEntry;
3884 if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) == 3973 if (dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource) ==
3885 CacheState.VALID) { 3974 CacheState.VALID) {
3886 return new TimestampedData<CompilationUnit>(dartEntry.modificationTime, 3975 return new TimestampedData<CompilationUnit>(
3976 dartEntry.modificationTime,
3887 dartEntry.getValueInLibrary( 3977 dartEntry.getValueInLibrary(
3888 DartEntry.RESOLVED_UNIT, librarySource)); 3978 DartEntry.RESOLVED_UNIT, librarySource));
3889 } 3979 }
3890 } 3980 }
3891 return null; 3981 return null;
3892 } 3982 }
3893 3983
3894 /** 3984 /**
3895 * Return a list containing all of the sources known to this context that have 3985 * Return a list containing all of the sources known to this context that have
3896 * the given [kind]. 3986 * the given [kind].
3897 */ 3987 */
3898 List<Source> _getSources(SourceKind kind) { 3988 List<Source> _getSources(SourceKind kind) {
3899 List<Source> sources = new List<Source>(); 3989 List<Source> sources = new List<Source>();
3900 MapIterator<Source, SourceEntry> iterator = _cache.iterator(); 3990 MapIterator<Source, SourceEntry> iterator = _cache.iterator();
3901 while (iterator.moveNext()) { 3991 while (iterator.moveNext()) {
3902 if (iterator.value.kind == kind) { 3992 if (iterator.value.kind == kind) {
3903 sources.add(iterator.key); 3993 sources.add(iterator.key);
3904 } 3994 }
3905 } 3995 }
3906 return sources; 3996 return sources;
3907 } 3997 }
3908 3998
3909 /** 3999 /**
3910 * Look at the given [source] to see whether a task needs to be performed 4000 * Look at the given [source] to see whether a task needs to be performed
3911 * related to it. If so, add the source to the set of sources that need to be 4001 * related to it. If so, add the source to the set of sources that need to be
3912 * processed. This method duplicates, and must therefore be kept in sync with, 4002 * processed. This method duplicates, and must therefore be kept in sync with,
3913 * [_getNextAnalysisTaskForSource]. This method is intended to be used for 4003 * [_getNextAnalysisTaskForSource]. This method is intended to be used for
3914 * testing purposes only. 4004 * testing purposes only.
3915 */ 4005 */
3916 void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, 4006 void _getSourcesNeedingProcessing(
3917 bool isPriority, bool hintsEnabled, bool lintsEnabled, 4007 Source source,
4008 SourceEntry sourceEntry,
4009 bool isPriority,
4010 bool hintsEnabled,
4011 bool lintsEnabled,
3918 HashSet<Source> sources) { 4012 HashSet<Source> sources) {
3919 if (sourceEntry is DartEntry) { 4013 if (sourceEntry is DartEntry) {
3920 DartEntry dartEntry = sourceEntry; 4014 DartEntry dartEntry = sourceEntry;
3921 CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS); 4015 CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
3922 if (scanErrorsState == CacheState.INVALID || 4016 if (scanErrorsState == CacheState.INVALID ||
3923 (isPriority && scanErrorsState == CacheState.FLUSHED)) { 4017 (isPriority && scanErrorsState == CacheState.FLUSHED)) {
3924 sources.add(source); 4018 sources.add(source);
3925 return; 4019 return;
3926 } 4020 }
3927 CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS); 4021 CacheState parseErrorsState = dartEntry.getState(DartEntry.PARSE_ERRORS);
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
4094 if (_isClient(exported, htmlSource, visitedLibraries)) { 4188 if (_isClient(exported, htmlSource, visitedLibraries)) {
4095 return true; 4189 return true;
4096 } 4190 }
4097 } 4191 }
4098 return false; 4192 return false;
4099 } 4193 }
4100 4194
4101 bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) => 4195 bool _isTooBigHtmlSourceEntry(Source source, SourceEntry sourceEntry) =>
4102 false; 4196 false;
4103 4197
4104 /**
4105 * Log the given debugging [message].
4106 */
4107 void _logInformation(String message) {
4108 AnalysisEngine.instance.logger.logInformation(message);
4109 }
4110
4111 // /** 4198 // /**
4112 // * Notify all of the analysis listeners that the given source is no longer i ncluded in the set of 4199 // * Notify all of the analysis listeners that the given source is no longer i ncluded in the set of
4113 // * sources that are being analyzed. 4200 // * sources that are being analyzed.
4114 // * 4201 // *
4115 // * @param source the source that is no longer being analyzed 4202 // * @param source the source that is no longer being analyzed
4116 // */ 4203 // */
4117 // void _notifyExcludedSource(Source source) { 4204 // void _notifyExcludedSource(Source source) {
4118 // int count = _listeners.length; 4205 // int count = _listeners.length;
4119 // for (int i = 0; i < count; i++) { 4206 // for (int i = 0; i < count; i++) {
4120 // _listeners[i].excludedSource(this, source); 4207 // _listeners[i].excludedSource(this, source);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
4180 // * @param unit the result of resolving the source 4267 // * @param unit the result of resolving the source
4181 // */ 4268 // */
4182 // void _notifyResolvedHtml(Source source, ht.HtmlUnit unit) { 4269 // void _notifyResolvedHtml(Source source, ht.HtmlUnit unit) {
4183 // int count = _listeners.length; 4270 // int count = _listeners.length;
4184 // for (int i = 0; i < count; i++) { 4271 // for (int i = 0; i < count; i++) {
4185 // _listeners[i].resolvedHtml(this, source, unit); 4272 // _listeners[i].resolvedHtml(this, source, unit);
4186 // } 4273 // }
4187 // } 4274 // }
4188 4275
4189 /** 4276 /**
4277 * Log the given debugging [message].
4278 */
4279 void _logInformation(String message) {
4280 AnalysisEngine.instance.logger.logInformation(message);
4281 }
4282
4283 /**
4190 * Notify all of the analysis listeners that a task is about to be performed. 4284 * Notify all of the analysis listeners that a task is about to be performed.
4191 */ 4285 */
4192 void _notifyAboutToPerformTask(String taskDescription) { 4286 void _notifyAboutToPerformTask(String taskDescription) {
4193 int count = _listeners.length; 4287 int count = _listeners.length;
4194 for (int i = 0; i < count; i++) { 4288 for (int i = 0; i < count; i++) {
4195 _listeners[i].aboutToPerformTask(this, taskDescription); 4289 _listeners[i].aboutToPerformTask(this, taskDescription);
4196 } 4290 }
4197 } 4291 }
4198 4292
4199 /** 4293 /**
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
4562 LineInfo lineInfo = task.lineInfo; 4656 LineInfo lineInfo = task.lineInfo;
4563 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo); 4657 dartEntry.setValue(SourceEntry.LINE_INFO, lineInfo);
4564 dartEntry.setValue(DartEntry.TOKEN_STREAM, task.tokenStream); 4658 dartEntry.setValue(DartEntry.TOKEN_STREAM, task.tokenStream);
4565 dartEntry.setValue(DartEntry.SCAN_ERRORS, task.errors); 4659 dartEntry.setValue(DartEntry.SCAN_ERRORS, task.errors);
4566 _cache.storedAst(source); 4660 _cache.storedAst(source);
4567 ChangeNoticeImpl notice = getNotice(source); 4661 ChangeNoticeImpl notice = getNotice(source);
4568 notice.setErrors(dartEntry.allErrors, lineInfo); 4662 notice.setErrors(dartEntry.allErrors, lineInfo);
4569 return dartEntry; 4663 return dartEntry;
4570 } 4664 }
4571 4665
4666 void _removeFromCache(Source source) {
4667 SourceEntry entry = _cache.remove(source);
4668 if (entry != null && !entry.explicitlyAdded) {
4669 _implicitAnalysisEventsController
4670 .add(new ImplicitAnalysisEvent(source, false));
4671 }
4672 }
4673
4572 /** 4674 /**
4573 * Remove the given [librarySource] from the list of containing libraries for 4675 * Remove the given [librarySource] from the list of containing libraries for
4574 * all of the parts referenced by the given [dartEntry]. 4676 * all of the parts referenced by the given [dartEntry].
4575 */ 4677 */
4576 void _removeFromParts(Source librarySource, DartEntry dartEntry) { 4678 void _removeFromParts(Source librarySource, DartEntry dartEntry) {
4577 List<Source> oldParts = dartEntry.getValue(DartEntry.INCLUDED_PARTS); 4679 List<Source> oldParts = dartEntry.getValue(DartEntry.INCLUDED_PARTS);
4578 for (int i = 0; i < oldParts.length; i++) { 4680 for (int i = 0; i < oldParts.length; i++) {
4579 Source partSource = oldParts[i]; 4681 Source partSource = oldParts[i];
4580 DartEntry partEntry = _getReadableDartEntry(partSource); 4682 DartEntry partEntry = _getReadableDartEntry(partSource);
4581 if (partEntry != null && !identical(partEntry, dartEntry)) { 4683 if (partEntry != null && !identical(partEntry, dartEntry)) {
4582 partEntry.removeContainingLibrary(librarySource); 4684 partEntry.removeContainingLibrary(librarySource);
4583 if (partEntry.containingLibraries.length == 0 && !exists(partSource)) { 4685 if (partEntry.containingLibraries.length == 0 && !exists(partSource)) {
4584 _cache.remove(partSource); 4686 _removeFromCache(partSource);
4585 } 4687 }
4586 } 4688 }
4587 } 4689 }
4588 } 4690 }
4589 4691
4590 /** 4692 /**
4591 * Remove the given libraries that are keys in the given map from the list of 4693 * Remove the given libraries that are keys in the given map from the list of
4592 * containing libraries for each of the parts in the corresponding value. 4694 * containing libraries for each of the parts in the corresponding value.
4593 */ 4695 */
4594 void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) { 4696 void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) {
4595 oldPartMap.forEach((Source librarySource, List<Source> oldParts) { 4697 oldPartMap.forEach((Source librarySource, List<Source> oldParts) {
4596 for (int i = 0; i < oldParts.length; i++) { 4698 for (int i = 0; i < oldParts.length; i++) {
4597 Source partSource = oldParts[i]; 4699 Source partSource = oldParts[i];
4598 if (partSource != librarySource) { 4700 if (partSource != librarySource) {
4599 DartEntry partEntry = _getReadableDartEntry(partSource); 4701 DartEntry partEntry = _getReadableDartEntry(partSource);
4600 if (partEntry != null) { 4702 if (partEntry != null) {
4601 partEntry.removeContainingLibrary(librarySource); 4703 partEntry.removeContainingLibrary(librarySource);
4602 if (partEntry.containingLibraries.length == 0 && 4704 if (partEntry.containingLibraries.length == 0 &&
4603 !exists(partSource)) { 4705 !exists(partSource)) {
4604 _cache.remove(partSource); 4706 _removeFromCache(partSource);
4605 } 4707 }
4606 } 4708 }
4607 } 4709 }
4608 } 4710 }
4609 }); 4711 });
4610 } 4712 }
4611 4713
4612 /** 4714 /**
4613 * Remove the given [source] from the priority order if it is in the list. 4715 * Remove the given [source] from the priority order if it is in the list.
4614 */ 4716 */
4615 void _removeFromPriorityOrder(Source source) { 4717 void _removeFromPriorityOrder(Source source) {
4616 int count = _priorityOrder.length; 4718 int count = _priorityOrder.length;
4617 List<Source> newOrder = new List<Source>(); 4719 List<Source> newOrder = new List<Source>();
4618 for (int i = 0; i < count; i++) { 4720 for (int i = 0; i < count; i++) {
4619 if (_priorityOrder[i] != source) { 4721 if (_priorityOrder[i] != source) {
4620 newOrder.add(_priorityOrder[i]); 4722 newOrder.add(_priorityOrder[i]);
4621 } 4723 }
4622 } 4724 }
4623 if (newOrder.length < count) { 4725 if (newOrder.length < count) {
4624 analysisPriorityOrder = newOrder; 4726 analysisPriorityOrder = newOrder;
4625 } 4727 }
4626 } 4728 }
4627 4729
4628 /** 4730 /**
4629 * Create an entry for the newly added [source] and invalidate any sources 4731 * Create an entry for the newly added [source] and invalidate any sources
4630 * that referenced the source before it existed. 4732 * that referenced the source before it existed.
4631 */ 4733 */
4632 void _sourceAvailable(Source source) { 4734 void _sourceAvailable(Source source) {
4735 // TODO(brianwilkerson) This method needs to check whether the source was
4736 // previously being implicitly analyzed. If so, the cache entry needs to be
4737 // update to reflect the new status and an event needs to be generated to
4738 // inform clients that it is no longer being implicitly analyzed.
4633 SourceEntry sourceEntry = _cache.get(source); 4739 SourceEntry sourceEntry = _cache.get(source);
4634 if (sourceEntry == null) { 4740 if (sourceEntry == null) {
4635 sourceEntry = _createSourceEntry(source, true); 4741 sourceEntry = _createSourceEntry(source, true);
4636 } else { 4742 } else {
4637 _propagateInvalidation(source, sourceEntry); 4743 _propagateInvalidation(source, sourceEntry);
4638 sourceEntry = _cache.get(source); 4744 sourceEntry = _cache.get(source);
4639 } 4745 }
4640 if (sourceEntry is HtmlEntry) { 4746 if (sourceEntry is HtmlEntry) {
4641 _workManager.add(source, SourcePriority.HTML); 4747 _workManager.add(source, SourcePriority.HTML);
4642 } else if (sourceEntry is DartEntry) { 4748 } else if (sourceEntry is DartEntry) {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
4711 libraries.add(librarySource); 4817 libraries.add(librarySource);
4712 for (Source dependentLibrary 4818 for (Source dependentLibrary
4713 in getLibrariesDependingOn(librarySource)) { 4819 in getLibrariesDependingOn(librarySource)) {
4714 libraries.add(dependentLibrary); 4820 libraries.add(dependentLibrary);
4715 } 4821 }
4716 } 4822 }
4717 for (Source librarySource in libraries) { 4823 for (Source librarySource in libraries) {
4718 _invalidateLibraryResolution(librarySource); 4824 _invalidateLibraryResolution(librarySource);
4719 } 4825 }
4720 } 4826 }
4721 _cache.remove(source); 4827 _removeFromCache(source);
4722 _workManager.remove(source); 4828 _workManager.remove(source);
4723 _removeFromPriorityOrder(source); 4829 _removeFromPriorityOrder(source);
4724 } 4830 }
4725 4831
4726 /** 4832 /**
4727 * TODO(scheglov) A hackish, limited incremental resolution implementation. 4833 * TODO(scheglov) A hackish, limited incremental resolution implementation.
4728 */ 4834 */
4729 bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) { 4835 bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
4730 return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() { 4836 return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
4731 incrementalResolutionValidation_lastUnitSource = null; 4837 incrementalResolutionValidation_lastUnitSource = null;
(...skipping 17 matching lines...) Expand all
4749 } 4855 }
4750 // prepare the existing unit 4856 // prepare the existing unit
4751 CompilationUnit oldUnit = 4857 CompilationUnit oldUnit =
4752 getResolvedCompilationUnit2(unitSource, librarySource); 4858 getResolvedCompilationUnit2(unitSource, librarySource);
4753 if (oldUnit == null) { 4859 if (oldUnit == null) {
4754 return false; 4860 return false;
4755 } 4861 }
4756 // do resolution 4862 // do resolution
4757 Stopwatch perfCounter = new Stopwatch()..start(); 4863 Stopwatch perfCounter = new Stopwatch()..start();
4758 PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver( 4864 PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
4759 typeProvider, unitSource, getReadableSourceEntryOrNull(unitSource), 4865 typeProvider,
4760 null, null, oldUnit, analysisOptions.incrementalApi, analysisOptions); 4866 unitSource,
4867 getReadableSourceEntryOrNull(unitSource),
4868 null,
4869 null,
4870 oldUnit,
4871 analysisOptions.incrementalApi);
4761 bool success = resolver.resolve(newCode); 4872 bool success = resolver.resolve(newCode);
4762 AnalysisEngine.instance.instrumentationService.logPerformance( 4873 AnalysisEngine.instance.instrumentationService.logPerformance(
4763 AnalysisPerformanceKind.INCREMENTAL, perfCounter, 4874 AnalysisPerformanceKind.INCREMENTAL,
4875 perfCounter,
4764 'success=$success,context_id=$_id,code_length=${newCode.length}'); 4876 'success=$success,context_id=$_id,code_length=${newCode.length}');
4765 if (!success) { 4877 if (!success) {
4766 return false; 4878 return false;
4767 } 4879 }
4768 // if validation, remember the result, but throw it away 4880 // if validation, remember the result, but throw it away
4769 if (analysisOptions.incrementalValidation) { 4881 if (analysisOptions.incrementalValidation) {
4770 incrementalResolutionValidation_lastUnitSource = oldUnit.element.source; 4882 incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
4771 incrementalResolutionValidation_lastLibrarySource = 4883 incrementalResolutionValidation_lastLibrarySource =
4772 oldUnit.element.library.source; 4884 oldUnit.element.library.source;
4773 incrementalResolutionValidation_lastUnit = oldUnit; 4885 incrementalResolutionValidation_lastUnit = oldUnit;
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
4973 _librariesInCycle = _dependencyGraph.findCycleContaining(targetLibrary); 5085 _librariesInCycle = _dependencyGraph.findCycleContaining(targetLibrary);
4974 // 5086 //
4975 // Ensure that all of the data needed to resolve them has been computed. 5087 // Ensure that all of the data needed to resolve them has been computed.
4976 // 5088 //
4977 _ensureImportsAndExports(); 5089 _ensureImportsAndExports();
4978 if (_taskData != null) { 5090 if (_taskData != null) {
4979 // At least one imported library needs to be resolved before the target 5091 // At least one imported library needs to be resolved before the target
4980 // library. 5092 // library.
4981 AnalysisTask task = _taskData.task; 5093 AnalysisTask task = _taskData.task;
4982 if (task is ResolveDartLibraryTask) { 5094 if (task is ResolveDartLibraryTask) {
4983 AnalysisContextImpl_this._workManager.addFirst( 5095 AnalysisContextImpl_this._workManager
4984 task.librarySource, SourcePriority.LIBRARY); 5096 .addFirst(task.librarySource, SourcePriority.LIBRARY);
4985 } 5097 }
4986 return; 5098 return;
4987 } 5099 }
4988 _computePartsInCycle(librarySource); 5100 _computePartsInCycle(librarySource);
4989 if (_taskData != null) { 5101 if (_taskData != null) {
4990 // At least one part needs to be parsed. 5102 // At least one part needs to be parsed.
4991 return; 5103 return;
4992 } 5104 }
4993 // All of the AST's necessary to perform a resolution of the library cycle 5105 // All of the AST's necessary to perform a resolution of the library cycle
4994 // have been gathered, so it is no longer necessary to retain them in the 5106 // have been gathered, so it is no longer necessary to retain them in the
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
5202 * Ensure that the given [library] has an element model built for it. If 5314 * Ensure that the given [library] has an element model built for it. If
5203 * another task needs to be executed first in order to build the element 5315 * another task needs to be executed first in order to build the element
5204 * model, that task is placed in [taskData]. 5316 * model, that task is placed in [taskData].
5205 */ 5317 */
5206 void _ensureElementModel(ResolvableLibrary library) { 5318 void _ensureElementModel(ResolvableLibrary library) {
5207 Source librarySource = library.librarySource; 5319 Source librarySource = library.librarySource;
5208 DartEntry libraryEntry = 5320 DartEntry libraryEntry =
5209 AnalysisContextImpl_this._getReadableDartEntry(librarySource); 5321 AnalysisContextImpl_this._getReadableDartEntry(librarySource);
5210 if (libraryEntry != null && 5322 if (libraryEntry != null &&
5211 libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) { 5323 libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
5212 AnalysisContextImpl_this._workManager.addFirst( 5324 AnalysisContextImpl_this._workManager
5213 librarySource, SourcePriority.LIBRARY); 5325 .addFirst(librarySource, SourcePriority.LIBRARY);
5214 if (_taskData == null) { 5326 if (_taskData == null) {
5215 _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask( 5327 _taskData = AnalysisContextImpl_this._createResolveDartLibraryTask(
5216 librarySource, libraryEntry); 5328 librarySource, libraryEntry);
5217 } 5329 }
5218 } 5330 }
5219 } 5331 }
5220 5332
5221 /** 5333 /**
5222 * Ensure that all of the libraries that are exported by the given [library] 5334 * Ensure that all of the libraries that are exported by the given [library]
5223 * (but are not themselves in the cycle) have element models built for them. 5335 * (but are not themselves in the cycle) have element models built for them.
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after
5785 */ 5897 */
5786 bool useTaskModel = false; 5898 bool useTaskModel = false;
5787 5899
5788 /** 5900 /**
5789 * A flag indicating whether the task model should attempt to limit 5901 * A flag indicating whether the task model should attempt to limit
5790 * invalidation after a change. 5902 * invalidation after a change.
5791 */ 5903 */
5792 bool limitInvalidationInTaskModel = false; 5904 bool limitInvalidationInTaskModel = false;
5793 5905
5794 /** 5906 /**
5907 * The plugins that are defined outside the `analyzer` package.
5908 */
5909 List<Plugin> _userDefinedPlugins = <Plugin>[];
5910
5911 /**
5795 * The task manager used to manage the tasks used to analyze code. 5912 * The task manager used to manage the tasks used to analyze code.
5796 */ 5913 */
5797 TaskManager _taskManager; 5914 TaskManager _taskManager;
5798 5915
5799 AnalysisEngine._(); 5916 AnalysisEngine._();
5800 5917
5801 /** 5918 /**
5802 * Return the instrumentation service that is to be used by this analysis 5919 * Return the instrumentation service that is to be used by this analysis
5803 * engine. 5920 * engine.
5804 */ 5921 */
(...skipping 28 matching lines...) Expand all
5833 /** 5950 /**
5834 * Return the list of supported plugins for processing by clients. 5951 * Return the list of supported plugins for processing by clients.
5835 */ 5952 */
5836 List<Plugin> get supportedPlugins { 5953 List<Plugin> get supportedPlugins {
5837 if (_supportedPlugins == null) { 5954 if (_supportedPlugins == null) {
5838 _supportedPlugins = <Plugin>[ 5955 _supportedPlugins = <Plugin>[
5839 enginePlugin, 5956 enginePlugin,
5840 commandLinePlugin, 5957 commandLinePlugin,
5841 optionsPlugin 5958 optionsPlugin
5842 ]; 5959 ];
5960 _supportedPlugins.addAll(_userDefinedPlugins);
5843 } 5961 }
5844 return _supportedPlugins; 5962 return _supportedPlugins;
5845 } 5963 }
5846 5964
5847 /** 5965 /**
5848 * Return the task manager used to manage the tasks used to analyze code. 5966 * Return the task manager used to manage the tasks used to analyze code.
5849 */ 5967 */
5850 TaskManager get taskManager { 5968 TaskManager get taskManager {
5851 if (_taskManager == null) { 5969 if (_taskManager == null) {
5852 if (enginePlugin.taskExtensionPoint == null) { 5970 new ExtensionManager().processPlugins(supportedPlugins);
5853 // The plugin wasn't used, so tasks are not registered.
5854 new ExtensionManager().processPlugins([enginePlugin]);
5855 }
5856 _taskManager = new TaskManager(); 5971 _taskManager = new TaskManager();
5857 _taskManager.addTaskDescriptors(enginePlugin.taskDescriptors); 5972 _taskManager.addTaskDescriptors(enginePlugin.taskDescriptors);
5858 // TODO(brianwilkerson) Create a way to associate different results with 5973 // TODO(brianwilkerson) Create a way to associate different results with
5859 // different file suffixes, then make this pluggable. 5974 // different file suffixes, then make this pluggable.
5860 _taskManager.addGeneralResult(DART_ERRORS); 5975 _taskManager.addGeneralResult(DART_ERRORS);
5861 } 5976 }
5862 return _taskManager; 5977 return _taskManager;
5863 } 5978 }
5864 5979
5865 /** 5980 /**
5981 * Set plugins that are defined outside the `analyzer` package.
5982 */
5983 void set userDefinedPlugins(List<Plugin> plugins) {
5984 if (plugins == null) {
5985 plugins = <Plugin>[];
5986 }
5987 _userDefinedPlugins = plugins;
5988 _supportedPlugins = null;
5989 _taskManager = null;
5990 }
5991
5992 /**
5866 * Clear any caches holding on to analysis results so that a full re-analysis 5993 * Clear any caches holding on to analysis results so that a full re-analysis
5867 * will be performed the next time an analysis context is created. 5994 * will be performed the next time an analysis context is created.
5868 */ 5995 */
5869 void clearCaches() { 5996 void clearCaches() {
5870 partitionManager.clearCache(); 5997 partitionManager.clearCache();
5871 } 5998 }
5872 5999
5873 /** 6000 /**
5874 * Create and return a new context in which analysis can be performed. 6001 * Create and return a new context in which analysis can be performed.
5875 */ 6002 */
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
6102 @deprecated // Always true 6229 @deprecated // Always true
6103 bool get enableNullAwareOperators; 6230 bool get enableNullAwareOperators;
6104 6231
6105 /** 6232 /**
6106 * Return `true` to strictly follow the specification when generating 6233 * Return `true` to strictly follow the specification when generating
6107 * warnings on "call" methods (fixes dartbug.com/21938). 6234 * warnings on "call" methods (fixes dartbug.com/21938).
6108 */ 6235 */
6109 bool get enableStrictCallChecks; 6236 bool get enableStrictCallChecks;
6110 6237
6111 /** 6238 /**
6239 * Return `true` if mixins are allowed to inherit from types other than
6240 * Object, and are allowed to reference `super`.
6241 */
6242 bool get enableSuperMixins;
6243
6244 /**
6112 * Return `true` if errors, warnings and hints should be generated for sources 6245 * Return `true` if errors, warnings and hints should be generated for sources
6113 * that are implicitly being analyzed. The default value is `true`. 6246 * that are implicitly being analyzed. The default value is `true`.
6114 */ 6247 */
6115 bool get generateImplicitErrors; 6248 bool get generateImplicitErrors;
6116 6249
6117 /** 6250 /**
6118 * Return `true` if errors, warnings and hints should be generated for sources 6251 * Return `true` if errors, warnings and hints should be generated for sources
6119 * in the SDK. The default value is `false`. 6252 * in the SDK. The default value is `false`.
6120 */ 6253 */
6121 bool get generateSdkErrors; 6254 bool get generateSdkErrors;
(...skipping 23 matching lines...) Expand all
6145 6278
6146 /** 6279 /**
6147 * Return `true` if analysis is to generate lint warnings. 6280 * Return `true` if analysis is to generate lint warnings.
6148 */ 6281 */
6149 bool get lint; 6282 bool get lint;
6150 6283
6151 /** 6284 /**
6152 * Return `true` if analysis is to parse comments. 6285 * Return `true` if analysis is to parse comments.
6153 */ 6286 */
6154 bool get preserveComments; 6287 bool get preserveComments;
6288
6289 /**
6290 * Return `true` if strong mode analysis should be used.
6291 */
6292 bool get strongMode;
6155 } 6293 }
6156 6294
6157 /** 6295 /**
6158 * A set of analysis options used to control the behavior of an analysis 6296 * A set of analysis options used to control the behavior of an analysis
6159 * context. 6297 * context.
6160 */ 6298 */
6161 class AnalysisOptionsImpl implements AnalysisOptions { 6299 class AnalysisOptionsImpl implements AnalysisOptions {
6162 /** 6300 /**
6163 * The maximum number of sources for which data should be kept in the cache. 6301 * The maximum number of sources for which data should be kept in the cache.
6164 */ 6302 */
(...skipping 21 matching lines...) Expand all
6186 /** 6324 /**
6187 * The maximum number of sources for which AST structures should be kept in 6325 * The maximum number of sources for which AST structures should be kept in
6188 * the cache. 6326 * the cache.
6189 */ 6327 */
6190 int cacheSize = DEFAULT_CACHE_SIZE; 6328 int cacheSize = DEFAULT_CACHE_SIZE;
6191 6329
6192 /** 6330 /**
6193 * A flag indicating whether analysis is to generate dart2js related hint 6331 * A flag indicating whether analysis is to generate dart2js related hint
6194 * results. 6332 * results.
6195 */ 6333 */
6196 bool dart2jsHint = true; 6334 bool dart2jsHint = false;
6197 6335
6198 /** 6336 /**
6199 * A flag indicating whether generic methods are to be supported (DEP 22). 6337 * A flag indicating whether generic methods are to be supported (DEP 22).
6200 */ 6338 */
6201 bool enableGenericMethods = false; 6339 bool enableGenericMethods = false;
6202 6340
6203 /** 6341 /**
6204 * A flag indicating whether analysis is to strictly follow the specification 6342 * A flag indicating whether analysis is to strictly follow the specification
6205 * when generating warnings on "call" methods (fixes dartbug.com/21938). 6343 * when generating warnings on "call" methods (fixes dartbug.com/21938).
6206 */ 6344 */
6207 bool enableStrictCallChecks = false; 6345 bool enableStrictCallChecks = false;
6208 6346
6209 /** 6347 /**
6348 * A flag indicating whether mixins are allowed to inherit from types other
6349 * than Object, and are allowed to reference `super`.
6350 */
6351 bool enableSuperMixins = false;
6352
6353 /**
6210 * A flag indicating whether errors, warnings and hints should be generated 6354 * A flag indicating whether errors, warnings and hints should be generated
6211 * for sources that are implicitly being analyzed. 6355 * for sources that are implicitly being analyzed.
6212 */ 6356 */
6213 bool generateImplicitErrors = true; 6357 bool generateImplicitErrors = true;
6214 6358
6215 /** 6359 /**
6216 * A flag indicating whether errors, warnings and hints should be generated 6360 * A flag indicating whether errors, warnings and hints should be generated
6217 * for sources in the SDK. 6361 * for sources in the SDK.
6218 */ 6362 */
6219 bool generateSdkErrors = false; 6363 bool generateSdkErrors = false;
(...skipping 25 matching lines...) Expand all
6245 * A flag indicating whether analysis is to generate lint warnings. 6389 * A flag indicating whether analysis is to generate lint warnings.
6246 */ 6390 */
6247 bool lint = false; 6391 bool lint = false;
6248 6392
6249 /** 6393 /**
6250 * A flag indicating whether analysis is to parse comments. 6394 * A flag indicating whether analysis is to parse comments.
6251 */ 6395 */
6252 bool preserveComments = true; 6396 bool preserveComments = true;
6253 6397
6254 /** 6398 /**
6399 * A flag indicating whether strong-mode analysis should be used.
6400 */
6401 bool strongMode = false;
6402
6403 /**
6255 * Initialize a newly created set of analysis options to have their default 6404 * Initialize a newly created set of analysis options to have their default
6256 * values. 6405 * values.
6257 */ 6406 */
6258 AnalysisOptionsImpl(); 6407 AnalysisOptionsImpl();
6259 6408
6260 /** 6409 /**
6261 * Initialize a newly created set of analysis options to have the same values 6410 * Initialize a newly created set of analysis options to have the same values
6262 * as those in the given set of analysis [options]. 6411 * as those in the given set of analysis [options].
6263 */ 6412 */
6264 @deprecated // Use new AnalysisOptionsImpl.from(options) 6413 @deprecated // Use new AnalysisOptionsImpl.from(options)
6265 AnalysisOptionsImpl.con1(AnalysisOptions options) { 6414 AnalysisOptionsImpl.con1(AnalysisOptions options) {
6266 analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate; 6415 analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
6267 cacheSize = options.cacheSize; 6416 cacheSize = options.cacheSize;
6268 dart2jsHint = options.dart2jsHint; 6417 dart2jsHint = options.dart2jsHint;
6269 enableStrictCallChecks = options.enableStrictCallChecks; 6418 enableStrictCallChecks = options.enableStrictCallChecks;
6419 enableSuperMixins = options.enableSuperMixins;
6270 generateImplicitErrors = options.generateImplicitErrors; 6420 generateImplicitErrors = options.generateImplicitErrors;
6271 generateSdkErrors = options.generateSdkErrors; 6421 generateSdkErrors = options.generateSdkErrors;
6272 hint = options.hint; 6422 hint = options.hint;
6273 incremental = options.incremental; 6423 incremental = options.incremental;
6274 incrementalApi = options.incrementalApi; 6424 incrementalApi = options.incrementalApi;
6275 incrementalValidation = options.incrementalValidation; 6425 incrementalValidation = options.incrementalValidation;
6276 lint = options.lint; 6426 lint = options.lint;
6277 preserveComments = options.preserveComments; 6427 preserveComments = options.preserveComments;
6428 strongMode = options.strongMode;
6278 } 6429 }
6279 6430
6280 /** 6431 /**
6281 * Initialize a newly created set of analysis options to have the same values 6432 * Initialize a newly created set of analysis options to have the same values
6282 * as those in the given set of analysis [options]. 6433 * as those in the given set of analysis [options].
6283 */ 6434 */
6284 AnalysisOptionsImpl.from(AnalysisOptions options) { 6435 AnalysisOptionsImpl.from(AnalysisOptions options) {
6285 analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate; 6436 analyzeFunctionBodiesPredicate = options.analyzeFunctionBodiesPredicate;
6286 cacheSize = options.cacheSize; 6437 cacheSize = options.cacheSize;
6287 dart2jsHint = options.dart2jsHint; 6438 dart2jsHint = options.dart2jsHint;
6288 enableStrictCallChecks = options.enableStrictCallChecks; 6439 enableStrictCallChecks = options.enableStrictCallChecks;
6440 enableSuperMixins = options.enableSuperMixins;
6289 generateImplicitErrors = options.generateImplicitErrors; 6441 generateImplicitErrors = options.generateImplicitErrors;
6290 generateSdkErrors = options.generateSdkErrors; 6442 generateSdkErrors = options.generateSdkErrors;
6291 hint = options.hint; 6443 hint = options.hint;
6292 incremental = options.incremental; 6444 incremental = options.incremental;
6293 incrementalApi = options.incrementalApi; 6445 incrementalApi = options.incrementalApi;
6294 incrementalValidation = options.incrementalValidation; 6446 incrementalValidation = options.incrementalValidation;
6295 lint = options.lint; 6447 lint = options.lint;
6296 preserveComments = options.preserveComments; 6448 preserveComments = options.preserveComments;
6449 strongMode = options.strongMode;
6297 } 6450 }
6298 6451
6299 bool get analyzeFunctionBodies { 6452 bool get analyzeFunctionBodies {
6300 if (identical(analyzeFunctionBodiesPredicate, _analyzeAllFunctionBodies)) { 6453 if (identical(analyzeFunctionBodiesPredicate, _analyzeAllFunctionBodies)) {
6301 return true; 6454 return true;
6302 } else if (identical( 6455 } else if (identical(
6303 analyzeFunctionBodiesPredicate, _analyzeNoFunctionBodies)) { 6456 analyzeFunctionBodiesPredicate, _analyzeNoFunctionBodies)) {
6304 return false; 6457 return false;
6305 } else { 6458 } else {
6306 throw new StateError('analyzeFunctionBodiesPredicate in use'); 6459 throw new StateError('analyzeFunctionBodiesPredicate in use');
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
6494 * Perform this analysis task, ensuring that all exceptions are wrapped in an 6647 * Perform this analysis task, ensuring that all exceptions are wrapped in an
6495 * [AnalysisException]. Throws an [AnalysisException] if any exception occurs 6648 * [AnalysisException]. Throws an [AnalysisException] if any exception occurs
6496 * while performing the task 6649 * while performing the task
6497 */ 6650 */
6498 void _safelyPerform() { 6651 void _safelyPerform() {
6499 try { 6652 try {
6500 String contextName = context.name; 6653 String contextName = context.name;
6501 if (contextName == null) { 6654 if (contextName == null) {
6502 contextName = 'unnamed'; 6655 contextName = 'unnamed';
6503 } 6656 }
6504 AnalysisEngine.instance.instrumentationService.logAnalysisTask( 6657 AnalysisEngine.instance.instrumentationService
6505 contextName, taskDescription); 6658 .logAnalysisTask(contextName, taskDescription);
6506 internalPerform(); 6659 internalPerform();
6507 } on AnalysisException { 6660 } on AnalysisException {
6508 rethrow; 6661 rethrow;
6509 } catch (exception, stackTrace) { 6662 } catch (exception, stackTrace) {
6510 throw new AnalysisException( 6663 throw new AnalysisException(
6511 exception.toString(), new CaughtException(exception, stackTrace)); 6664 exception.toString(), new CaughtException(exception, stackTrace));
6512 } 6665 }
6513 } 6666 }
6514 } 6667 }
6515 6668
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
6653 * it's cached AST structure flushed. 6806 * it's cached AST structure flushed.
6654 */ 6807 */
6655 List<Source> _recentlyUsed; 6808 List<Source> _recentlyUsed;
6656 6809
6657 /** 6810 /**
6658 * Initialize a newly created cache to maintain at most [maxCacheSize] AST 6811 * Initialize a newly created cache to maintain at most [maxCacheSize] AST
6659 * structures in the cache. The cache is owned by the give [context], and the 6812 * structures in the cache. The cache is owned by the give [context], and the
6660 * [retentionPolicy] will be used to determine which pieces of data to remove 6813 * [retentionPolicy] will be used to determine which pieces of data to remove
6661 * from the cache. 6814 * from the cache.
6662 */ 6815 */
6663 CachePartition(this.context, int maxCacheSize, this._retentionPolicy) { 6816 CachePartition(this.context, this._maxCacheSize, this._retentionPolicy) {
6664 this._maxCacheSize = maxCacheSize;
6665 _recentlyUsed = new List<Source>(); 6817 _recentlyUsed = new List<Source>();
6666 } 6818 }
6667 6819
6668 /** 6820 /**
6669 * Return the number of entries in this partition that have an AST associated 6821 * Return the number of entries in this partition that have an AST associated
6670 * with them. 6822 * with them.
6671 */ 6823 */
6672 int get astSize { 6824 int get astSize {
6673 int astSize = 0; 6825 int astSize = 0;
6674 int count = _recentlyUsed.length; 6826 int count = _recentlyUsed.length;
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
6745 6897
6746 /** 6898 /**
6747 * Associate the given [entry] with the given [source]. 6899 * Associate the given [entry] with the given [source].
6748 */ 6900 */
6749 void put(Source source, SourceEntry entry) { 6901 void put(Source source, SourceEntry entry) {
6750 entry.fixExceptionState(); 6902 entry.fixExceptionState();
6751 _sourceMap[source] = entry; 6903 _sourceMap[source] = entry;
6752 } 6904 }
6753 6905
6754 /** 6906 /**
6755 * Remove all information related to the given [source] from this cache. 6907 * Remove all information related to the given [source] from this partition.
6908 * Return the entry associated with the source, or `null` if there was cache
6909 * entry for the source.
6756 */ 6910 */
6757 void remove(Source source) { 6911 SourceEntry remove(Source source) {
6758 _recentlyUsed.remove(source); 6912 _recentlyUsed.remove(source);
6759 _sourceMap.remove(source); 6913 return _sourceMap.remove(source);
6760 } 6914 }
6761 6915
6762 /** 6916 /**
6763 * Record that the AST associated with the given [source] was just removed 6917 * Record that the AST associated with the given [source] was just removed
6764 * from the cache. 6918 * from the cache.
6765 */ 6919 */
6766 void removedAst(Source source) { 6920 void removedAst(Source source) {
6767 _recentlyUsed.remove(source); 6921 _recentlyUsed.remove(source);
6768 } 6922 }
6769 6923
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
7309 7463
7310 /** 7464 /**
7311 * The (source, entry) pairs representing the compilation units in the 7465 * The (source, entry) pairs representing the compilation units in the
7312 * library. 7466 * library.
7313 */ 7467 */
7314 List<CycleBuilder_SourceEntryPair> entryPairs; 7468 List<CycleBuilder_SourceEntryPair> entryPairs;
7315 7469
7316 /** 7470 /**
7317 * Initialize a newly created pair from the given [library] and [entryPairs]. 7471 * Initialize a newly created pair from the given [library] and [entryPairs].
7318 */ 7472 */
7319 CycleBuilder_LibraryPair(ResolvableLibrary library, 7473 CycleBuilder_LibraryPair(this.library, this.entryPairs);
7320 List<CycleBuilder_SourceEntryPair> entryPairs) {
7321 this.library = library;
7322 this.entryPairs = entryPairs;
7323 }
7324 } 7474 }
7325 7475
7326 /** 7476 /**
7327 * A pair containing a source and the cache entry associated with that source. 7477 * A pair containing a source and the cache entry associated with that source.
7328 * They are used to reduce the number of times an entry must be looked up in the 7478 * They are used to reduce the number of times an entry must be looked up in the
7329 * cache. 7479 * cache.
7330 */ 7480 */
7331 class CycleBuilder_SourceEntryPair { 7481 class CycleBuilder_SourceEntryPair {
7332 /** 7482 /**
7333 * The source associated with the entry. 7483 * The source associated with the entry.
7334 */ 7484 */
7335 Source source; 7485 Source source;
7336 7486
7337 /** 7487 /**
7338 * The entry associated with the source. 7488 * The entry associated with the source.
7339 */ 7489 */
7340 DartEntry entry; 7490 DartEntry entry;
7341 7491
7342 /** 7492 /**
7343 * Initialize a newly created pair from the given [source] and [entry]. 7493 * Initialize a newly created pair from the given [source] and [entry].
7344 */ 7494 */
7345 CycleBuilder_SourceEntryPair(Source source, DartEntry entry) { 7495 CycleBuilder_SourceEntryPair(this.source, this.entry);
7346 this.source = source;
7347 this.entry = entry;
7348 }
7349 } 7496 }
7350 7497
7351 /** 7498 /**
7352 * The information cached by an analysis context about an individual Dart file. 7499 * The information cached by an analysis context about an individual Dart file.
7353 */ 7500 */
7354 class DartEntry extends SourceEntry { 7501 class DartEntry extends SourceEntry {
7355 /** 7502 /**
7356 * The data descriptor representing the element model representing a single 7503 * The data descriptor representing the element model representing a single
7357 * compilation unit. This model is incomplete and should not be used except as 7504 * compilation unit. This model is incomplete and should not be used except as
7358 * input to another task. 7505 * input to another task.
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after
8335 // 8482 //
8336 // TODO(paulberry): as a temporary workaround for issue 21572, 8483 // TODO(paulberry): as a temporary workaround for issue 21572,
8337 // ConstantVerifier is being run right after ConstantValueComputer, so we 8484 // ConstantVerifier is being run right after ConstantValueComputer, so we
8338 // don't need to run it here. Once issue 21572 is fixed, re-enable the 8485 // don't need to run it here. Once issue 21572 is fixed, re-enable the
8339 // call to ConstantVerifier. 8486 // call to ConstantVerifier.
8340 // ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, libraryElement, typeProvider); 8487 // ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, libraryElement, typeProvider);
8341 // _unit.accept(constantVerifier); 8488 // _unit.accept(constantVerifier);
8342 // 8489 //
8343 // Use the ErrorVerifier to compute the rest of the errors. 8490 // Use the ErrorVerifier to compute the rest of the errors.
8344 // 8491 //
8345 ErrorVerifier errorVerifier = new ErrorVerifier(errorReporter, 8492 ErrorVerifier errorVerifier = new ErrorVerifier(
8346 libraryElement, typeProvider, new InheritanceManager(libraryElement)); 8493 errorReporter,
8494 libraryElement,
8495 typeProvider,
8496 new InheritanceManager(libraryElement),
8497 context.analysisOptions.enableSuperMixins);
8347 _unit.accept(errorVerifier); 8498 _unit.accept(errorVerifier);
8348 _errors = errorListener.getErrorsForSource(source); 8499 _errors = errorListener.getErrorsForSource(source);
8349 }); 8500 });
8350 } 8501 }
8351 8502
8352 /** 8503 /**
8353 * Check each directive in the given compilation unit to see if the referenced source exists and 8504 * Check each directive in the given compilation unit to see if the referenced source exists and
8354 * report an error if it does not. 8505 * report an error if it does not.
8355 * 8506 *
8356 * @param context the context in which the library exists 8507 * @param context the context in which the library exists
(...skipping 13 matching lines...) Expand all
8370 8521
8371 /** 8522 /**
8372 * Check the given directive to see if the referenced source exists and report an error if it does 8523 * Check the given directive to see if the referenced source exists and report an error if it does
8373 * not. 8524 * not.
8374 * 8525 *
8375 * @param context the context in which the library exists 8526 * @param context the context in which the library exists
8376 * @param librarySource the source representing the library containing the dir ective 8527 * @param librarySource the source representing the library containing the dir ective
8377 * @param directive the directive to be verified 8528 * @param directive the directive to be verified
8378 * @param errorListener the error listener to which errors should be reported 8529 * @param errorListener the error listener to which errors should be reported
8379 */ 8530 */
8380 static void validateReferencedSource(AnalysisContext context, 8531 static void validateReferencedSource(
8381 Source librarySource, UriBasedDirective directive, 8532 AnalysisContext context,
8533 Source librarySource,
8534 UriBasedDirective directive,
8382 AnalysisErrorListener errorListener) { 8535 AnalysisErrorListener errorListener) {
8383 Source source = directive.source; 8536 Source source = directive.source;
8384 if (source != null) { 8537 if (source != null) {
8385 if (context.exists(source)) { 8538 if (context.exists(source)) {
8386 return; 8539 return;
8387 } 8540 }
8388 } else { 8541 } else {
8389 // Don't report errors already reported by ParseDartTask.resolveDirective 8542 // Don't report errors already reported by ParseDartTask.resolveDirective
8390 if (directive.validate() != null) { 8543 if (directive.validate() != null) {
8391 return; 8544 return;
8392 } 8545 }
8393 } 8546 }
8394 StringLiteral uriLiteral = directive.uri; 8547 StringLiteral uriLiteral = directive.uri;
8395 errorListener.onError(new AnalysisError(librarySource, uriLiteral.offset, 8548 errorListener.onError(new AnalysisError(
8396 uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, 8549 librarySource,
8550 uriLiteral.offset,
8551 uriLiteral.length,
8552 CompileTimeErrorCode.URI_DOES_NOT_EXIST,
8397 [directive.uriContent])); 8553 [directive.uriContent]));
8398 } 8554 }
8399 } 8555 }
8400 8556
8401 /** 8557 /**
8402 * Instances of the class `GenerateDartHintsTask` generate hints for a single Da rt library. 8558 * Instances of the class `GenerateDartHintsTask` generate hints for a single Da rt library.
8403 */ 8559 */
8404 class GenerateDartHintsTask extends AnalysisTask { 8560 class GenerateDartHintsTask extends AnalysisTask {
8405 /** 8561 /**
8406 * The compilation units that comprise the library, with the defining compilat ion unit appearing 8562 * The compilation units that comprise the library, with the defining compilat ion unit appearing
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
8478 _hintMap = new HashMap<Source, List<AnalysisError>>(); 8634 _hintMap = new HashMap<Source, List<AnalysisError>>();
8479 for (int i = 0; i < unitCount; i++) { 8635 for (int i = 0; i < unitCount; i++) {
8480 Source source = _units[i].data.element.source; 8636 Source source = _units[i].data.element.source;
8481 _hintMap[source] = errorListener.getErrorsForSource(source); 8637 _hintMap[source] = errorListener.getErrorsForSource(source);
8482 } 8638 }
8483 } 8639 }
8484 } 8640 }
8485 8641
8486 /// Generates lint feedback for a single Dart library. 8642 /// Generates lint feedback for a single Dart library.
8487 class GenerateDartLintsTask extends AnalysisTask { 8643 class GenerateDartLintsTask extends AnalysisTask {
8488
8489 ///The compilation units that comprise the library, with the defining 8644 ///The compilation units that comprise the library, with the defining
8490 ///compilation unit appearing first in the list. 8645 ///compilation unit appearing first in the list.
8491 final List<TimestampedData<CompilationUnit>> _units; 8646 final List<TimestampedData<CompilationUnit>> _units;
8492 8647
8493 /// The element model for the library being analyzed. 8648 /// The element model for the library being analyzed.
8494 final LibraryElement libraryElement; 8649 final LibraryElement libraryElement;
8495 8650
8496 /// A mapping of analyzed sources to their associated lint warnings. 8651 /// A mapping of analyzed sources to their associated lint warnings.
8497 /// May be [null] if the task has not been performed or if analysis did not 8652 /// May be [null] if the task has not been performed or if analysis did not
8498 /// complete normally. 8653 /// complete normally.
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
8608 @override 8763 @override
8609 accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this); 8764 accept(AnalysisTaskVisitor visitor) => visitor.visitGetContentTask(this);
8610 8765
8611 @override 8766 @override
8612 void internalPerform() { 8767 void internalPerform() {
8613 _complete = true; 8768 _complete = true;
8614 try { 8769 try {
8615 TimestampedData<String> data = context.getContents(source); 8770 TimestampedData<String> data = context.getContents(source);
8616 _content = data.data; 8771 _content = data.data;
8617 _modificationTime = data.modificationTime; 8772 _modificationTime = data.modificationTime;
8618 AnalysisEngine.instance.instrumentationService.logFileRead( 8773 AnalysisEngine.instance.instrumentationService
8619 source.fullName, _modificationTime, _content); 8774 .logFileRead(source.fullName, _modificationTime, _content);
8620 } catch (exception, stackTrace) { 8775 } catch (exception, stackTrace) {
8621 errors.add(new AnalysisError( 8776 if (source.exists()) {
8622 source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [exception])); 8777 errors.add(new AnalysisError(
8778 source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [exception]));
8779 }
8623 throw new AnalysisException("Could not get contents of $source", 8780 throw new AnalysisException("Could not get contents of $source",
8624 new CaughtException(exception, stackTrace)); 8781 new CaughtException(exception, stackTrace));
8625 } 8782 }
8626 } 8783 }
8627 } 8784 }
8628 8785
8629 /** 8786 /**
8630 * The information cached by an analysis context about an individual HTML file. 8787 * The information cached by an analysis context about an individual HTML file.
8631 */ 8788 */
8632 class HtmlEntry extends SourceEntry { 8789 class HtmlEntry extends SourceEntry {
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
8846 _writeStateOn(buffer, "parseErrors", PARSE_ERRORS); 9003 _writeStateOn(buffer, "parseErrors", PARSE_ERRORS);
8847 _writeStateOn(buffer, "parsedUnit", PARSED_UNIT); 9004 _writeStateOn(buffer, "parsedUnit", PARSED_UNIT);
8848 _writeStateOn(buffer, "resolvedUnit", RESOLVED_UNIT); 9005 _writeStateOn(buffer, "resolvedUnit", RESOLVED_UNIT);
8849 _writeStateOn(buffer, "resolutionErrors", RESOLUTION_ERRORS); 9006 _writeStateOn(buffer, "resolutionErrors", RESOLUTION_ERRORS);
8850 _writeStateOn(buffer, "referencedLibraries", REFERENCED_LIBRARIES); 9007 _writeStateOn(buffer, "referencedLibraries", REFERENCED_LIBRARIES);
8851 _writeStateOn(buffer, "element", ELEMENT); 9008 _writeStateOn(buffer, "element", ELEMENT);
8852 } 9009 }
8853 } 9010 }
8854 9011
8855 /** 9012 /**
9013 * An event indicating when a source either starts or stops being implicitly
9014 * analyzed.
9015 */
9016 class ImplicitAnalysisEvent {
9017 /**
9018 * The source whose status has changed.
9019 */
9020 final Source source;
9021
9022 /**
9023 * A flag indicating whether the source is now being analyzed.
9024 */
9025 final bool isAnalyzed;
9026
9027 /**
9028 * Initialize a newly created event to indicate that the given [source] has
9029 * changed it status to match the [isAnalyzed] flag.
9030 */
9031 ImplicitAnalysisEvent(this.source, this.isAnalyzed);
9032
9033 @override
9034 String toString() =>
9035 '${isAnalyzed ? '' : 'not '}analyzing ${source.fullName}';
9036 }
9037
9038 /**
8856 * Instances of the class `IncrementalAnalysisCache` hold information used to pe rform 9039 * Instances of the class `IncrementalAnalysisCache` hold information used to pe rform
8857 * incremental analysis. 9040 * incremental analysis.
8858 * 9041 *
8859 * See [AnalysisContextImpl.setChangedContents]. 9042 * See [AnalysisContextImpl.setChangedContents].
8860 */ 9043 */
8861 class IncrementalAnalysisCache { 9044 class IncrementalAnalysisCache {
8862 final Source librarySource; 9045 final Source librarySource;
8863 9046
8864 final Source source; 9047 final Source source;
8865 9048
8866 final String oldContents; 9049 final String oldContents;
8867 9050
8868 final CompilationUnit resolvedUnit; 9051 final CompilationUnit resolvedUnit;
8869 9052
8870 String _newContents; 9053 String _newContents;
8871 9054
8872 int _offset = 0; 9055 int _offset = 0;
8873 9056
8874 int _oldLength = 0; 9057 int _oldLength = 0;
8875 9058
8876 int _newLength = 0; 9059 int _newLength = 0;
8877 9060
8878 IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, 9061 IncrementalAnalysisCache(
8879 this.oldContents, String newContents, int offset, int oldLength, 9062 this.librarySource,
8880 int newLength) { 9063 this.source,
8881 this._newContents = newContents; 9064 this.resolvedUnit,
8882 this._offset = offset; 9065 this.oldContents,
8883 this._oldLength = oldLength; 9066 this._newContents,
8884 this._newLength = newLength; 9067 this._offset,
8885 } 9068 this._oldLength,
9069 this._newLength);
8886 9070
8887 /** 9071 /**
8888 * Determine if the cache contains source changes that need to be analyzed 9072 * Determine if the cache contains source changes that need to be analyzed
8889 * 9073 *
8890 * @return `true` if the cache contains changes to be analyzed, else `false` 9074 * @return `true` if the cache contains changes to be analyzed, else `false`
8891 */ 9075 */
8892 bool get hasWork => _oldLength > 0 || _newLength > 0; 9076 bool get hasWork => _oldLength > 0 || _newLength > 0;
8893 9077
8894 /** 9078 /**
8895 * Return the current contents for the receiver's source. 9079 * Return the current contents for the receiver's source.
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
8959 * @param source the source being updated (not `null`) 9143 * @param source the source being updated (not `null`)
8960 * @param oldContents the original source contents prior to this update (may b e `null`) 9144 * @param oldContents the original source contents prior to this update (may b e `null`)
8961 * @param newContents the new contents after this incremental change (not `nul l`) 9145 * @param newContents the new contents after this incremental change (not `nul l`)
8962 * @param offset the offset at which the change occurred 9146 * @param offset the offset at which the change occurred
8963 * @param oldLength the length of the text being replaced 9147 * @param oldLength the length of the text being replaced
8964 * @param newLength the length of the replacement text 9148 * @param newLength the length of the replacement text
8965 * @param sourceEntry the cached entry for the given source or `null` if none 9149 * @param sourceEntry the cached entry for the given source or `null` if none
8966 * @return the cache used for incremental analysis or `null` if incremental an alysis cannot 9150 * @return the cache used for incremental analysis or `null` if incremental an alysis cannot
8967 * be performed 9151 * be performed
8968 */ 9152 */
8969 static IncrementalAnalysisCache update(IncrementalAnalysisCache cache, 9153 static IncrementalAnalysisCache update(
8970 Source source, String oldContents, String newContents, int offset, 9154 IncrementalAnalysisCache cache,
8971 int oldLength, int newLength, SourceEntry sourceEntry) { 9155 Source source,
9156 String oldContents,
9157 String newContents,
9158 int offset,
9159 int oldLength,
9160 int newLength,
9161 SourceEntry sourceEntry) {
8972 // Determine the cache resolved unit 9162 // Determine the cache resolved unit
8973 Source librarySource = null; 9163 Source librarySource = null;
8974 CompilationUnit unit = null; 9164 CompilationUnit unit = null;
8975 if (sourceEntry is DartEntry) { 9165 if (sourceEntry is DartEntry) {
8976 DartEntry dartEntry = sourceEntry; 9166 DartEntry dartEntry = sourceEntry;
8977 List<Source> librarySources = dartEntry.librariesContaining; 9167 List<Source> librarySources = dartEntry.librariesContaining;
8978 if (librarySources.length == 1) { 9168 if (librarySources.length == 1) {
8979 librarySource = librarySources[0]; 9169 librarySource = librarySources[0];
8980 if (librarySource != null) { 9170 if (librarySource != null) {
8981 unit = dartEntry.getValueInLibrary( 9171 unit = dartEntry.getValueInLibrary(
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
9387 class ObsoleteSourceAnalysisException extends AnalysisException { 9577 class ObsoleteSourceAnalysisException extends AnalysisException {
9388 /** 9578 /**
9389 * The source that was removed while it was being analyzed. 9579 * The source that was removed while it was being analyzed.
9390 */ 9580 */
9391 Source _source; 9581 Source _source;
9392 9582
9393 /** 9583 /**
9394 * Initialize a newly created exception to represent the removal of the given 9584 * Initialize a newly created exception to represent the removal of the given
9395 * [source]. 9585 * [source].
9396 */ 9586 */
9397 ObsoleteSourceAnalysisException(Source source) : super( 9587 ObsoleteSourceAnalysisException(Source source)
9398 "The source '${source.fullName}' was removed while it was being analyz ed") { 9588 : super(
9589 "The source '${source.fullName}' was removed while it was being anal yzed") {
9399 this._source = source; 9590 this._source = source;
9400 } 9591 }
9401 9592
9402 /** 9593 /**
9403 * Return the source that was removed while it was being analyzed. 9594 * Return the source that was removed while it was being analyzed.
9404 */ 9595 */
9405 Source get source => _source; 9596 Source get source => _source;
9406 } 9597 }
9407 9598
9408 /** 9599 /**
(...skipping 703 matching lines...) Expand 10 before | Expand all | Expand 10 after
10112 } 10303 }
10113 return null; 10304 return null;
10114 } 10305 }
10115 } 10306 }
10116 10307
10117 /** 10308 /**
10118 * An visitor that removes any resolution information from an AST structure when 10309 * An visitor that removes any resolution information from an AST structure when
10119 * used to visit that structure. 10310 * used to visit that structure.
10120 */ 10311 */
10121 class ResolutionEraser extends GeneralizingAstVisitor<Object> { 10312 class ResolutionEraser extends GeneralizingAstVisitor<Object> {
10313 /**
10314 * A flag indicating whether the elements associated with declarations should
10315 * be erased.
10316 */
10317 bool eraseDeclarations = true;
10318
10122 @override 10319 @override
10123 Object visitAssignmentExpression(AssignmentExpression node) { 10320 Object visitAssignmentExpression(AssignmentExpression node) {
10124 node.staticElement = null; 10321 node.staticElement = null;
10125 node.propagatedElement = null; 10322 node.propagatedElement = null;
10126 return super.visitAssignmentExpression(node); 10323 return super.visitAssignmentExpression(node);
10127 } 10324 }
10128 10325
10129 @override 10326 @override
10130 Object visitBinaryExpression(BinaryExpression node) { 10327 Object visitBinaryExpression(BinaryExpression node) {
10131 node.staticElement = null; 10328 node.staticElement = null;
10132 node.propagatedElement = null; 10329 node.propagatedElement = null;
10133 return super.visitBinaryExpression(node); 10330 return super.visitBinaryExpression(node);
10134 } 10331 }
10135 10332
10136 @override 10333 @override
10137 Object visitBreakStatement(BreakStatement node) { 10334 Object visitBreakStatement(BreakStatement node) {
10138 node.target = null; 10335 node.target = null;
10139 return super.visitBreakStatement(node); 10336 return super.visitBreakStatement(node);
10140 } 10337 }
10141 10338
10142 @override 10339 @override
10143 Object visitCompilationUnit(CompilationUnit node) { 10340 Object visitCompilationUnit(CompilationUnit node) {
10144 node.element = null; 10341 if (eraseDeclarations) {
10342 node.element = null;
10343 }
10145 return super.visitCompilationUnit(node); 10344 return super.visitCompilationUnit(node);
10146 } 10345 }
10147 10346
10148 @override 10347 @override
10149 Object visitConstructorDeclaration(ConstructorDeclaration node) { 10348 Object visitConstructorDeclaration(ConstructorDeclaration node) {
10150 node.element = null; 10349 if (eraseDeclarations) {
10350 node.element = null;
10351 }
10151 return super.visitConstructorDeclaration(node); 10352 return super.visitConstructorDeclaration(node);
10152 } 10353 }
10153 10354
10154 @override 10355 @override
10155 Object visitConstructorName(ConstructorName node) { 10356 Object visitConstructorName(ConstructorName node) {
10156 node.staticElement = null; 10357 node.staticElement = null;
10157 return super.visitConstructorName(node); 10358 return super.visitConstructorName(node);
10158 } 10359 }
10159 10360
10160 @override 10361 @override
10161 Object visitContinueStatement(ContinueStatement node) { 10362 Object visitContinueStatement(ContinueStatement node) {
10162 node.target = null; 10363 node.target = null;
10163 return super.visitContinueStatement(node); 10364 return super.visitContinueStatement(node);
10164 } 10365 }
10165 10366
10166 @override 10367 @override
10167 Object visitDirective(Directive node) { 10368 Object visitDirective(Directive node) {
10168 node.element = null; 10369 if (eraseDeclarations) {
10370 node.element = null;
10371 }
10169 return super.visitDirective(node); 10372 return super.visitDirective(node);
10170 } 10373 }
10171 10374
10172 @override 10375 @override
10173 Object visitExpression(Expression node) { 10376 Object visitExpression(Expression node) {
10174 node.staticType = null; 10377 node.staticType = null;
10175 node.propagatedType = null; 10378 node.propagatedType = null;
10176 return super.visitExpression(node); 10379 return super.visitExpression(node);
10177 } 10380 }
10178 10381
10179 @override 10382 @override
10180 Object visitFunctionExpression(FunctionExpression node) { 10383 Object visitFunctionExpression(FunctionExpression node) {
10181 node.element = null; 10384 if (eraseDeclarations) {
10385 node.element = null;
10386 }
10182 return super.visitFunctionExpression(node); 10387 return super.visitFunctionExpression(node);
10183 } 10388 }
10184 10389
10185 @override 10390 @override
10186 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) { 10391 Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
10187 node.staticElement = null; 10392 node.staticElement = null;
10188 node.propagatedElement = null; 10393 node.propagatedElement = null;
10189 return super.visitFunctionExpressionInvocation(node); 10394 return super.visitFunctionExpressionInvocation(node);
10190 } 10395 }
10191 10396
(...skipping 26 matching lines...) Expand all
10218 10423
10219 @override 10424 @override
10220 Object visitRedirectingConstructorInvocation( 10425 Object visitRedirectingConstructorInvocation(
10221 RedirectingConstructorInvocation node) { 10426 RedirectingConstructorInvocation node) {
10222 node.staticElement = null; 10427 node.staticElement = null;
10223 return super.visitRedirectingConstructorInvocation(node); 10428 return super.visitRedirectingConstructorInvocation(node);
10224 } 10429 }
10225 10430
10226 @override 10431 @override
10227 Object visitSimpleIdentifier(SimpleIdentifier node) { 10432 Object visitSimpleIdentifier(SimpleIdentifier node) {
10228 node.staticElement = null; 10433 if (eraseDeclarations || !node.inDeclarationContext()) {
10434 node.staticElement = null;
10435 }
10229 node.propagatedElement = null; 10436 node.propagatedElement = null;
10230 return super.visitSimpleIdentifier(node); 10437 return super.visitSimpleIdentifier(node);
10231 } 10438 }
10232 10439
10233 @override 10440 @override
10234 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { 10441 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
10235 node.staticElement = null; 10442 node.staticElement = null;
10236 return super.visitSuperConstructorInvocation(node); 10443 return super.visitSuperConstructorInvocation(node);
10237 } 10444 }
10238 10445
10239 /** 10446 /**
10240 * Remove any resolution information from the given AST structure. 10447 * Remove any resolution information from the given AST structure.
10241 */ 10448 */
10242 static void erase(AstNode node) { 10449 static void erase(AstNode node, {bool eraseDeclarations: true}) {
10243 node.accept(new ResolutionEraser()); 10450 ResolutionEraser eraser = new ResolutionEraser();
10451 eraser.eraseDeclarations = eraseDeclarations;
10452 node.accept(eraser);
10244 } 10453 }
10245 } 10454 }
10246 10455
10247 /** 10456 /**
10248 * The information produced by resolving a compilation unit as part of a 10457 * The information produced by resolving a compilation unit as part of a
10249 * specific library. 10458 * specific library.
10250 */ 10459 */
10251 class ResolutionState { 10460 class ResolutionState {
10252 /** 10461 /**
10253 * The next resolution state or `null` if none. 10462 * The next resolution state or `null` if none.
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
10746 ResolverVisitor resolverVisitor = new ResolverVisitor( 10955 ResolverVisitor resolverVisitor = new ResolverVisitor(
10747 _libraryElement, source, typeProvider, errorListener, 10956 _libraryElement, source, typeProvider, errorListener,
10748 inheritanceManager: inheritanceManager); 10957 inheritanceManager: inheritanceManager);
10749 unit.accept(resolverVisitor); 10958 unit.accept(resolverVisitor);
10750 // 10959 //
10751 // Perform additional error checking. 10960 // Perform additional error checking.
10752 // 10961 //
10753 PerformanceStatistics.errors.makeCurrentWhile(() { 10962 PerformanceStatistics.errors.makeCurrentWhile(() {
10754 ErrorReporter errorReporter = new ErrorReporter(errorListener, source); 10963 ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
10755 ErrorVerifier errorVerifier = new ErrorVerifier( 10964 ErrorVerifier errorVerifier = new ErrorVerifier(
10756 errorReporter, _libraryElement, typeProvider, inheritanceManager); 10965 errorReporter,
10966 _libraryElement,
10967 typeProvider,
10968 inheritanceManager,
10969 context.analysisOptions.enableSuperMixins);
10757 unit.accept(errorVerifier); 10970 unit.accept(errorVerifier);
10758 // TODO(paulberry): as a temporary workaround for issue 21572, 10971 // TODO(paulberry): as a temporary workaround for issue 21572,
10759 // ConstantVerifier is being run right after ConstantValueComputer, so we 10972 // ConstantVerifier is being run right after ConstantValueComputer, so we
10760 // don't need to run it here. Once issue 21572 is fixed, re-enable the 10973 // don't need to run it here. Once issue 21572 is fixed, re-enable the
10761 // call to ConstantVerifier. 10974 // call to ConstantVerifier.
10762 // ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _libraryElement, typeProvider); 10975 // ConstantVerifier constantVerifier = new ConstantVerifier(errorReporter, _libraryElement, typeProvider);
10763 // unit.accept(constantVerifier); 10976 // unit.accept(constantVerifier);
10764 }); 10977 });
10765 // 10978 //
10766 // Capture the results. 10979 // Capture the results.
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after
11840 PendingFuture pendingFuture = 12053 PendingFuture pendingFuture =
11841 new PendingFuture<T>(_context, source, computeValue); 12054 new PendingFuture<T>(_context, source, computeValue);
11842 if (!pendingFuture.evaluate(sourceEntry)) { 12055 if (!pendingFuture.evaluate(sourceEntry)) {
11843 _context._pendingFutureSources 12056 _context._pendingFutureSources
11844 .putIfAbsent(source, () => <PendingFuture>[]) 12057 .putIfAbsent(source, () => <PendingFuture>[])
11845 .add(pendingFuture); 12058 .add(pendingFuture);
11846 } 12059 }
11847 return pendingFuture.future; 12060 return pendingFuture.future;
11848 } 12061 }
11849 } 12062 }
OLDNEW
« no previous file with comments | « packages/analyzer/lib/src/generated/element_resolver.dart ('k') | packages/analyzer/lib/src/generated/error.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698