| // 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, 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, ResolveFunctionBodiesInUnitTask.DESCRIPTOR); |
| registerExtension(taskId, ResolveLibraryReferencesTask.DESCRIPTOR); |
| registerExtension(taskId, ResolveLibraryTypeNamesTask.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'); |
| } |
| } |
| } |