Chromium Code Reviews| Index: pkg/analyzer/lib/src/context/context.dart |
| diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart |
| index e48a5ccefa829c9db919e8f394a6c47affbaf5c5..d4cf8feef6de7d91256507a9be2a81359185dbd9 100644 |
| --- a/pkg/analyzer/lib/src/context/context.dart |
| +++ b/pkg/analyzer/lib/src/context/context.dart |
| @@ -8,6 +8,7 @@ import 'dart:async'; |
| import 'dart:collection'; |
| import 'package:analyzer/instrumentation/instrumentation.dart'; |
| +import 'package:analyzer/plugin/task.dart'; |
| import 'package:analyzer/src/cancelable_future.dart'; |
| import 'package:analyzer/src/context/cache.dart'; |
| import 'package:analyzer/src/generated/ast.dart'; |
| @@ -33,8 +34,6 @@ import 'package:analyzer/src/generated/utilities_collection.dart'; |
| import 'package:analyzer/src/task/dart.dart'; |
| import 'package:analyzer/src/task/dart_work_manager.dart'; |
| import 'package:analyzer/src/task/driver.dart'; |
| -import 'package:analyzer/src/task/html.dart'; |
| -import 'package:analyzer/src/task/html_work_manager.dart'; |
| import 'package:analyzer/src/task/incremental_element_builder.dart'; |
| import 'package:analyzer/src/task/manager.dart'; |
| import 'package:analyzer/task/dart.dart'; |
| @@ -122,14 +121,14 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| TaskManager _taskManager; |
| /** |
| - * The [DartWorkManager] instance that performs Dart specific scheduling. |
| + * A list of all [WorkManager]s used by this context. |
| */ |
| - DartWorkManager dartWorkManager; |
| + final List<WorkManager> workManagers = <WorkManager>[]; |
| /** |
| - * The work manager that performs HTML specific scheduling. |
| + * The [DartWorkManager] instance that performs Dart specific scheduling. |
| */ |
| - HtmlWorkManager htmlWorkManager; |
| + DartWorkManager dartWorkManager; |
|
Brian Wilkerson
2015/08/24 21:43:09
Why does the dart work manager need to be special?
scheglov
2015/08/26 15:43:07
It is used 4 times.
1. In computeResolvedCompilat
|
| /** |
| * The analysis driver used to perform analysis. |
| @@ -219,11 +218,17 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| _privatePartition = new UniversalCachePartition(this); |
| _cache = createCacheFromSourceFactory(null); |
| _taskManager = AnalysisEngine.instance.taskManager; |
| - // TODO(scheglov) Get WorkManager(Factory)(s) from plugins. |
| - dartWorkManager = new DartWorkManager(this); |
| - htmlWorkManager = new HtmlWorkManager(this); |
| - driver = new AnalysisDriver( |
| - _taskManager, <WorkManager>[dartWorkManager, htmlWorkManager], this); |
| + for (WorkManagerFactory factory |
| + in AnalysisEngine.instance.enginePlugin.workManagerFactories) { |
| + WorkManager workManager = factory(this); |
| + if (workManager != null) { |
| + workManagers.add(workManager); |
| + if (workManager is DartWorkManager) { |
| + dartWorkManager = workManager; |
| + } |
| + } |
| + } |
| + driver = new AnalysisDriver(_taskManager, workManagers, this); |
| _onSourcesChangedController = |
| new StreamController<SourcesChangedEvent>.broadcast(); |
| _implicitAnalysisEventsController = |
| @@ -268,8 +273,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| this._options.lint = options.lint; |
| this._options.preserveComments = options.preserveComments; |
| if (needsRecompute) { |
| - dartWorkManager.onAnalysisOptionsChanged(); |
| - htmlWorkManager.onAnalysisOptionsChanged(); |
| + for (WorkManager workManager in workManagers) { |
| + workManager.onAnalysisOptionsChanged(); |
| + } |
| } |
| } |
| @@ -287,8 +293,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| _priorityOrder = sources; |
| } |
| } |
| - dartWorkManager.applyPriorityTargets(_priorityOrder); |
| - htmlWorkManager.applyPriorityTargets(_priorityOrder); |
| + for (WorkManager workManager in workManagers) { |
| + workManager.applyPriorityTargets(_priorityOrder); |
| + } |
| } |
| @override |
| @@ -360,7 +367,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| /** |
| * Make _pendingFutureSources available to unit tests. |
| */ |
| - HashMap<AnalysisTarget, List<PendingFuture>> get pendingFutureSources_forTesting => |
| + HashMap<AnalysisTarget, |
| + List<PendingFuture>> get pendingFutureSources_forTesting => |
| _pendingFutureTargets; |
| @override |
| @@ -389,8 +397,9 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| factory.context = this; |
| _sourceFactory = factory; |
| _cache = createCacheFromSourceFactory(factory); |
| - dartWorkManager.onSourceFactoryChanged(); |
| - htmlWorkManager.onSourceFactoryChanged(); |
| + for (WorkManager workManager in workManagers) { |
| + workManager.onSourceFactoryChanged(); |
| + } |
| } |
| @override |
| @@ -531,10 +540,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| for (Source source in removedSources) { |
| _sourceRemoved(source); |
| } |
| - dartWorkManager.applyChange( |
| - changeSet.addedSources, changeSet.changedSources, removedSources); |
| - htmlWorkManager.applyChange( |
| - changeSet.addedSources, changeSet.changedSources, removedSources); |
| + for (WorkManager workManager in workManagers) { |
| + workManager.applyChange( |
| + changeSet.addedSources, changeSet.changedSources, removedSources); |
| + } |
| _onSourcesChangedController.add(new SourcesChangedEvent(changeSet)); |
| } |
| @@ -635,8 +644,8 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| return new CancelableFuture.error(new AnalysisNotScheduledError()); |
| } |
| var unitTarget = new LibrarySpecificUnit(librarySource, unitSource); |
| - return new _AnalysisFutureHelper<CompilationUnit>(this).computeAsync( |
| - unitTarget, (CacheEntry entry) { |
| + return new _AnalysisFutureHelper<CompilationUnit>(this) |
| + .computeAsync(unitTarget, (CacheEntry entry) { |
| CacheState state = entry.getState(RESOLVED_UNIT); |
| if (state == CacheState.ERROR) { |
| throw entry.exception; |
| @@ -801,13 +810,13 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| @override |
| AnalysisErrorInfo getErrors(Source source) { |
| - String name = source.shortName; |
| - if (AnalysisEngine.isDartFileName(name) || source is DartScript) { |
| - return dartWorkManager.getErrors(source); |
| - } else if (AnalysisEngine.isHtmlFileName(name)) { |
| - return htmlWorkManager.getErrors(source); |
| + List<AnalysisError> allErrors = <AnalysisError>[]; |
| + for (WorkManager workManager in workManagers) { |
|
Paul Berry
2015/08/24 20:13:55
It seems unfortunate to have to create a loop here
scheglov
2015/08/24 20:21:10
Yes, actually the Angular plugin will report error
Paul Berry
2015/08/24 20:29:28
Ok, sounds reasonable.
|
| + List<AnalysisError> errors = workManager.getErrors(source); |
| + allErrors.addAll(errors); |
| } |
| - return new AnalysisErrorInfoImpl(AnalysisError.NO_ERRORS, null); |
| + LineInfo lineInfo = getLineInfo(source); |
| + return new AnalysisErrorInfoImpl(allErrors, lineInfo); |
| } |
| @override |
| @@ -1530,8 +1539,12 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| * related to it. If so, add the source to the set of sources that need to be |
| * processed. This method is intended to be used for testing purposes only. |
| */ |
| - void _getSourcesNeedingProcessing(Source source, CacheEntry entry, |
| - bool isPriority, bool hintsEnabled, bool lintsEnabled, |
| + void _getSourcesNeedingProcessing( |
| + Source source, |
| + CacheEntry entry, |
| + bool isPriority, |
| + bool hintsEnabled, |
| + bool lintsEnabled, |
| HashSet<Source> sources) { |
| CacheState state = entry.getState(CONTENT); |
| if (state == CacheState.INVALID || |
| @@ -1763,10 +1776,10 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| } |
| entry.setState(CONTENT, CacheState.INVALID); |
| } |
| - dartWorkManager.applyChange( |
| - Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); |
| - htmlWorkManager.applyChange( |
| - Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); |
| + for (WorkManager workManager in workManagers) { |
| + workManager.applyChange( |
| + Source.EMPTY_LIST, <Source>[source], Source.EMPTY_LIST); |
| + } |
| } |
| /** |
| @@ -1846,11 +1859,18 @@ class AnalysisContextImpl implements InternalAnalysisContext { |
| // do resolution |
| Stopwatch perfCounter = new Stopwatch()..start(); |
| PoorMansIncrementalResolver resolver = new PoorMansIncrementalResolver( |
| - typeProvider, unitSource, null, sourceEntry, unitEntry, oldUnit, |
| - analysisOptions.incrementalApi, analysisOptions); |
| + typeProvider, |
| + unitSource, |
| + null, |
| + sourceEntry, |
| + unitEntry, |
| + oldUnit, |
| + analysisOptions.incrementalApi, |
| + analysisOptions); |
| bool success = resolver.resolve(newCode); |
| AnalysisEngine.instance.instrumentationService.logPerformance( |
| - AnalysisPerformanceKind.INCREMENTAL, perfCounter, |
| + AnalysisPerformanceKind.INCREMENTAL, |
| + perfCounter, |
| 'success=$success,context_id=$_id,code_length=${newCode.length}'); |
| if (!success) { |
| return false; |