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; |
/** |
* 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) { |
+ 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; |