Index: packages/analyzer/lib/src/plugin/engine_plugin.dart |
diff --git a/packages/analyzer/lib/src/plugin/engine_plugin.dart b/packages/analyzer/lib/src/plugin/engine_plugin.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6573b0aab6d29093e0e2a4ba2ca596f02a11d009 |
--- /dev/null |
+++ b/packages/analyzer/lib/src/plugin/engine_plugin.dart |
@@ -0,0 +1,272 @@ |
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library analyzer.src.plugin.engine_plugin; |
+ |
+import 'package:analyzer/plugin/task.dart'; |
+import 'package:analyzer/src/generated/engine.dart' |
+ show InternalAnalysisContext; |
+import 'package:analyzer/src/generated/error.dart' show AnalysisError; |
+import 'package:analyzer/src/task/dart.dart'; |
+import 'package:analyzer/src/task/dart_work_manager.dart'; |
+import 'package:analyzer/src/task/general.dart'; |
+import 'package:analyzer/src/task/html.dart'; |
+import 'package:analyzer/src/task/html_work_manager.dart'; |
+import 'package:analyzer/task/model.dart'; |
+import 'package:plugin/plugin.dart'; |
+ |
+/** |
+ * A plugin that defines the extension points and extensions that are inherently |
+ * defined by the analysis engine. |
+ */ |
+class EnginePlugin implements Plugin { |
+ /** |
+ * The simple identifier of the extension point that allows plugins to |
+ * register new analysis error results to compute for a Dart source. |
+ */ |
+ static const String DART_ERRORS_FOR_SOURCE_EXTENSION_POINT = |
+ 'dartErrorsForSource'; |
+ |
+ /** |
+ * The simple identifier of the extension point that allows plugins to |
+ * register new analysis error results to compute for a Dart library |
+ * specific unit. |
+ */ |
+ static const String DART_ERRORS_FOR_UNIT_EXTENSION_POINT = |
+ 'dartErrorsForUnit'; |
+ |
+ /** |
+ * The simple identifier of the extension point that allows plugins to |
+ * register new analysis error results to compute for an HTML source. |
+ */ |
+ static const String HTML_ERRORS_EXTENSION_POINT = 'htmlErrors'; |
+ |
+ /** |
+ * The simple identifier of the extension point that allows plugins to |
+ * register new analysis tasks with the analysis engine. |
+ */ |
+ static const String TASK_EXTENSION_POINT = 'task'; |
+ |
+ /** |
+ * The simple identifier of the extension point that allows plugins to |
+ * register new work manager factories with the analysis engine. |
+ */ |
+ static const String WORK_MANAGER_FACTORY_EXTENSION_POINT = |
+ 'workManagerFactory'; |
+ |
+ /** |
+ * The unique identifier of this plugin. |
+ */ |
+ static const String UNIQUE_IDENTIFIER = 'analysis_engine.core'; |
+ |
+ /** |
+ * The extension point that allows plugins to register new analysis error |
+ * results for a Dart source. |
+ */ |
+ ExtensionPoint dartErrorsForSourceExtensionPoint; |
+ |
+ /** |
+ * The extension point that allows plugins to register new analysis error |
+ * results for a Dart library specific unit. |
+ */ |
+ ExtensionPoint dartErrorsForUnitExtensionPoint; |
+ |
+ /** |
+ * The extension point that allows plugins to register new analysis error |
+ * results for an HTML source. |
+ */ |
+ ExtensionPoint htmlErrorsExtensionPoint; |
+ |
+ /** |
+ * The extension point that allows plugins to register new analysis tasks with |
+ * the analysis engine. |
+ */ |
+ ExtensionPoint taskExtensionPoint; |
+ |
+ /** |
+ * The extension point that allows plugins to register new work manager |
+ * factories with the analysis engine. |
+ */ |
+ ExtensionPoint workManagerFactoryExtensionPoint; |
+ |
+ /** |
+ * Initialize a newly created plugin. |
+ */ |
+ EnginePlugin(); |
+ |
+ /** |
+ * Return a list containing all of the contributed analysis error result |
+ * descriptors for Dart sources. |
+ */ |
+ List<TaskDescriptor> get dartErrorsForSource => |
+ dartErrorsForSourceExtensionPoint.extensions; |
+ |
+ /** |
+ * Return a list containing all of the contributed analysis error result |
+ * descriptors for Dart library specific units. |
+ */ |
+ List<TaskDescriptor> get dartErrorsForUnit => |
+ dartErrorsForUnitExtensionPoint.extensions; |
+ |
+ /** |
+ * Return a list containing all of the contributed analysis error result |
+ * descriptors for HTML sources. |
+ */ |
+ List<TaskDescriptor> get htmlErrors => htmlErrorsExtensionPoint.extensions; |
+ |
+ /** |
+ * Return a list containing all of the task descriptors that were contributed. |
+ */ |
+ List<TaskDescriptor> get taskDescriptors => taskExtensionPoint.extensions; |
+ |
+ @override |
+ String get uniqueIdentifier => UNIQUE_IDENTIFIER; |
+ |
+ /** |
+ * Return a list containing all of the work manager factories that were |
+ * contributed. |
+ */ |
+ List<WorkManagerFactory> get workManagerFactories => |
+ workManagerFactoryExtensionPoint.extensions; |
+ |
+ @override |
+ void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) { |
+ dartErrorsForSourceExtensionPoint = registerExtensionPoint( |
+ DART_ERRORS_FOR_SOURCE_EXTENSION_POINT, |
+ _validateAnalysisErrorListResultDescriptor); |
+ dartErrorsForUnitExtensionPoint = registerExtensionPoint( |
+ DART_ERRORS_FOR_UNIT_EXTENSION_POINT, |
+ _validateAnalysisErrorListResultDescriptor); |
+ htmlErrorsExtensionPoint = registerExtensionPoint( |
+ HTML_ERRORS_EXTENSION_POINT, |
+ _validateAnalysisErrorListResultDescriptor); |
+ taskExtensionPoint = |
+ registerExtensionPoint(TASK_EXTENSION_POINT, _validateTaskExtension); |
+ workManagerFactoryExtensionPoint = registerExtensionPoint( |
+ WORK_MANAGER_FACTORY_EXTENSION_POINT, |
+ _validateWorkManagerFactoryExtension); |
+ } |
+ |
+ @override |
+ void registerExtensions(RegisterExtension registerExtension) { |
+ _registerTaskExtensions(registerExtension); |
+ _registerWorkManagerFactoryExtensions(registerExtension); |
+ _registerDartErrorsForSource(registerExtension); |
+ _registerDartErrorsForUnit(registerExtension); |
+ _registerHtmlErrors(registerExtension); |
+ } |
+ |
+ void _registerDartErrorsForSource(RegisterExtension registerExtension) { |
+ String id = DART_ERRORS_FOR_SOURCE_EXTENSION_POINT_ID; |
+ registerExtension(id, PARSE_ERRORS); |
+ registerExtension(id, SCAN_ERRORS); |
+ } |
+ |
+ void _registerDartErrorsForUnit(RegisterExtension registerExtension) { |
+ String id = DART_ERRORS_FOR_UNIT_EXTENSION_POINT_ID; |
+ registerExtension(id, LIBRARY_UNIT_ERRORS); |
+ } |
+ |
+ void _registerHtmlErrors(RegisterExtension registerExtension) { |
+ String id = HTML_ERRORS_EXTENSION_POINT_ID; |
+ registerExtension(id, HTML_DOCUMENT_ERRORS); |
+ } |
+ |
+ void _registerTaskExtensions(RegisterExtension registerExtension) { |
+ String taskId = TASK_EXTENSION_POINT_ID; |
+ // |
+ // Register general tasks. |
+ // |
+ registerExtension(taskId, GetContentTask.DESCRIPTOR); |
+ // |
+ // Register Dart tasks. |
+ // |
+ registerExtension(taskId, BuildCompilationUnitElementTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildDirectiveElementsTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildEnumMemberElementsTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildExportNamespaceTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildLibraryElementTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildPublicNamespaceTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildSourceExportClosureTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildSourceImportExportClosureTask.DESCRIPTOR); |
+ registerExtension(taskId, BuildTypeProviderTask.DESCRIPTOR); |
+ registerExtension(taskId, ComputeConstantDependenciesTask.DESCRIPTOR); |
+ registerExtension(taskId, ComputeConstantValueTask.DESCRIPTOR); |
+ registerExtension( |
+ taskId, ComputeInferableStaticVariableDependenciesTask.DESCRIPTOR); |
+ registerExtension(taskId, ComputeLibraryCycleTask.DESCRIPTOR); |
+ registerExtension(taskId, ContainingLibrariesTask.DESCRIPTOR); |
+ registerExtension(taskId, DartErrorsTask.DESCRIPTOR); |
+ registerExtension(taskId, EvaluateUnitConstantsTask.DESCRIPTOR); |
+ registerExtension(taskId, GatherUsedImportedElementsTask.DESCRIPTOR); |
+ registerExtension(taskId, GatherUsedLocalElementsTask.DESCRIPTOR); |
+ registerExtension(taskId, GenerateHintsTask.DESCRIPTOR); |
+ registerExtension(taskId, GenerateLintsTask.DESCRIPTOR); |
+ registerExtension(taskId, InferInstanceMembersInUnitTask.DESCRIPTOR); |
+ registerExtension(taskId, InferStaticVariableTypesInUnitTask.DESCRIPTOR); |
+ registerExtension(taskId, InferStaticVariableTypeTask.DESCRIPTOR); |
+ registerExtension(taskId, LibraryErrorsReadyTask.DESCRIPTOR); |
+ registerExtension(taskId, LibraryUnitErrorsTask.DESCRIPTOR); |
+ registerExtension(taskId, ParseDartTask.DESCRIPTOR); |
+ registerExtension(taskId, PartiallyResolveUnitReferencesTask.DESCRIPTOR); |
+ registerExtension(taskId, ResolveInstanceFieldsInUnitTask.DESCRIPTOR); |
+ registerExtension(taskId, ResolveLibraryReferencesTask.DESCRIPTOR); |
+ registerExtension(taskId, ResolveLibraryTypeNamesTask.DESCRIPTOR); |
+ registerExtension(taskId, ResolveUnitTask.DESCRIPTOR); |
+ registerExtension(taskId, ResolveUnitTypeNamesTask.DESCRIPTOR); |
+ registerExtension(taskId, ResolveVariableReferencesTask.DESCRIPTOR); |
+ registerExtension(taskId, ScanDartTask.DESCRIPTOR); |
+ registerExtension(taskId, VerifyUnitTask.DESCRIPTOR); |
+ // |
+ // Register HTML tasks. |
+ // |
+ registerExtension(taskId, DartScriptsTask.DESCRIPTOR); |
+ registerExtension(taskId, HtmlErrorsTask.DESCRIPTOR); |
+ registerExtension(taskId, ParseHtmlTask.DESCRIPTOR); |
+ } |
+ |
+ void _registerWorkManagerFactoryExtensions( |
+ RegisterExtension registerExtension) { |
+ String taskId = WORK_MANAGER_EXTENSION_POINT_ID; |
+ registerExtension(taskId, |
+ (InternalAnalysisContext context) => new DartWorkManager(context)); |
+ registerExtension(taskId, |
+ (InternalAnalysisContext context) => new HtmlWorkManager(context)); |
+ } |
+ |
+ /** |
+ * Validate the given extension by throwing an [ExtensionError] if it is not |
+ * a [ListResultDescriptor] of [AnalysisError]s. |
+ */ |
+ void _validateAnalysisErrorListResultDescriptor(Object extension) { |
+ if (extension is! ListResultDescriptor<AnalysisError>) { |
+ String id = taskExtensionPoint.uniqueIdentifier; |
+ throw new ExtensionError( |
+ 'Extensions to $id must be a ListResultDescriptor<AnalysisError>'); |
+ } |
+ } |
+ |
+ /** |
+ * Validate the given extension by throwing an [ExtensionError] if it is not |
+ * a [TaskDescriptor]. |
+ */ |
+ void _validateTaskExtension(Object extension) { |
+ if (extension is! TaskDescriptor) { |
+ String id = taskExtensionPoint.uniqueIdentifier; |
+ throw new ExtensionError('Extensions to $id must be a TaskDescriptor'); |
+ } |
+ } |
+ |
+ /** |
+ * Validate the given extension by throwing an [ExtensionError] if it is not |
+ * a [WorkManagerFactory]. |
+ */ |
+ void _validateWorkManagerFactoryExtension(Object extension) { |
+ if (extension is! WorkManagerFactory) { |
+ String id = taskExtensionPoint.uniqueIdentifier; |
+ throw new ExtensionError( |
+ 'Extensions to $id must be a WorkManagerFactory'); |
+ } |
+ } |
+} |