| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library analyzer.src.context.context; | 5 library analyzer.src.context.context; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 | 9 |
| 10 import 'package:analyzer/instrumentation/instrumentation.dart'; | 10 import 'package:analyzer/instrumentation/instrumentation.dart'; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 import 'package:analyzer/src/generated/java_core.dart'; | 26 import 'package:analyzer/src/generated/java_core.dart'; |
| 27 import 'package:analyzer/src/generated/java_engine.dart'; | 27 import 'package:analyzer/src/generated/java_engine.dart'; |
| 28 import 'package:analyzer/src/generated/resolver.dart'; | 28 import 'package:analyzer/src/generated/resolver.dart'; |
| 29 import 'package:analyzer/src/generated/scanner.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'; |
| 36 import 'package:analyzer/src/task/manager.dart'; | 38 import 'package:analyzer/src/task/manager.dart'; |
| 37 import 'package:analyzer/task/dart.dart'; | 39 import 'package:analyzer/task/dart.dart'; |
| 38 import 'package:analyzer/task/general.dart'; | 40 import 'package:analyzer/task/general.dart'; |
| 39 import 'package:analyzer/task/html.dart'; | 41 import 'package:analyzer/task/html.dart'; |
| 40 import 'package:analyzer/task/model.dart'; | 42 import 'package:analyzer/task/model.dart'; |
| 41 import 'package:html/dom.dart' show Document; | 43 import 'package:html/dom.dart' show Document; |
| 42 | 44 |
| 43 /** | 45 /** |
| 44 * Type of callback functions used by PendingFuture. Functions of this type | 46 * Type of callback functions used by PendingFuture. Functions of this type |
| 45 * should perform a computation based on the data in [entry] and return it. If | 47 * should perform a computation based on the data in [entry] and return it. If |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 * The task manager used to manage the tasks used to analyze code. | 119 * The task manager used to manage the tasks used to analyze code. |
| 118 */ | 120 */ |
| 119 TaskManager _taskManager; | 121 TaskManager _taskManager; |
| 120 | 122 |
| 121 /** | 123 /** |
| 122 * The [DartWorkManager] instance that performs Dart specific scheduling. | 124 * The [DartWorkManager] instance that performs Dart specific scheduling. |
| 123 */ | 125 */ |
| 124 DartWorkManager dartWorkManager; | 126 DartWorkManager dartWorkManager; |
| 125 | 127 |
| 126 /** | 128 /** |
| 129 * The work manager that performs HTML specific scheduling. |
| 130 */ |
| 131 HtmlWorkManager htmlWorkManager; |
| 132 |
| 133 /** |
| 127 * The analysis driver used to perform analysis. | 134 * The analysis driver used to perform analysis. |
| 128 */ | 135 */ |
| 129 AnalysisDriver driver; | 136 AnalysisDriver driver; |
| 130 | 137 |
| 131 /** | 138 /** |
| 132 * A list containing sources for which data should not be flushed. | 139 * A list containing sources for which data should not be flushed. |
| 133 */ | 140 */ |
| 134 List<Source> _priorityOrder = <Source>[]; | 141 List<Source> _priorityOrder = <Source>[]; |
| 135 | 142 |
| 136 /** | 143 /** |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 | 212 |
| 206 /** | 213 /** |
| 207 * Initialize a newly created analysis context. | 214 * Initialize a newly created analysis context. |
| 208 */ | 215 */ |
| 209 AnalysisContextImpl() { | 216 AnalysisContextImpl() { |
| 210 _privatePartition = new UniversalCachePartition(this); | 217 _privatePartition = new UniversalCachePartition(this); |
| 211 _cache = createCacheFromSourceFactory(null); | 218 _cache = createCacheFromSourceFactory(null); |
| 212 _taskManager = AnalysisEngine.instance.taskManager; | 219 _taskManager = AnalysisEngine.instance.taskManager; |
| 213 // TODO(scheglov) Get WorkManager(Factory)(s) from plugins. | 220 // TODO(scheglov) Get WorkManager(Factory)(s) from plugins. |
| 214 dartWorkManager = new DartWorkManager(this); | 221 dartWorkManager = new DartWorkManager(this); |
| 215 driver = | 222 htmlWorkManager = new HtmlWorkManager(this); |
| 216 new AnalysisDriver(_taskManager, <WorkManager>[dartWorkManager], this); | 223 driver = new AnalysisDriver( |
| 224 _taskManager, <WorkManager>[dartWorkManager, htmlWorkManager], this); |
| 217 _onSourcesChangedController = | 225 _onSourcesChangedController = |
| 218 new StreamController<SourcesChangedEvent>.broadcast(); | 226 new StreamController<SourcesChangedEvent>.broadcast(); |
| 219 } | 227 } |
| 220 | 228 |
| 221 @override | 229 @override |
| 222 AnalysisCache get analysisCache => _cache; | 230 AnalysisCache get analysisCache => _cache; |
| 223 | 231 |
| 224 @override | 232 @override |
| 225 AnalysisOptions get analysisOptions => _options; | 233 AnalysisOptions get analysisOptions => _options; |
| 226 | 234 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 250 this._options.enableNullAwareOperators = options.enableNullAwareOperators; | 258 this._options.enableNullAwareOperators = options.enableNullAwareOperators; |
| 251 this._options.enableStrictCallChecks = options.enableStrictCallChecks; | 259 this._options.enableStrictCallChecks = options.enableStrictCallChecks; |
| 252 this._options.hint = options.hint; | 260 this._options.hint = options.hint; |
| 253 this._options.incremental = options.incremental; | 261 this._options.incremental = options.incremental; |
| 254 this._options.incrementalApi = options.incrementalApi; | 262 this._options.incrementalApi = options.incrementalApi; |
| 255 this._options.incrementalValidation = options.incrementalValidation; | 263 this._options.incrementalValidation = options.incrementalValidation; |
| 256 this._options.lint = options.lint; | 264 this._options.lint = options.lint; |
| 257 this._options.preserveComments = options.preserveComments; | 265 this._options.preserveComments = options.preserveComments; |
| 258 if (needsRecompute) { | 266 if (needsRecompute) { |
| 259 dartWorkManager.onAnalysisOptionsChanged(); | 267 dartWorkManager.onAnalysisOptionsChanged(); |
| 268 htmlWorkManager.onAnalysisOptionsChanged(); |
| 260 } | 269 } |
| 261 } | 270 } |
| 262 | 271 |
| 263 @override | 272 @override |
| 264 void set analysisPriorityOrder(List<Source> sources) { | 273 void set analysisPriorityOrder(List<Source> sources) { |
| 265 if (sources == null || sources.isEmpty) { | 274 if (sources == null || sources.isEmpty) { |
| 266 _priorityOrder = Source.EMPTY_LIST; | 275 _priorityOrder = Source.EMPTY_LIST; |
| 267 } else { | 276 } else { |
| 268 while (sources.remove(null)) { | 277 while (sources.remove(null)) { |
| 269 // Nothing else to do. | 278 // Nothing else to do. |
| 270 } | 279 } |
| 271 if (sources.isEmpty) { | 280 if (sources.isEmpty) { |
| 272 _priorityOrder = Source.EMPTY_LIST; | 281 _priorityOrder = Source.EMPTY_LIST; |
| 273 } else { | 282 } else { |
| 274 _priorityOrder = sources; | 283 _priorityOrder = sources; |
| 275 } | 284 } |
| 276 } | 285 } |
| 277 dartWorkManager.applyPriorityTargets(_priorityOrder); | 286 dartWorkManager.applyPriorityTargets(_priorityOrder); |
| 287 htmlWorkManager.applyPriorityTargets(_priorityOrder); |
| 278 } | 288 } |
| 279 | 289 |
| 280 @override | 290 @override |
| 281 set contentCache(ContentCache value) { | 291 set contentCache(ContentCache value) { |
| 282 _contentCache = value; | 292 _contentCache = value; |
| 283 } | 293 } |
| 284 | 294 |
| 285 @override | 295 @override |
| 286 DeclaredVariables get declaredVariables => _declaredVariables; | 296 DeclaredVariables get declaredVariables => _declaredVariables; |
| 287 | 297 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 throw new IllegalStateException( | 375 throw new IllegalStateException( |
| 366 "Source factories cannot be shared between contexts"); | 376 "Source factories cannot be shared between contexts"); |
| 367 } | 377 } |
| 368 if (_sourceFactory != null) { | 378 if (_sourceFactory != null) { |
| 369 _sourceFactory.context = null; | 379 _sourceFactory.context = null; |
| 370 } | 380 } |
| 371 factory.context = this; | 381 factory.context = this; |
| 372 _sourceFactory = factory; | 382 _sourceFactory = factory; |
| 373 _cache = createCacheFromSourceFactory(factory); | 383 _cache = createCacheFromSourceFactory(factory); |
| 374 dartWorkManager.onSourceFactoryChanged(); | 384 dartWorkManager.onSourceFactoryChanged(); |
| 385 htmlWorkManager.onSourceFactoryChanged(); |
| 375 } | 386 } |
| 376 | 387 |
| 377 @override | 388 @override |
| 378 List<Source> get sources { | 389 List<Source> get sources { |
| 379 return _cache.sources.toList(); | 390 return _cache.sources.toList(); |
| 380 } | 391 } |
| 381 | 392 |
| 382 /** | 393 /** |
| 383 * Return a list of the sources that would be processed by | 394 * Return a list of the sources that would be processed by |
| 384 * [performAnalysisTask]. This method duplicates, and must therefore be kept | 395 * [performAnalysisTask]. This method duplicates, and must therefore be kept |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 change.oldLength, change.newLength); | 526 change.oldLength, change.newLength); |
| 516 }); | 527 }); |
| 517 for (Source source in changeSet.deletedSources) { | 528 for (Source source in changeSet.deletedSources) { |
| 518 _sourceDeleted(source); | 529 _sourceDeleted(source); |
| 519 } | 530 } |
| 520 for (Source source in removedSources) { | 531 for (Source source in removedSources) { |
| 521 _sourceRemoved(source); | 532 _sourceRemoved(source); |
| 522 } | 533 } |
| 523 dartWorkManager.applyChange( | 534 dartWorkManager.applyChange( |
| 524 changeSet.addedSources, changeSet.changedSources, removedSources); | 535 changeSet.addedSources, changeSet.changedSources, removedSources); |
| 536 htmlWorkManager.applyChange( |
| 537 changeSet.addedSources, changeSet.changedSources, removedSources); |
| 525 _onSourcesChangedController.add(new SourcesChangedEvent(changeSet)); | 538 _onSourcesChangedController.add(new SourcesChangedEvent(changeSet)); |
| 526 } | 539 } |
| 527 | 540 |
| 528 @override | 541 @override |
| 529 String computeDocumentationComment(Element element) { | 542 String computeDocumentationComment(Element element) { |
| 530 if (element == null) { | 543 if (element == null) { |
| 531 return null; | 544 return null; |
| 532 } | 545 } |
| 533 Source source = element.source; | 546 Source source = element.source; |
| 534 if (source == null) { | 547 if (source == null) { |
| (...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 762 // If the location cannot be decoded for some reason then the underlying | 775 // If the location cannot be decoded for some reason then the underlying |
| 763 // cause should have been logged already and we can fall though to return | 776 // cause should have been logged already and we can fall though to return |
| 764 // null. | 777 // null. |
| 765 } | 778 } |
| 766 return null; | 779 return null; |
| 767 } | 780 } |
| 768 | 781 |
| 769 @override | 782 @override |
| 770 AnalysisErrorInfo getErrors(Source source) { | 783 AnalysisErrorInfo getErrors(Source source) { |
| 771 String name = source.shortName; | 784 String name = source.shortName; |
| 772 if (AnalysisEngine.isDartFileName(name)) { | 785 if (AnalysisEngine.isDartFileName(name) || source is DartScript) { |
| 773 return dartWorkManager.getErrors(source); | 786 return dartWorkManager.getErrors(source); |
| 774 } else if (AnalysisEngine.isHtmlFileName(name)) { | 787 } else if (AnalysisEngine.isHtmlFileName(name)) { |
| 775 List<AnalysisError> errors = analysisCache.getValue(source, HTML_ERRORS); | 788 return htmlWorkManager.getErrors(source); |
| 776 // TODO(brianwilkerson) We don't currently have line info for HTML files. | |
| 777 return new AnalysisErrorInfoImpl(errors, null); | |
| 778 } | 789 } |
| 779 return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null); | 790 return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null); |
| 780 } | 791 } |
| 781 | 792 |
| 782 @override | 793 @override |
| 783 @deprecated | 794 @deprecated |
| 784 HtmlElement getHtmlElement(Source source) { | 795 HtmlElement getHtmlElement(Source source) { |
| 785 // TODO(brianwilkerson) Remove this method after switching to the new task | 796 // TODO(brianwilkerson) Remove this method after switching to the new task |
| 786 // model. | 797 // model. |
| 787 throw new UnimplementedError('Not supported in the new task model'); | 798 throw new UnimplementedError('Not supported in the new task model'); |
| (...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1695 entry.modificationTime = time; | 1706 entry.modificationTime = time; |
| 1696 } | 1707 } |
| 1697 return; | 1708 return; |
| 1698 } | 1709 } |
| 1699 } catch (e) {} | 1710 } catch (e) {} |
| 1700 } | 1711 } |
| 1701 // We need to invalidate the cache. | 1712 // We need to invalidate the cache. |
| 1702 entry.setState(CONTENT, CacheState.INVALID); | 1713 entry.setState(CONTENT, CacheState.INVALID); |
| 1703 dartWorkManager.applyChange( | 1714 dartWorkManager.applyChange( |
| 1704 Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); | 1715 Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); |
| 1716 htmlWorkManager.applyChange( |
| 1717 Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); |
| 1705 } | 1718 } |
| 1706 | 1719 |
| 1707 /** | 1720 /** |
| 1708 * Record that the give [source] has been deleted. | 1721 * Record that the give [source] has been deleted. |
| 1709 */ | 1722 */ |
| 1710 void _sourceDeleted(Source source) { | 1723 void _sourceDeleted(Source source) { |
| 1711 // TODO(brianwilkerson) Implement this. | 1724 // TODO(brianwilkerson) Implement this. |
| 1712 // SourceEntry sourceEntry = _cache.get(source); | 1725 // SourceEntry sourceEntry = _cache.get(source); |
| 1713 // if (sourceEntry is HtmlEntry) { | 1726 // if (sourceEntry is HtmlEntry) { |
| 1714 // HtmlEntry htmlEntry = sourceEntry; | 1727 // HtmlEntry htmlEntry = sourceEntry; |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1992 new PendingFuture<T>(_context, target, computeValue); | 2005 new PendingFuture<T>(_context, target, computeValue); |
| 1993 if (!pendingFuture.evaluate(entry)) { | 2006 if (!pendingFuture.evaluate(entry)) { |
| 1994 _context._pendingFutureTargets | 2007 _context._pendingFutureTargets |
| 1995 .putIfAbsent(target, () => <PendingFuture>[]) | 2008 .putIfAbsent(target, () => <PendingFuture>[]) |
| 1996 .add(pendingFuture); | 2009 .add(pendingFuture); |
| 1997 scheduleComputation(); | 2010 scheduleComputation(); |
| 1998 } | 2011 } |
| 1999 return pendingFuture.future; | 2012 return pendingFuture.future; |
| 2000 } | 2013 } |
| 2001 } | 2014 } |
| OLD | NEW |