// 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/error/error.dart' show AnalysisError; import 'package:analyzer/plugin/task.dart'; import 'package:analyzer/src/generated/engine.dart' show InternalAnalysisContext; import 'package:analyzer/src/task/dart.dart'; import 'package:analyzer/src/task/dart_work_manager.dart'; import 'package:analyzer/src/task/html.dart'; import 'package:analyzer/src/task/html_work_manager.dart'; import 'package:analyzer/src/task/options_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 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 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. */ @ExtensionPointId('DART_ERRORS_FOR_SOURCE_EXTENSION_POINT_ID') List get dartErrorsForSource => dartErrorsForSourceExtensionPoint.extensions; /** * Return a list containing all of the contributed analysis error result * descriptors for Dart library specific units. */ @ExtensionPointId('DART_ERRORS_FOR_UNIT_EXTENSION_POINT_ID') List get dartErrorsForUnit => dartErrorsForUnitExtensionPoint.extensions; /** * Return a list containing all of the contributed analysis error result * descriptors for HTML sources. */ @ExtensionPointId('HTML_ERRORS_EXTENSION_POINT_ID') List get htmlErrors => htmlErrorsExtensionPoint.extensions; @override String get uniqueIdentifier => UNIQUE_IDENTIFIER; /** * Return a list containing all of the work manager factories that were * contributed. */ List get workManagerFactories => workManagerFactoryExtensionPoint.extensions; @override void registerExtensionPoints(RegisterExtensionPoint registerExtensionPoint) { dartErrorsForSourceExtensionPoint = new ExtensionPoint>( this, DART_ERRORS_FOR_SOURCE_EXTENSION_POINT, null); registerExtensionPoint(dartErrorsForSourceExtensionPoint); dartErrorsForUnitExtensionPoint = new ExtensionPoint>( this, DART_ERRORS_FOR_UNIT_EXTENSION_POINT, null); registerExtensionPoint(dartErrorsForUnitExtensionPoint); htmlErrorsExtensionPoint = new ExtensionPoint>( this, HTML_ERRORS_EXTENSION_POINT, null); registerExtensionPoint(htmlErrorsExtensionPoint); workManagerFactoryExtensionPoint = new ExtensionPoint( this, WORK_MANAGER_FACTORY_EXTENSION_POINT, null); registerExtensionPoint(workManagerFactoryExtensionPoint); } @override void registerExtensions(RegisterExtension registerExtension) { _registerWorkManagerFactoryExtensions(registerExtension); _registerDartErrorsForSource(registerExtension); _registerDartErrorsForUnit(registerExtension); _registerHtmlErrors(registerExtension); } void _registerDartErrorsForSource(RegisterExtension registerExtension) { registerExtension(DART_ERRORS_FOR_SOURCE_EXTENSION_POINT_ID, PARSE_ERRORS); registerExtension(DART_ERRORS_FOR_SOURCE_EXTENSION_POINT_ID, SCAN_ERRORS); } void _registerDartErrorsForUnit(RegisterExtension registerExtension) { registerExtension( DART_ERRORS_FOR_UNIT_EXTENSION_POINT_ID, LIBRARY_UNIT_ERRORS); } void _registerHtmlErrors(RegisterExtension registerExtension) { registerExtension(HTML_ERRORS_EXTENSION_POINT_ID, HTML_DOCUMENT_ERRORS); } 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)); registerExtension(taskId, (InternalAnalysisContext context) => new OptionsWorkManager(context)); } } /** * Annotation describing the relationship between a getter in [EnginePlugin] * and the associated identifier (in '../../plugin/task.dart') which can be * passed to the extension manager to populate it. * * This annotation is not used at runtime; it is used to aid in static analysis * of the task model during development. */ class ExtensionPointId { final String extensionPointId; const ExtensionPointId(this.extensionPointId); }