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

Side by Side Diff: packages/analyzer/lib/src/context/context.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
« no previous file with comments | « packages/analyzer/lib/src/context/cache.dart ('k') | packages/analyzer/lib/src/error.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.context.context; 5 library analyzer.src.context.context;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'package:analyzer/instrumentation/instrumentation.dart'; 10 import 'package:analyzer/instrumentation/instrumentation.dart';
11 import 'package:analyzer/plugin/task.dart';
11 import 'package:analyzer/src/cancelable_future.dart'; 12 import 'package:analyzer/src/cancelable_future.dart';
12 import 'package:analyzer/src/context/cache.dart'; 13 import 'package:analyzer/src/context/cache.dart';
13 import 'package:analyzer/src/generated/ast.dart'; 14 import 'package:analyzer/src/generated/ast.dart';
14 import 'package:analyzer/src/generated/constant.dart'; 15 import 'package:analyzer/src/generated/constant.dart';
15 import 'package:analyzer/src/generated/element.dart'; 16 import 'package:analyzer/src/generated/element.dart';
16 import 'package:analyzer/src/generated/engine.dart' 17 import 'package:analyzer/src/generated/engine.dart'
17 hide 18 hide
18 AnalysisCache, 19 AnalysisCache,
19 CachePartition, 20 CachePartition,
20 SdkCachePartition, 21 SdkCachePartition,
21 UniversalCachePartition, 22 UniversalCachePartition,
22 WorkManager; 23 WorkManager;
23 import 'package:analyzer/src/generated/error.dart'; 24 import 'package:analyzer/src/generated/error.dart';
24 import 'package:analyzer/src/generated/html.dart' as ht show HtmlUnit; 25 import 'package:analyzer/src/generated/html.dart' as ht show HtmlUnit;
25 import 'package:analyzer/src/generated/incremental_resolver.dart'; 26 import 'package:analyzer/src/generated/incremental_resolver.dart';
26 import 'package:analyzer/src/generated/java_core.dart'; 27 import 'package:analyzer/src/generated/java_core.dart';
27 import 'package:analyzer/src/generated/java_engine.dart'; 28 import 'package:analyzer/src/generated/java_engine.dart';
28 import 'package:analyzer/src/generated/resolver.dart'; 29 import 'package:analyzer/src/generated/resolver.dart';
29 import 'package:analyzer/src/generated/scanner.dart';
30 import 'package:analyzer/src/generated/sdk.dart' show DartSdk; 30 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
31 import 'package:analyzer/src/generated/source.dart'; 31 import 'package:analyzer/src/generated/source.dart';
32 import 'package:analyzer/src/generated/utilities_collection.dart'; 32 import 'package:analyzer/src/generated/utilities_collection.dart';
33 import 'package:analyzer/src/task/dart.dart'; 33 import 'package:analyzer/src/task/dart.dart';
34 import 'package:analyzer/src/task/dart_work_manager.dart'; 34 import 'package:analyzer/src/task/dart_work_manager.dart';
35 import 'package:analyzer/src/task/driver.dart'; 35 import 'package:analyzer/src/task/driver.dart';
36 import 'package:analyzer/src/task/html.dart';
37 import 'package:analyzer/src/task/html_work_manager.dart';
38 import 'package:analyzer/src/task/incremental_element_builder.dart'; 36 import 'package:analyzer/src/task/incremental_element_builder.dart';
39 import 'package:analyzer/src/task/manager.dart'; 37 import 'package:analyzer/src/task/manager.dart';
40 import 'package:analyzer/task/dart.dart'; 38 import 'package:analyzer/task/dart.dart';
41 import 'package:analyzer/task/general.dart'; 39 import 'package:analyzer/task/general.dart';
42 import 'package:analyzer/task/html.dart'; 40 import 'package:analyzer/task/html.dart';
43 import 'package:analyzer/task/model.dart'; 41 import 'package:analyzer/task/model.dart';
44 import 'package:html/dom.dart' show Document; 42 import 'package:html/dom.dart' show Document;
45 43
46 /** 44 /**
47 * Type of callback functions used by PendingFuture. Functions of this type 45 * Type of callback functions used by PendingFuture. Functions of this type
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 * are stored. 113 * are stored.
116 */ 114 */
117 AnalysisCache _cache; 115 AnalysisCache _cache;
118 116
119 /** 117 /**
120 * The task manager used to manage the tasks used to analyze code. 118 * The task manager used to manage the tasks used to analyze code.
121 */ 119 */
122 TaskManager _taskManager; 120 TaskManager _taskManager;
123 121
124 /** 122 /**
123 * A list of all [WorkManager]s used by this context.
124 */
125 final List<WorkManager> workManagers = <WorkManager>[];
126
127 /**
125 * The [DartWorkManager] instance that performs Dart specific scheduling. 128 * The [DartWorkManager] instance that performs Dart specific scheduling.
126 */ 129 */
127 DartWorkManager dartWorkManager; 130 DartWorkManager dartWorkManager;
128 131
129 /** 132 /**
130 * The work manager that performs HTML specific scheduling.
131 */
132 HtmlWorkManager htmlWorkManager;
133
134 /**
135 * The analysis driver used to perform analysis. 133 * The analysis driver used to perform analysis.
136 */ 134 */
137 AnalysisDriver driver; 135 AnalysisDriver driver;
138 136
139 /** 137 /**
140 * A list containing sources for which data should not be flushed. 138 * A list containing sources for which data should not be flushed.
141 */ 139 */
142 List<Source> _priorityOrder = <Source>[]; 140 List<Source> _priorityOrder = <Source>[];
143 141
144 /** 142 /**
(...skipping 10 matching lines...) Expand all
155 */ 153 */
156 HashMap<Source, ChangeNoticeImpl> _pendingNotices = 154 HashMap<Source, ChangeNoticeImpl> _pendingNotices =
157 new HashMap<Source, ChangeNoticeImpl>(); 155 new HashMap<Source, ChangeNoticeImpl>();
158 156
159 /** 157 /**
160 * The [TypeProvider] for this context, `null` if not yet created. 158 * The [TypeProvider] for this context, `null` if not yet created.
161 */ 159 */
162 TypeProvider _typeProvider; 160 TypeProvider _typeProvider;
163 161
164 /** 162 /**
163 * The [TypeSystem] for this context, `null` if not yet created.
164 */
165 TypeSystem _typeSystem;
166
167 /**
165 * The controller for sending [SourcesChangedEvent]s. 168 * The controller for sending [SourcesChangedEvent]s.
166 */ 169 */
167 StreamController<SourcesChangedEvent> _onSourcesChangedController; 170 StreamController<SourcesChangedEvent> _onSourcesChangedController;
168 171
169 /** 172 /**
173 * A subscription for a stream of events indicating when files are (and are
174 * not) being implicitly analyzed.
175 */
176 StreamController<ImplicitAnalysisEvent> _implicitAnalysisEventsController;
177
178 /**
170 * The listeners that are to be notified when various analysis results are 179 * The listeners that are to be notified when various analysis results are
171 * produced in this context. 180 * produced in this context.
172 */ 181 */
173 List<AnalysisListener> _listeners = new List<AnalysisListener>(); 182 List<AnalysisListener> _listeners = new List<AnalysisListener>();
174 183
175 /** 184 /**
176 * The most recently incrementally resolved source, or `null` when it was 185 * The most recently incrementally resolved source, or `null` when it was
177 * already validated, or the most recent change was not incrementally resolved . 186 * already validated, or the most recent change was not incrementally resolved .
178 */ 187 */
179 Source incrementalResolutionValidation_lastUnitSource; 188 Source incrementalResolutionValidation_lastUnitSource;
(...skipping 26 matching lines...) Expand all
206 */ 215 */
207 LibraryResolverFactory libraryResolverFactory; 216 LibraryResolverFactory libraryResolverFactory;
208 217
209 /** 218 /**
210 * Initialize a newly created analysis context. 219 * Initialize a newly created analysis context.
211 */ 220 */
212 AnalysisContextImpl() { 221 AnalysisContextImpl() {
213 _privatePartition = new UniversalCachePartition(this); 222 _privatePartition = new UniversalCachePartition(this);
214 _cache = createCacheFromSourceFactory(null); 223 _cache = createCacheFromSourceFactory(null);
215 _taskManager = AnalysisEngine.instance.taskManager; 224 _taskManager = AnalysisEngine.instance.taskManager;
216 // TODO(scheglov) Get WorkManager(Factory)(s) from plugins. 225 for (WorkManagerFactory factory
217 dartWorkManager = new DartWorkManager(this); 226 in AnalysisEngine.instance.enginePlugin.workManagerFactories) {
218 htmlWorkManager = new HtmlWorkManager(this); 227 WorkManager workManager = factory(this);
219 driver = new AnalysisDriver( 228 if (workManager != null) {
220 _taskManager, <WorkManager>[dartWorkManager, htmlWorkManager], this); 229 workManagers.add(workManager);
230 if (workManager is DartWorkManager) {
231 dartWorkManager = workManager;
232 }
233 }
234 }
235 driver = new AnalysisDriver(_taskManager, workManagers, this);
221 _onSourcesChangedController = 236 _onSourcesChangedController =
222 new StreamController<SourcesChangedEvent>.broadcast(); 237 new StreamController<SourcesChangedEvent>.broadcast();
238 _implicitAnalysisEventsController =
239 new StreamController<ImplicitAnalysisEvent>.broadcast();
223 } 240 }
224 241
225 @override 242 @override
226 AnalysisCache get analysisCache => _cache; 243 AnalysisCache get analysisCache => _cache;
227 244
228 @override 245 @override
229 AnalysisOptions get analysisOptions => _options; 246 AnalysisOptions get analysisOptions => _options;
230 247
231 @override 248 @override
232 void set analysisOptions(AnalysisOptions options) { 249 void set analysisOptions(AnalysisOptions options) {
233 bool needsRecompute = this._options.analyzeFunctionBodiesPredicate != 250 bool needsRecompute = this._options.analyzeFunctionBodiesPredicate !=
234 options.analyzeFunctionBodiesPredicate || 251 options.analyzeFunctionBodiesPredicate ||
235 this._options.generateImplicitErrors != 252 this._options.generateImplicitErrors !=
236 options.generateImplicitErrors || 253 options.generateImplicitErrors ||
237 this._options.generateSdkErrors != options.generateSdkErrors || 254 this._options.generateSdkErrors != options.generateSdkErrors ||
238 this._options.dart2jsHint != options.dart2jsHint || 255 this._options.dart2jsHint != options.dart2jsHint ||
239 (this._options.hint && !options.hint) || 256 (this._options.hint && !options.hint) ||
240 (this._options.lint && !options.lint) || 257 (this._options.lint && !options.lint) ||
241 this._options.preserveComments != options.preserveComments || 258 this._options.preserveComments != options.preserveComments ||
242 this._options.enableStrictCallChecks != options.enableStrictCallChecks; 259 this._options.strongMode != options.strongMode ||
260 this._options.enableStrictCallChecks !=
261 options.enableStrictCallChecks ||
262 this._options.enableSuperMixins != options.enableSuperMixins;
243 int cacheSize = options.cacheSize; 263 int cacheSize = options.cacheSize;
244 if (this._options.cacheSize != cacheSize) { 264 if (this._options.cacheSize != cacheSize) {
245 this._options.cacheSize = cacheSize; 265 this._options.cacheSize = cacheSize;
246 } 266 }
247 this._options.analyzeFunctionBodiesPredicate = 267 this._options.analyzeFunctionBodiesPredicate =
248 options.analyzeFunctionBodiesPredicate; 268 options.analyzeFunctionBodiesPredicate;
249 this._options.generateImplicitErrors = options.generateImplicitErrors; 269 this._options.generateImplicitErrors = options.generateImplicitErrors;
250 this._options.generateSdkErrors = options.generateSdkErrors; 270 this._options.generateSdkErrors = options.generateSdkErrors;
251 this._options.dart2jsHint = options.dart2jsHint; 271 this._options.dart2jsHint = options.dart2jsHint;
252 this._options.enableStrictCallChecks = options.enableStrictCallChecks; 272 this._options.enableStrictCallChecks = options.enableStrictCallChecks;
273 this._options.enableSuperMixins = options.enableSuperMixins;
253 this._options.hint = options.hint; 274 this._options.hint = options.hint;
254 this._options.incremental = options.incremental; 275 this._options.incremental = options.incremental;
255 this._options.incrementalApi = options.incrementalApi; 276 this._options.incrementalApi = options.incrementalApi;
256 this._options.incrementalValidation = options.incrementalValidation; 277 this._options.incrementalValidation = options.incrementalValidation;
257 this._options.lint = options.lint; 278 this._options.lint = options.lint;
258 this._options.preserveComments = options.preserveComments; 279 this._options.preserveComments = options.preserveComments;
280 this._options.strongMode = options.strongMode;
259 if (needsRecompute) { 281 if (needsRecompute) {
260 dartWorkManager.onAnalysisOptionsChanged(); 282 for (WorkManager workManager in workManagers) {
261 htmlWorkManager.onAnalysisOptionsChanged(); 283 workManager.onAnalysisOptionsChanged();
284 }
262 } 285 }
263 } 286 }
264 287
265 @override 288 @override
266 void set analysisPriorityOrder(List<Source> sources) { 289 void set analysisPriorityOrder(List<Source> sources) {
267 if (sources == null || sources.isEmpty) { 290 if (sources == null || sources.isEmpty) {
268 _priorityOrder = Source.EMPTY_LIST; 291 _priorityOrder = Source.EMPTY_LIST;
269 } else { 292 } else {
270 while (sources.remove(null)) { 293 while (sources.remove(null)) {
271 // Nothing else to do. 294 // Nothing else to do.
272 } 295 }
273 if (sources.isEmpty) { 296 if (sources.isEmpty) {
274 _priorityOrder = Source.EMPTY_LIST; 297 _priorityOrder = Source.EMPTY_LIST;
275 } else { 298 } else {
276 _priorityOrder = sources; 299 _priorityOrder = sources;
277 } 300 }
278 } 301 }
279 dartWorkManager.applyPriorityTargets(_priorityOrder); 302 for (WorkManager workManager in workManagers) {
280 htmlWorkManager.applyPriorityTargets(_priorityOrder); 303 workManager.applyPriorityTargets(_priorityOrder);
304 }
305 driver.reset();
281 } 306 }
282 307
283 @override 308 @override
284 set contentCache(ContentCache value) { 309 set contentCache(ContentCache value) {
285 _contentCache = value; 310 _contentCache = value;
286 } 311 }
287 312
288 @override 313 @override
289 DeclaredVariables get declaredVariables => _declaredVariables; 314 DeclaredVariables get declaredVariables => _declaredVariables;
290 315
291 @override 316 @override
292 List<AnalysisTarget> get explicitTargets { 317 List<AnalysisTarget> get explicitTargets {
293 List<AnalysisTarget> targets = <AnalysisTarget>[]; 318 List<AnalysisTarget> targets = <AnalysisTarget>[];
294 MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator(); 319 MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator();
295 while (iterator.moveNext()) { 320 while (iterator.moveNext()) {
296 if (iterator.value.explicitlyAdded) { 321 if (iterator.value.explicitlyAdded) {
297 targets.add(iterator.key); 322 targets.add(iterator.key);
298 } 323 }
299 } 324 }
300 return targets; 325 return targets;
301 } 326 }
302 327
303 @override 328 @override
304 List<Source> get htmlSources => _getSources(SourceKind.HTML); 329 List<Source> get htmlSources => _getSources(SourceKind.HTML);
305 330
306 @override 331 @override
332 Stream<ImplicitAnalysisEvent> get implicitAnalysisEvents =>
333 _implicitAnalysisEventsController.stream;
334
335 @override
307 bool get isDisposed => _disposed; 336 bool get isDisposed => _disposed;
308 337
309 @override 338 @override
310 List<Source> get launchableClientLibrarySources { 339 List<Source> get launchableClientLibrarySources {
311 List<Source> sources = <Source>[]; 340 List<Source> sources = <Source>[];
312 for (Source source in _cache.sources) { 341 for (Source source in _cache.sources) {
313 CacheEntry entry = _cache.get(source); 342 CacheEntry entry = _cache.get(source);
314 if (entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY && 343 if (entry.getValue(SOURCE_KIND) == SourceKind.LIBRARY &&
315 !source.isInSystemLibrary && 344 !source.isInSystemLibrary &&
316 isClientLibrary(source)) { 345 isClientLibrary(source)) {
(...skipping 21 matching lines...) Expand all
338 @override 367 @override
339 List<Source> get librarySources => _getSources(SourceKind.LIBRARY); 368 List<Source> get librarySources => _getSources(SourceKind.LIBRARY);
340 369
341 @override 370 @override
342 Stream<SourcesChangedEvent> get onSourcesChanged => 371 Stream<SourcesChangedEvent> get onSourcesChanged =>
343 _onSourcesChangedController.stream; 372 _onSourcesChangedController.stream;
344 373
345 /** 374 /**
346 * Make _pendingFutureSources available to unit tests. 375 * Make _pendingFutureSources available to unit tests.
347 */ 376 */
348 HashMap<AnalysisTarget, List<PendingFuture>> get pendingFutureSources_forTesti ng => 377 HashMap<AnalysisTarget,
378 List<PendingFuture>> get pendingFutureSources_forTesting =>
349 _pendingFutureTargets; 379 _pendingFutureTargets;
350 380
351 @override 381 @override
352 List<Source> get prioritySources => _priorityOrder; 382 List<Source> get prioritySources => _priorityOrder;
353 383
354 @override 384 @override
355 List<AnalysisTarget> get priorityTargets => prioritySources; 385 List<AnalysisTarget> get priorityTargets => prioritySources;
356 386
357 @override 387 @override
358 CachePartition get privateAnalysisCachePartition => _privatePartition; 388 CachePartition get privateAnalysisCachePartition => _privatePartition;
359 389
360 @override 390 @override
361 SourceFactory get sourceFactory => _sourceFactory; 391 SourceFactory get sourceFactory => _sourceFactory;
362 392
363 @override 393 @override
364 void set sourceFactory(SourceFactory factory) { 394 void set sourceFactory(SourceFactory factory) {
365 if (identical(_sourceFactory, factory)) { 395 if (identical(_sourceFactory, factory)) {
366 return; 396 return;
367 } else if (factory.context != null) { 397 } else if (factory.context != null) {
368 throw new IllegalStateException( 398 throw new IllegalStateException(
369 "Source factories cannot be shared between contexts"); 399 "Source factories cannot be shared between contexts");
370 } 400 }
371 if (_sourceFactory != null) { 401 if (_sourceFactory != null) {
372 _sourceFactory.context = null; 402 _sourceFactory.context = null;
373 } 403 }
374 factory.context = this; 404 factory.context = this;
375 _sourceFactory = factory; 405 _sourceFactory = factory;
376 _cache = createCacheFromSourceFactory(factory); 406 _cache = createCacheFromSourceFactory(factory);
377 dartWorkManager.onSourceFactoryChanged(); 407 for (WorkManager workManager in workManagers) {
378 htmlWorkManager.onSourceFactoryChanged(); 408 workManager.onSourceFactoryChanged();
409 }
379 } 410 }
380 411
381 @override 412 @override
382 List<Source> get sources { 413 List<Source> get sources {
383 return _cache.sources.toList(); 414 return _cache.sources.toList();
384 } 415 }
385 416
386 /** 417 /**
387 * Return a list of the sources that would be processed by 418 * Return a list of the sources that would be processed by
388 * [performAnalysisTask]. This method duplicates, and must therefore be kept 419 * [performAnalysisTask]. This method duplicates, and must therefore be kept
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 } 479 }
449 480
450 /** 481 /**
451 * Sets the [TypeProvider] for this context. 482 * Sets the [TypeProvider] for this context.
452 */ 483 */
453 void set typeProvider(TypeProvider typeProvider) { 484 void set typeProvider(TypeProvider typeProvider) {
454 _typeProvider = typeProvider; 485 _typeProvider = typeProvider;
455 } 486 }
456 487
457 @override 488 @override
489 TypeSystem get typeSystem {
490 if (_typeSystem == null) {
491 _typeSystem = TypeSystem.create(this);
492 }
493 return _typeSystem;
494 }
495
496 @override
458 void addListener(AnalysisListener listener) { 497 void addListener(AnalysisListener listener) {
459 if (!_listeners.contains(listener)) { 498 if (!_listeners.contains(listener)) {
460 _listeners.add(listener); 499 _listeners.add(listener);
461 } 500 }
462 } 501 }
463 502
464 @override 503 @override
465 void applyAnalysisDelta(AnalysisDelta delta) { 504 void applyAnalysisDelta(AnalysisDelta delta) {
466 ChangeSet changeSet = new ChangeSet(); 505 ChangeSet changeSet = new ChangeSet();
467 delta.analysisLevels.forEach((Source source, AnalysisLevel level) { 506 delta.analysisLevels.forEach((Source source, AnalysisLevel level) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 .forEach((Source source, ChangeSet_ContentChange change) { 548 .forEach((Source source, ChangeSet_ContentChange change) {
510 _contentRangeChanged(source, change.contents, change.offset, 549 _contentRangeChanged(source, change.contents, change.offset,
511 change.oldLength, change.newLength); 550 change.oldLength, change.newLength);
512 }); 551 });
513 for (Source source in changeSet.deletedSources) { 552 for (Source source in changeSet.deletedSources) {
514 _sourceDeleted(source); 553 _sourceDeleted(source);
515 } 554 }
516 for (Source source in removedSources) { 555 for (Source source in removedSources) {
517 _sourceRemoved(source); 556 _sourceRemoved(source);
518 } 557 }
519 dartWorkManager.applyChange( 558 for (WorkManager workManager in workManagers) {
520 changeSet.addedSources, changeSet.changedSources, removedSources); 559 workManager.applyChange(
521 htmlWorkManager.applyChange( 560 changeSet.addedSources, changeSet.changedSources, removedSources);
522 changeSet.addedSources, changeSet.changedSources, removedSources); 561 }
523 _onSourcesChangedController.add(new SourcesChangedEvent(changeSet)); 562 _onSourcesChangedController.add(new SourcesChangedEvent(changeSet));
524 } 563 }
525 564
526 @override 565 @override
527 String computeDocumentationComment(Element element) { 566 String computeDocumentationComment(Element element) {
528 if (element == null) { 567 if (element == null) {
529 return null; 568 return null;
530 } 569 }
531 Source source = element.source; 570 Source source = element.source;
532 if (source == null) { 571 if (source == null) {
533 return null; 572 return null;
534 } 573 }
535 CompilationUnit unit = parseCompilationUnit(source); 574 SourceRange docRange = element.docRange;
536 if (unit == null) { 575 if (docRange == null) {
537 return null; 576 return null;
538 } 577 }
539 NodeLocator locator = new NodeLocator(element.nameOffset); 578 String code = getContents(source).data;
540 AstNode nameNode = locator.searchWithin(unit); 579 String comment = code.substring(docRange.offset, docRange.end);
541 while (nameNode != null) { 580 return comment.replaceAll('\r\n', '\n');
542 if (nameNode is AnnotatedNode) {
543 Comment comment = nameNode.documentationComment;
544 if (comment == null) {
545 return null;
546 }
547 StringBuffer buffer = new StringBuffer();
548 List<Token> tokens = comment.tokens;
549 for (int i = 0; i < tokens.length; i++) {
550 if (i > 0) {
551 buffer.write("\n");
552 }
553 buffer.write(tokens[i].lexeme);
554 }
555 return buffer.toString();
556 }
557 nameNode = nameNode.parent;
558 }
559 return null;
560 } 581 }
561 582
562 @override 583 @override
563 List<AnalysisError> computeErrors(Source source) { 584 List<AnalysisError> computeErrors(Source source) {
564 String name = source.shortName; 585 String name = source.shortName;
565 if (AnalysisEngine.isDartFileName(name)) { 586 if (AnalysisEngine.isDartFileName(name)) {
566 return computeResult(source, DART_ERRORS); 587 return computeResult(source, DART_ERRORS);
567 } else if (AnalysisEngine.isHtmlFileName(name)) { 588 } else if (AnalysisEngine.isHtmlFileName(name)) {
568 return computeResult(source, HTML_ERRORS); 589 return computeResult(source, HTML_ERRORS);
569 } 590 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 } 634 }
614 635
615 @override 636 @override
616 CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync( 637 CancelableFuture<CompilationUnit> computeResolvedCompilationUnitAsync(
617 Source unitSource, Source librarySource) { 638 Source unitSource, Source librarySource) {
618 if (!AnalysisEngine.isDartFileName(unitSource.shortName) || 639 if (!AnalysisEngine.isDartFileName(unitSource.shortName) ||
619 !AnalysisEngine.isDartFileName(librarySource.shortName)) { 640 !AnalysisEngine.isDartFileName(librarySource.shortName)) {
620 return new CancelableFuture.error(new AnalysisNotScheduledError()); 641 return new CancelableFuture.error(new AnalysisNotScheduledError());
621 } 642 }
622 var unitTarget = new LibrarySpecificUnit(librarySource, unitSource); 643 var unitTarget = new LibrarySpecificUnit(librarySource, unitSource);
623 return new _AnalysisFutureHelper<CompilationUnit>(this).computeAsync( 644 return new _AnalysisFutureHelper<CompilationUnit>(this)
624 unitTarget, (CacheEntry entry) { 645 .computeAsync(unitTarget, (CacheEntry entry) {
625 CacheState state = entry.getState(RESOLVED_UNIT); 646 CacheState state = entry.getState(RESOLVED_UNIT);
626 if (state == CacheState.ERROR) { 647 if (state == CacheState.ERROR) {
627 throw entry.exception; 648 throw entry.exception;
628 } else if (state == CacheState.INVALID) { 649 } else if (state == CacheState.INVALID) {
629 return null; 650 return null;
630 } 651 }
631 return entry.getValue(RESOLVED_UNIT); 652 return entry.getValue(RESOLVED_UNIT);
632 }, () { 653 }, () {
633 dartWorkManager.addPriorityResult(unitTarget, RESOLVED_UNIT); 654 dartWorkManager.addPriorityResult(unitTarget, RESOLVED_UNIT);
634 }); 655 });
635 } 656 }
636 657
658 @override
637 Object /*V*/ computeResult( 659 Object /*V*/ computeResult(
638 AnalysisTarget target, ResultDescriptor /*<V>*/ descriptor) { 660 AnalysisTarget target, ResultDescriptor /*<V>*/ descriptor) {
639 CacheEntry entry = getCacheEntry(target); 661 CacheEntry entry = getCacheEntry(target);
640 CacheState state = entry.getState(descriptor); 662 CacheState state = entry.getState(descriptor);
641 if (state == CacheState.FLUSHED || state == CacheState.INVALID) { 663 if (state == CacheState.FLUSHED || state == CacheState.INVALID) {
642 driver.computeResult(target, descriptor); 664 driver.computeResult(target, descriptor);
643 } 665 }
644 state = entry.getState(descriptor); 666 state = entry.getState(descriptor);
645 if (state == CacheState.ERROR) { 667 if (state == CacheState.ERROR) {
646 throw new AnalysisException( 668 throw new AnalysisException(
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 } 701 }
680 702
681 @override 703 @override
682 List<CompilationUnit> ensureResolvedDartUnits(Source unitSource) { 704 List<CompilationUnit> ensureResolvedDartUnits(Source unitSource) {
683 // Check every library. 705 // Check every library.
684 List<CompilationUnit> units = <CompilationUnit>[]; 706 List<CompilationUnit> units = <CompilationUnit>[];
685 List<Source> containingLibraries = getLibrariesContaining(unitSource); 707 List<Source> containingLibraries = getLibrariesContaining(unitSource);
686 for (Source librarySource in containingLibraries) { 708 for (Source librarySource in containingLibraries) {
687 LibrarySpecificUnit target = 709 LibrarySpecificUnit target =
688 new LibrarySpecificUnit(librarySource, unitSource); 710 new LibrarySpecificUnit(librarySource, unitSource);
689 CompilationUnit unit = _cache.getValue(target, RESOLVED_UNIT); 711 CompilationUnit unit = getResult(target, RESOLVED_UNIT);
690 if (unit == null) { 712 if (unit == null) {
691 units = null; 713 units = null;
692 break; 714 break;
693 } 715 }
694 units.add(unit); 716 units.add(unit);
695 } 717 }
696 // If we have results, then we're done. 718 // If we have results, then we're done.
697 if (units != null) { 719 if (units != null) {
698 return units; 720 return units;
699 } 721 }
(...skipping 21 matching lines...) Expand all
721 743
722 @override 744 @override
723 CacheEntry getCacheEntry(AnalysisTarget target) { 745 CacheEntry getCacheEntry(AnalysisTarget target) {
724 CacheEntry entry = _cache.get(target); 746 CacheEntry entry = _cache.get(target);
725 if (entry == null) { 747 if (entry == null) {
726 entry = new CacheEntry(target); 748 entry = new CacheEntry(target);
727 if (target is Source) { 749 if (target is Source) {
728 entry.modificationTime = getModificationStamp(target); 750 entry.modificationTime = getModificationStamp(target);
729 } 751 }
730 _cache.put(entry); 752 _cache.put(entry);
753 if (target is Source) {
754 _implicitAnalysisEventsController
755 .add(new ImplicitAnalysisEvent(target, true));
756 }
731 } 757 }
732 return entry; 758 return entry;
733 } 759 }
734 760
735 @override 761 @override
736 CompilationUnitElement getCompilationUnitElement( 762 CompilationUnitElement getCompilationUnitElement(
737 Source unitSource, Source librarySource) { 763 Source unitSource, Source librarySource) {
738 AnalysisTarget target = new LibrarySpecificUnit(librarySource, unitSource); 764 AnalysisTarget target = new LibrarySpecificUnit(librarySource, unitSource);
739 return _cache.getValue(target, COMPILATION_UNIT_ELEMENT); 765 return getResult(target, COMPILATION_UNIT_ELEMENT);
740 } 766 }
741 767
742 @override 768 @override
743 TimestampedData<String> getContents(Source source) { 769 TimestampedData<String> getContents(Source source) {
744 String contents = _contentCache.getContents(source); 770 String contents = _contentCache.getContents(source);
745 if (contents != null) { 771 if (contents != null) {
746 return new TimestampedData<String>( 772 return new TimestampedData<String>(
747 _contentCache.getModificationStamp(source), contents); 773 _contentCache.getModificationStamp(source), contents);
748 } 774 }
749 return source.contents; 775 return source.contents;
(...skipping 25 matching lines...) Expand all
775 } catch (exception) { 801 } catch (exception) {
776 // If the location cannot be decoded for some reason then the underlying 802 // If the location cannot be decoded for some reason then the underlying
777 // cause should have been logged already and we can fall though to return 803 // cause should have been logged already and we can fall though to return
778 // null. 804 // null.
779 } 805 }
780 return null; 806 return null;
781 } 807 }
782 808
783 @override 809 @override
784 AnalysisErrorInfo getErrors(Source source) { 810 AnalysisErrorInfo getErrors(Source source) {
785 String name = source.shortName; 811 List<AnalysisError> allErrors = <AnalysisError>[];
786 if (AnalysisEngine.isDartFileName(name) || source is DartScript) { 812 for (WorkManager workManager in workManagers) {
787 return dartWorkManager.getErrors(source); 813 List<AnalysisError> errors = workManager.getErrors(source);
788 } else if (AnalysisEngine.isHtmlFileName(name)) { 814 allErrors.addAll(errors);
789 return htmlWorkManager.getErrors(source);
790 } 815 }
791 return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null); 816 LineInfo lineInfo = getLineInfo(source);
817 return new AnalysisErrorInfoImpl(allErrors, lineInfo);
792 } 818 }
793 819
794 @override 820 @override
795 @deprecated 821 @deprecated
796 HtmlElement getHtmlElement(Source source) { 822 HtmlElement getHtmlElement(Source source) {
797 // TODO(brianwilkerson) Remove this method after switching to the new task 823 // TODO(brianwilkerson) Remove this method after switching to the new task
798 // model. 824 // model.
799 throw new UnimplementedError('Not supported in the new task model'); 825 throw new UnimplementedError('Not supported in the new task model');
800 } 826 }
801 827
802 @override 828 @override
803 List<Source> getHtmlFilesReferencing(Source source) { 829 List<Source> getHtmlFilesReferencing(Source source) {
804 if (!AnalysisEngine.isDartFileName(source.shortName)) { 830 if (!AnalysisEngine.isDartFileName(source.shortName)) {
805 return Source.EMPTY_LIST; 831 return Source.EMPTY_LIST;
806 } 832 }
807 List<Source> htmlSources = <Source>[]; 833 List<Source> htmlSources = <Source>[];
808 List<Source> librarySources = getLibrariesContaining(source); 834 List<Source> librarySources = getLibrariesContaining(source);
809 for (Source source in _cache.sources) { 835 for (Source source in _cache.sources) {
810 if (AnalysisEngine.isHtmlFileName(source.shortName)) { 836 if (AnalysisEngine.isHtmlFileName(source.shortName)) {
811 List<Source> referencedLibraries = 837 List<Source> referencedLibraries =
812 analysisCache.getValue(source, REFERENCED_LIBRARIES); 838 getResult(source, REFERENCED_LIBRARIES);
813 if (_containsAny(referencedLibraries, librarySources)) { 839 if (_containsAny(referencedLibraries, librarySources)) {
814 htmlSources.add(source); 840 htmlSources.add(source);
815 } 841 }
816 } 842 }
817 } 843 }
818 if (htmlSources.isEmpty) { 844 if (htmlSources.isEmpty) {
819 return Source.EMPTY_LIST; 845 return Source.EMPTY_LIST;
820 } 846 }
821 return htmlSources; 847 return htmlSources;
822 } 848 }
823 849
824 @override 850 @override
825 SourceKind getKindOf(Source source) { 851 SourceKind getKindOf(Source source) {
826 String name = source.shortName; 852 String name = source.shortName;
827 if (AnalysisEngine.isDartFileName(name)) { 853 if (AnalysisEngine.isDartFileName(name)) {
828 return _cache.getValue(source, SOURCE_KIND); 854 return getResult(source, SOURCE_KIND);
829 } else if (AnalysisEngine.isHtmlFileName(name)) { 855 } else if (AnalysisEngine.isHtmlFileName(name)) {
830 return SourceKind.HTML; 856 return SourceKind.HTML;
831 } 857 }
832 return SourceKind.UNKNOWN; 858 return SourceKind.UNKNOWN;
833 } 859 }
834 860
835 @override 861 @override
836 List<Source> getLibrariesContaining(Source source) { 862 List<Source> getLibrariesContaining(Source source) {
837 SourceKind kind = getKindOf(source); 863 SourceKind kind = getKindOf(source);
838 if (kind == SourceKind.LIBRARY) { 864 if (kind == SourceKind.LIBRARY) {
(...skipping 26 matching lines...) Expand all
865 List<Source> getLibrariesReferencedFromHtml(Source htmlSource) { 891 List<Source> getLibrariesReferencedFromHtml(Source htmlSource) {
866 CacheEntry entry = _cache.get(htmlSource); 892 CacheEntry entry = _cache.get(htmlSource);
867 if (entry != null) { 893 if (entry != null) {
868 return entry.getValue(REFERENCED_LIBRARIES); 894 return entry.getValue(REFERENCED_LIBRARIES);
869 } 895 }
870 return Source.EMPTY_LIST; 896 return Source.EMPTY_LIST;
871 } 897 }
872 898
873 @override 899 @override
874 LibraryElement getLibraryElement(Source source) => 900 LibraryElement getLibraryElement(Source source) =>
875 _cache.getValue(source, LIBRARY_ELEMENT); 901 getResult(source, LIBRARY_ELEMENT);
876 902
877 @override 903 @override
878 LineInfo getLineInfo(Source source) => _cache.getValue(source, LINE_INFO); 904 LineInfo getLineInfo(Source source) => getResult(source, LINE_INFO);
879 905
880 @override 906 @override
881 int getModificationStamp(Source source) { 907 int getModificationStamp(Source source) {
882 int stamp = _contentCache.getModificationStamp(source); 908 int stamp = _contentCache.getModificationStamp(source);
883 if (stamp != null) { 909 if (stamp != null) {
884 return stamp; 910 return stamp;
885 } 911 }
886 return source.modificationStamp; 912 return source.modificationStamp;
887 } 913 }
888 914
(...skipping 30 matching lines...) Expand all
919 return getResolvedCompilationUnit2(unitSource, library.source); 945 return getResolvedCompilationUnit2(unitSource, library.source);
920 } 946 }
921 947
922 @override 948 @override
923 CompilationUnit getResolvedCompilationUnit2( 949 CompilationUnit getResolvedCompilationUnit2(
924 Source unitSource, Source librarySource) { 950 Source unitSource, Source librarySource) {
925 if (!AnalysisEngine.isDartFileName(unitSource.shortName) || 951 if (!AnalysisEngine.isDartFileName(unitSource.shortName) ||
926 !AnalysisEngine.isDartFileName(librarySource.shortName)) { 952 !AnalysisEngine.isDartFileName(librarySource.shortName)) {
927 return null; 953 return null;
928 } 954 }
929 return _cache.getValue( 955 return getResult(
930 new LibrarySpecificUnit(librarySource, unitSource), RESOLVED_UNIT); 956 new LibrarySpecificUnit(librarySource, unitSource), RESOLVED_UNIT);
931 } 957 }
932 958
933 @override 959 @override
934 @deprecated 960 @deprecated
935 ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) { 961 ht.HtmlUnit getResolvedHtmlUnit(Source htmlSource) {
936 // TODO(brianwilkerson) Remove this method after switching to the new task 962 // TODO(brianwilkerson) Remove this method after switching to the new task
937 // model. 963 // model.
938 throw new UnimplementedError('Not supported in the new task model'); 964 throw new UnimplementedError('Not supported in the new task model');
939 } 965 }
940 966
941 @override 967 @override
968 Object getResult(AnalysisTarget target, ResultDescriptor result) {
969 return _cache.getValue(target, result);
970 }
971
972 @override
942 List<Source> getSourcesWithFullName(String path) { 973 List<Source> getSourcesWithFullName(String path) {
943 return analysisCache.getSourcesWithFullName(path); 974 return analysisCache.getSourcesWithFullName(path);
944 } 975 }
945 976
946 @override 977 @override
947 bool handleContentsChanged( 978 bool handleContentsChanged(
948 Source source, String originalContents, String newContents, bool notify) { 979 Source source, String originalContents, String newContents, bool notify) {
949 CacheEntry entry = _cache.get(source); 980 CacheEntry entry = _cache.get(source);
950 if (entry == null) { 981 if (entry == null) {
951 return false; 982 return false;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 } 1016 }
986 if (notify && changed) { 1017 if (notify && changed) {
987 _onSourcesChangedController 1018 _onSourcesChangedController
988 .add(new SourcesChangedEvent.changedContent(source, newContents)); 1019 .add(new SourcesChangedEvent.changedContent(source, newContents));
989 } 1020 }
990 return changed; 1021 return changed;
991 } 1022 }
992 1023
993 @override 1024 @override
994 void invalidateLibraryHints(Source librarySource) { 1025 void invalidateLibraryHints(Source librarySource) {
995 List<Source> sources = _cache.getValue(librarySource, UNITS); 1026 List<Source> sources = getResult(librarySource, UNITS);
996 if (sources != null) { 1027 if (sources != null) {
997 for (Source source in sources) { 1028 for (Source source in sources) {
998 getCacheEntry(source).setState(HINTS, CacheState.INVALID); 1029 getCacheEntry(source).setState(HINTS, CacheState.INVALID);
999 } 1030 }
1000 } 1031 }
1001 } 1032 }
1002 1033
1003 @override 1034 @override
1004 bool isClientLibrary(Source librarySource) { 1035 bool isClientLibrary(Source librarySource) {
1005 CacheEntry entry = _cache.get(librarySource); 1036 CacheEntry entry = _cache.get(librarySource);
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
1100 entry.setState(RESOLVE_TYPE_NAMES_ERRORS, CacheState.FLUSHED); 1131 entry.setState(RESOLVE_TYPE_NAMES_ERRORS, CacheState.FLUSHED);
1101 setValue(SCAN_ERRORS, AnalysisError.NO_ERRORS); 1132 setValue(SCAN_ERRORS, AnalysisError.NO_ERRORS);
1102 setValue(SOURCE_KIND, SourceKind.LIBRARY); 1133 setValue(SOURCE_KIND, SourceKind.LIBRARY);
1103 entry.setState(TOKEN_STREAM, CacheState.FLUSHED); 1134 entry.setState(TOKEN_STREAM, CacheState.FLUSHED);
1104 setValue(UNITS, <Source>[librarySource]); 1135 setValue(UNITS, <Source>[librarySource]);
1105 1136
1106 LibrarySpecificUnit unit = 1137 LibrarySpecificUnit unit =
1107 new LibrarySpecificUnit(librarySource, librarySource); 1138 new LibrarySpecificUnit(librarySource, librarySource);
1108 entry = getCacheEntry(unit); 1139 entry = getCacheEntry(unit);
1109 setValue(HINTS, AnalysisError.NO_ERRORS); 1140 setValue(HINTS, AnalysisError.NO_ERRORS);
1110 // dartEntry.setValue(LINTS, AnalysisError.NO_ERRORS); 1141 setValue(LINTS, AnalysisError.NO_ERRORS);
1111 entry.setState(RESOLVE_REFERENCES_ERRORS, CacheState.FLUSHED); 1142 setValue(LIBRARY_UNIT_ERRORS, AnalysisError.NO_ERRORS);
1143 setValue(RESOLVE_TYPE_NAMES_ERRORS, AnalysisError.NO_ERRORS);
1144 setValue(RESOLVE_UNIT_ERRORS, AnalysisError.NO_ERRORS);
1112 entry.setState(RESOLVED_UNIT, CacheState.FLUSHED); 1145 entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
1113 entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED); 1146 entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED);
1114 entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED); 1147 entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED);
1115 entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED); 1148 entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED);
1116 entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED); 1149 entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED);
1117 entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED); 1150 entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED);
1151 entry.setState(RESOLVED_UNIT6, CacheState.FLUSHED);
1152 entry.setState(RESOLVED_UNIT7, CacheState.FLUSHED);
1153 entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED);
1154 entry.setState(RESOLVED_UNIT9, CacheState.FLUSHED);
1118 // USED_IMPORTED_ELEMENTS 1155 // USED_IMPORTED_ELEMENTS
1119 // USED_LOCAL_ELEMENTS 1156 // USED_LOCAL_ELEMENTS
1157 setValue(VARIABLE_REFERENCE_ERRORS, AnalysisError.NO_ERRORS);
1120 setValue(VERIFY_ERRORS, AnalysisError.NO_ERRORS); 1158 setValue(VERIFY_ERRORS, AnalysisError.NO_ERRORS);
1121 }); 1159 });
1122 1160
1123 CacheEntry entry = getCacheEntry(AnalysisContextTarget.request); 1161 CacheEntry entry = getCacheEntry(AnalysisContextTarget.request);
1124 entry.setValue(TYPE_PROVIDER, typeProvider, TargetedResult.EMPTY_LIST); 1162 entry.setValue(TYPE_PROVIDER, typeProvider, TargetedResult.EMPTY_LIST);
1125 } 1163 }
1126 1164
1127 @override 1165 @override
1128 void removeListener(AnalysisListener listener) { 1166 void removeListener(AnalysisListener listener) {
1129 _listeners.remove(listener); 1167 _listeners.remove(listener);
1130 } 1168 }
1131 1169
1132 @override 1170 @override
1133 CompilationUnit resolveCompilationUnit( 1171 CompilationUnit resolveCompilationUnit(
1134 Source unitSource, LibraryElement library) { 1172 Source unitSource, LibraryElement library) {
1135 if (library == null) { 1173 if (library == null) {
1136 return null; 1174 return null;
1137 } 1175 }
1138 return resolveCompilationUnit2(unitSource, library.source); 1176 return resolveCompilationUnit2(unitSource, library.source);
1139 } 1177 }
1140 1178
1141 @override 1179 @override
1142 CompilationUnit resolveCompilationUnit2( 1180 CompilationUnit resolveCompilationUnit2(
1143 Source unitSource, Source librarySource) { 1181 Source unitSource, Source librarySource) {
1144 if (!AnalysisEngine.isDartFileName(unitSource.shortName) ||
1145 !AnalysisEngine.isDartFileName(librarySource.shortName)) {
1146 return null;
1147 }
1148 return computeResult( 1182 return computeResult(
1149 new LibrarySpecificUnit(librarySource, unitSource), RESOLVED_UNIT); 1183 new LibrarySpecificUnit(librarySource, unitSource), RESOLVED_UNIT);
1150 } 1184 }
1151 1185
1152 @override 1186 @override
1153 @deprecated 1187 @deprecated
1154 ht.HtmlUnit resolveHtmlUnit(Source htmlSource) { 1188 ht.HtmlUnit resolveHtmlUnit(Source htmlSource) {
1155 // TODO(brianwilkerson) Remove this method after switching to the new task 1189 // TODO(brianwilkerson) Remove this method after switching to the new task
1156 // model. 1190 // model.
1157 throw new UnimplementedError('Not supported in the new task model'); 1191 throw new UnimplementedError('Not supported in the new task model');
(...skipping 27 matching lines...) Expand all
1185 1219
1186 @override 1220 @override
1187 void test_flushAstStructures(Source source) { 1221 void test_flushAstStructures(Source source) {
1188 CacheEntry entry = getCacheEntry(source); 1222 CacheEntry entry = getCacheEntry(source);
1189 entry.setState(PARSED_UNIT, CacheState.FLUSHED); 1223 entry.setState(PARSED_UNIT, CacheState.FLUSHED);
1190 entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED); 1224 entry.setState(RESOLVED_UNIT1, CacheState.FLUSHED);
1191 entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED); 1225 entry.setState(RESOLVED_UNIT2, CacheState.FLUSHED);
1192 entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED); 1226 entry.setState(RESOLVED_UNIT3, CacheState.FLUSHED);
1193 entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED); 1227 entry.setState(RESOLVED_UNIT4, CacheState.FLUSHED);
1194 entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED); 1228 entry.setState(RESOLVED_UNIT5, CacheState.FLUSHED);
1229 entry.setState(RESOLVED_UNIT6, CacheState.FLUSHED);
1230 entry.setState(RESOLVED_UNIT7, CacheState.FLUSHED);
1231 entry.setState(RESOLVED_UNIT8, CacheState.FLUSHED);
1232 entry.setState(RESOLVED_UNIT9, CacheState.FLUSHED);
1195 entry.setState(RESOLVED_UNIT, CacheState.FLUSHED); 1233 entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
1196 } 1234 }
1197 1235
1198 @override 1236 @override
1199 bool validateCacheConsistency() { 1237 bool validateCacheConsistency() {
1200 int consistencyCheckStart = JavaSystem.nanoTime(); 1238 int consistencyCheckStart = JavaSystem.nanoTime();
1201 HashSet<Source> changedSources = new HashSet<Source>(); 1239 HashSet<Source> changedSources = new HashSet<Source>();
1202 HashSet<Source> missingSources = new HashSet<Source>(); 1240 HashSet<Source> missingSources = new HashSet<Source>();
1203 for (Source source in _cache.sources) { 1241 for (Source source in _cache.sources) {
1204 CacheEntry entry = _cache.get(source); 1242 CacheEntry entry = _cache.get(source);
1205 int sourceTime = getModificationStamp(source); 1243 int sourceTime = getModificationStamp(source);
1206 if (sourceTime != entry.modificationTime) { 1244 if (sourceTime != entry.modificationTime) {
1207 changedSources.add(source); 1245 changedSources.add(source);
1208 } 1246 }
1209 if (entry.exception != null) { 1247 if (entry.exception != null) {
1210 if (!exists(source)) { 1248 if (!exists(source)) {
1211 missingSources.add(source); 1249 missingSources.add(source);
1212 } 1250 }
1213 } 1251 }
1214 } 1252 }
1215 for (Source source in changedSources) { 1253 for (Source source in changedSources) {
1216 _sourceChanged(source); 1254 _sourceChanged(source);
1217 } 1255 }
1218 int removalCount = 0; 1256 int removalCount = 0;
1219 for (Source source in missingSources) { 1257 for (Source source in missingSources) {
1220 if (getLibrariesContaining(source).isEmpty && 1258 if (getLibrariesContaining(source).isEmpty &&
1221 getLibrariesDependingOn(source).isEmpty) { 1259 getLibrariesDependingOn(source).isEmpty) {
1222 _cache.remove(source); 1260 _removeFromCache(source);
1223 removalCount++; 1261 removalCount++;
1224 } 1262 }
1225 } 1263 }
1226 int consistencyCheckEnd = JavaSystem.nanoTime(); 1264 int consistencyCheckEnd = JavaSystem.nanoTime();
1227 if (changedSources.length > 0 || missingSources.length > 0) { 1265 if (changedSources.length > 0 || missingSources.length > 0) {
1228 StringBuffer buffer = new StringBuffer(); 1266 StringBuffer buffer = new StringBuffer();
1229 buffer.write("Consistency check took "); 1267 buffer.write("Consistency check took ");
1230 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0); 1268 buffer.write((consistencyCheckEnd - consistencyCheckStart) / 1000000.0);
1231 buffer.writeln(" ms and found"); 1269 buffer.writeln(" ms and found");
1232 buffer.write(" "); 1270 buffer.write(" ");
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
1420 /** 1458 /**
1421 * Create a cache entry for the given [source]. The source was explicitly 1459 * Create a cache entry for the given [source]. The source was explicitly
1422 * added to this context if [explicitlyAdded] is `true`. Return the cache 1460 * added to this context if [explicitlyAdded] is `true`. Return the cache
1423 * entry that was created. 1461 * entry that was created.
1424 */ 1462 */
1425 CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) { 1463 CacheEntry _createCacheEntry(Source source, bool explicitlyAdded) {
1426 CacheEntry entry = new CacheEntry(source); 1464 CacheEntry entry = new CacheEntry(source);
1427 entry.modificationTime = getModificationStamp(source); 1465 entry.modificationTime = getModificationStamp(source);
1428 entry.explicitlyAdded = explicitlyAdded; 1466 entry.explicitlyAdded = explicitlyAdded;
1429 _cache.put(entry); 1467 _cache.put(entry);
1468 if (!explicitlyAdded) {
1469 _implicitAnalysisEventsController
1470 .add(new ImplicitAnalysisEvent(source, true));
1471 }
1430 return entry; 1472 return entry;
1431 } 1473 }
1432 1474
1433 /** 1475 /**
1434 * Return a list containing all of the cache entries for targets associated 1476 * Return a list containing all of the cache entries for targets associated
1435 * with the given [source]. 1477 * with the given [source].
1436 */ 1478 */
1437 List<CacheEntry> _entriesFor(Source source) { 1479 List<CacheEntry> _entriesFor(Source source) {
1438 List<CacheEntry> entries = <CacheEntry>[]; 1480 List<CacheEntry> entries = <CacheEntry>[];
1439 MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator(); 1481 MapIterator<AnalysisTarget, CacheEntry> iterator = _cache.iterator();
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 return Source.EMPTY_LIST; 1542 return Source.EMPTY_LIST;
1501 } 1543 }
1502 return sources; 1544 return sources;
1503 } 1545 }
1504 1546
1505 /** 1547 /**
1506 * Look at the given [source] to see whether a task needs to be performed 1548 * Look at the given [source] to see whether a task needs to be performed
1507 * related to it. If so, add the source to the set of sources that need to be 1549 * related to it. If so, add the source to the set of sources that need to be
1508 * processed. This method is intended to be used for testing purposes only. 1550 * processed. This method is intended to be used for testing purposes only.
1509 */ 1551 */
1510 void _getSourcesNeedingProcessing(Source source, CacheEntry entry, 1552 void _getSourcesNeedingProcessing(
1511 bool isPriority, bool hintsEnabled, bool lintsEnabled, 1553 Source source,
1554 CacheEntry entry,
1555 bool isPriority,
1556 bool hintsEnabled,
1557 bool lintsEnabled,
1512 HashSet<Source> sources) { 1558 HashSet<Source> sources) {
1513 CacheState state = entry.getState(CONTENT); 1559 CacheState state = entry.getState(CONTENT);
1514 if (state == CacheState.INVALID || 1560 if (state == CacheState.INVALID ||
1515 (isPriority && state == CacheState.FLUSHED)) { 1561 (isPriority && state == CacheState.FLUSHED)) {
1516 sources.add(source); 1562 sources.add(source);
1517 return; 1563 return;
1518 } else if (state == CacheState.ERROR) { 1564 } else if (state == CacheState.ERROR) {
1519 return; 1565 return;
1520 } 1566 }
1521 state = entry.getState(SOURCE_KIND); 1567 state = entry.getState(SOURCE_KIND);
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1582 if (hintsEnabled) { 1628 if (hintsEnabled) {
1583 state = unitEntry.getState(HINTS); 1629 state = unitEntry.getState(HINTS);
1584 if (state == CacheState.INVALID || 1630 if (state == CacheState.INVALID ||
1585 (isPriority && state == CacheState.FLUSHED)) { 1631 (isPriority && state == CacheState.FLUSHED)) {
1586 sources.add(source); 1632 sources.add(source);
1587 return; 1633 return;
1588 } else if (state == CacheState.ERROR) { 1634 } else if (state == CacheState.ERROR) {
1589 return; 1635 return;
1590 } 1636 }
1591 } 1637 }
1592 // if (lintsEnabled) { 1638 if (lintsEnabled) {
1593 // state = unitEntry.getState(LINTS); 1639 state = unitEntry.getState(LINTS);
1594 // if (state == CacheState.INVALID || 1640 if (state == CacheState.INVALID ||
1595 // (isPriority && state == CacheState.FLUSHED)) { 1641 (isPriority && state == CacheState.FLUSHED)) {
1596 // sources.add(source); 1642 sources.add(source);
1597 // return; 1643 return;
1598 // } else if (state == CacheState.ERROR) { 1644 } else if (state == CacheState.ERROR) {
1599 // return; 1645 return;
1600 // } 1646 }
1601 // } 1647 }
1602 } 1648 }
1603 } 1649 }
1604 // } else if (kind == SourceKind.HTML) { 1650 // } else if (kind == SourceKind.HTML) {
1605 // CacheState parsedUnitState = entry.getState(HtmlEntry.PARSED_UNIT); 1651 // CacheState parsedUnitState = entry.getState(HtmlEntry.PARSED_UNIT);
1606 // if (parsedUnitState == CacheState.INVALID || 1652 // if (parsedUnitState == CacheState.INVALID ||
1607 // (isPriority && parsedUnitState == CacheState.FLUSHED)) { 1653 // (isPriority && parsedUnitState == CacheState.FLUSHED)) {
1608 // sources.add(source); 1654 // sources.add(source);
1609 // return; 1655 // return;
1610 // } 1656 // }
1611 // CacheState resolvedUnitState = 1657 // CacheState resolvedUnitState =
(...skipping 18 matching lines...) Expand all
1630 * given [source] has been updated to the given [errors]. 1676 * given [source] has been updated to the given [errors].
1631 */ 1677 */
1632 void _notifyErrors( 1678 void _notifyErrors(
1633 Source source, List<AnalysisError> errors, LineInfo lineInfo) { 1679 Source source, List<AnalysisError> errors, LineInfo lineInfo) {
1634 int count = _listeners.length; 1680 int count = _listeners.length;
1635 for (int i = 0; i < count; i++) { 1681 for (int i = 0; i < count; i++) {
1636 _listeners[i].computedErrors(this, source, errors, lineInfo); 1682 _listeners[i].computedErrors(this, source, errors, lineInfo);
1637 } 1683 }
1638 } 1684 }
1639 1685
1686 void _removeFromCache(Source source) {
1687 CacheEntry entry = _cache.remove(source);
1688 if (entry != null && !entry.explicitlyAdded) {
1689 _implicitAnalysisEventsController
1690 .add(new ImplicitAnalysisEvent(source, false));
1691 }
1692 }
1693
1640 /** 1694 /**
1641 * Remove the given [source] from the priority order if it is in the list. 1695 * Remove the given [source] from the priority order if it is in the list.
1642 */ 1696 */
1643 void _removeFromPriorityOrder(Source source) { 1697 void _removeFromPriorityOrder(Source source) {
1644 int count = _priorityOrder.length; 1698 int count = _priorityOrder.length;
1645 List<Source> newOrder = <Source>[]; 1699 List<Source> newOrder = <Source>[];
1646 for (int i = 0; i < count; i++) { 1700 for (int i = 0; i < count; i++) {
1647 if (_priorityOrder[i] != source) { 1701 if (_priorityOrder[i] != source) {
1648 newOrder.add(_priorityOrder[i]); 1702 newOrder.add(_priorityOrder[i]);
1649 } 1703 }
1650 } 1704 }
1651 if (newOrder.length < count) { 1705 if (newOrder.length < count) {
1652 analysisPriorityOrder = newOrder; 1706 analysisPriorityOrder = newOrder;
1653 } 1707 }
1654 } 1708 }
1655 1709
1656 /** 1710 /**
1657 * Create an entry for the newly added [source] and invalidate any sources 1711 * Create an entry for the newly added [source] and invalidate any sources
1658 * that referenced the source before it existed. 1712 * that referenced the source before it existed.
1659 */ 1713 */
1660 void _sourceAvailable(Source source) { 1714 void _sourceAvailable(Source source) {
1715 // TODO(brianwilkerson) This method needs to check whether the source was
1716 // previously being implicitly analyzed. If so, the cache entry needs to be
1717 // update to reflect the new status and an event needs to be generated to
1718 // inform clients that it is no longer being implicitly analyzed.
1661 CacheEntry entry = _cache.get(source); 1719 CacheEntry entry = _cache.get(source);
1662 if (entry == null) { 1720 if (entry == null) {
1663 _createCacheEntry(source, true); 1721 _createCacheEntry(source, true);
1664 } else { 1722 } else {
1665 entry.modificationTime = getModificationStamp(source); 1723 entry.modificationTime = getModificationStamp(source);
1666 entry.setState(CONTENT, CacheState.INVALID); 1724 entry.setState(CONTENT, CacheState.INVALID);
1667 } 1725 }
1668 } 1726 }
1669 1727
1670 /** 1728 /**
(...skipping 13 matching lines...) Expand all
1684 entry.setState(CONTENT, CacheState.FLUSHED); 1742 entry.setState(CONTENT, CacheState.FLUSHED);
1685 try { 1743 try {
1686 TimestampedData<String> fileContents = getContents(source); 1744 TimestampedData<String> fileContents = getContents(source);
1687 if (fileContents.data == sourceContent) { 1745 if (fileContents.data == sourceContent) {
1688 int time = fileContents.modificationTime; 1746 int time = fileContents.modificationTime;
1689 for (CacheEntry entry in _entriesFor(source)) { 1747 for (CacheEntry entry in _entriesFor(source)) {
1690 entry.modificationTime = time; 1748 entry.modificationTime = time;
1691 } 1749 }
1692 return; 1750 return;
1693 } 1751 }
1694 } catch (e) {} 1752 } catch (e) {
1753 entry.modificationTime = -1;
1754 }
1695 } 1755 }
1696 // We need to invalidate the cache. 1756 // We need to invalidate the cache.
1697 { 1757 {
1698 Object delta = null; 1758 Object delta = null;
1699 if (AnalysisEngine.instance.limitInvalidationInTaskModel && 1759 if (AnalysisEngine.instance.limitInvalidationInTaskModel &&
1700 AnalysisEngine.isDartFileName(source.fullName)) { 1760 AnalysisEngine.isDartFileName(source.fullName)) {
1701 // TODO(scheglov) Incorrect implementation in general. 1761 // TODO(scheglov) Incorrect implementation in general.
1702 entry.setState(TOKEN_STREAM, CacheState.FLUSHED); 1762 entry.setState(TOKEN_STREAM, CacheState.FLUSHED);
1703 entry.setState(PARSED_UNIT, CacheState.FLUSHED); 1763 entry.setState(PARSED_UNIT, CacheState.FLUSHED);
1704 List<Source> librarySources = getLibrariesContaining(source); 1764 List<Source> librarySources = getLibrariesContaining(source);
(...skipping 16 matching lines...) Expand all
1721 // 'dartDelta: add=${dartDelta.addedNames} remove=${dartDelta.r emovedNames}'); 1781 // 'dartDelta: add=${dartDelta.addedNames} remove=${dartDelta.r emovedNames}');
1722 delta = dartDelta; 1782 delta = dartDelta;
1723 entry.setState(CONTENT, CacheState.INVALID, delta: delta); 1783 entry.setState(CONTENT, CacheState.INVALID, delta: delta);
1724 return; 1784 return;
1725 } 1785 }
1726 } 1786 }
1727 } 1787 }
1728 } 1788 }
1729 entry.setState(CONTENT, CacheState.INVALID); 1789 entry.setState(CONTENT, CacheState.INVALID);
1730 } 1790 }
1731 dartWorkManager.applyChange( 1791 for (WorkManager workManager in workManagers) {
1732 Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); 1792 workManager.applyChange(
1733 htmlWorkManager.applyChange( 1793 Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST);
1734 Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); 1794 }
1735 } 1795 }
1736 1796
1737 /** 1797 /**
1738 * Record that the give [source] has been deleted. 1798 * Record that the give [source] has been deleted.
1739 */ 1799 */
1740 void _sourceDeleted(Source source) { 1800 void _sourceDeleted(Source source) {
1741 // TODO(brianwilkerson) Implement this. 1801 // TODO(brianwilkerson) Implement or remove this.
1742 // SourceEntry sourceEntry = _cache.get(source); 1802 // SourceEntry sourceEntry = _cache.get(source);
1743 // if (sourceEntry is HtmlEntry) { 1803 // if (sourceEntry is HtmlEntry) {
1744 // HtmlEntry htmlEntry = sourceEntry; 1804 // HtmlEntry htmlEntry = sourceEntry;
1745 // htmlEntry.recordContentError(new CaughtException( 1805 // htmlEntry.recordContentError(new CaughtException(
1746 // new AnalysisException("This source was marked as being deleted"), 1806 // new AnalysisException("This source was marked as being deleted"),
1747 // null)); 1807 // null));
1748 // } else if (sourceEntry is DartEntry) { 1808 // } else if (sourceEntry is DartEntry) {
1749 // DartEntry dartEntry = sourceEntry; 1809 // DartEntry dartEntry = sourceEntry;
1750 // HashSet<Source> libraries = new HashSet<Source>(); 1810 // HashSet<Source> libraries = new HashSet<Source>();
1751 // for (Source librarySource in getLibrariesContaining(source)) { 1811 // for (Source librarySource in getLibrariesContaining(source)) {
(...skipping 10 matching lines...) Expand all
1762 // new AnalysisException("This source was marked as being deleted"), 1822 // new AnalysisException("This source was marked as being deleted"),
1763 // null)); 1823 // null));
1764 // } 1824 // }
1765 _removeFromPriorityOrder(source); 1825 _removeFromPriorityOrder(source);
1766 } 1826 }
1767 1827
1768 /** 1828 /**
1769 * Record that the given [source] has been removed. 1829 * Record that the given [source] has been removed.
1770 */ 1830 */
1771 void _sourceRemoved(Source source) { 1831 void _sourceRemoved(Source source) {
1772 _cache.remove(source); 1832 _removeFromCache(source);
1773 _removeFromPriorityOrder(source); 1833 _removeFromPriorityOrder(source);
1774 } 1834 }
1775 1835
1776 /** 1836 /**
1777 * TODO(scheglov) A hackish, limited incremental resolution implementation. 1837 * TODO(scheglov) A hackish, limited incremental resolution implementation.
1778 */ 1838 */
1779 bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) { 1839 bool _tryPoorMansIncrementalResolution(Source unitSource, String newCode) {
1780 return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() { 1840 return PerformanceStatistics.incrementalAnalysis.makeCurrentWhile(() {
1781 incrementalResolutionValidation_lastUnitSource = null; 1841 incrementalResolutionValidation_lastUnitSource = null;
1782 incrementalResolutionValidation_lastLibrarySource = null; 1842 incrementalResolutionValidation_lastLibrarySource = null;
(...skipping 21 matching lines...) Expand all
1804 } 1864 }
1805 // prepare the existing unit 1865 // prepare the existing unit
1806 CompilationUnit oldUnit = 1866 CompilationUnit oldUnit =
1807 getResolvedCompilationUnit2(unitSource, librarySource); 1867 getResolvedCompilationUnit2(unitSource, librarySource);
1808 if (oldUnit == null) { 1868 if (oldUnit == null) {
1809 return false; 1869 return false;
1810 } 1870 }
1811 // do resolution 1871 // do resolution
1812 Stopwatch perfCounter = new Stopwatch()..start(); 1872 Stopwatch perfCounter = new Stopwatch()..start();
1813 PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver( 1873 PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver(
1814 typeProvider, unitSource, null, sourceEntry, unitEntry, oldUnit, 1874 typeProvider,
1815 analysisOptions.incrementalApi, analysisOptions); 1875 unitSource,
1876 null,
1877 sourceEntry,
1878 unitEntry,
1879 oldUnit,
1880 analysisOptions.incrementalApi);
1816 bool success = resolver.resolve(newCode); 1881 bool success = resolver.resolve(newCode);
1817 AnalysisEngine.instance.instrumentationService.logPerformance( 1882 AnalysisEngine.instance.instrumentationService.logPerformance(
1818 AnalysisPerformanceKind.INCREMENTAL, perfCounter, 1883 AnalysisPerformanceKind.INCREMENTAL,
1884 perfCounter,
1819 'success=$success,context_id=$_id,code_length=${newCode.length}'); 1885 'success=$success,context_id=$_id,code_length=${newCode.length}');
1820 if (!success) { 1886 if (!success) {
1821 return false; 1887 return false;
1822 } 1888 }
1823 // if validation, remember the result, but throw it away 1889 // if validation, remember the result, but throw it away
1824 if (analysisOptions.incrementalValidation) { 1890 if (analysisOptions.incrementalValidation) {
1825 incrementalResolutionValidation_lastUnitSource = oldUnit.element.source; 1891 incrementalResolutionValidation_lastUnitSource = oldUnit.element.source;
1826 incrementalResolutionValidation_lastLibrarySource = 1892 incrementalResolutionValidation_lastLibrarySource =
1827 oldUnit.element.library.source; 1893 oldUnit.element.library.source;
1828 incrementalResolutionValidation_lastUnit = oldUnit; 1894 incrementalResolutionValidation_lastUnit = oldUnit;
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
2022 new PendingFuture<T>(_context, target, computeValue); 2088 new PendingFuture<T>(_context, target, computeValue);
2023 if (!pendingFuture.evaluate(entry)) { 2089 if (!pendingFuture.evaluate(entry)) {
2024 _context._pendingFutureTargets 2090 _context._pendingFutureTargets
2025 .putIfAbsent(target, () => <PendingFuture>[]) 2091 .putIfAbsent(target, () => <PendingFuture>[])
2026 .add(pendingFuture); 2092 .add(pendingFuture);
2027 scheduleComputation(); 2093 scheduleComputation();
2028 } 2094 }
2029 return pendingFuture.future; 2095 return pendingFuture.future;
2030 } 2096 }
2031 } 2097 }
OLDNEW
« no previous file with comments | « packages/analyzer/lib/src/context/cache.dart ('k') | packages/analyzer/lib/src/error.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698