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

Unified Diff: pkg/analyzer/lib/src/context/context.dart

Issue 1311773005: Extension point for WorkManagerFactory(s). (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Move classes as by review comments. Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698