| Index: pkg/analyzer/lib/src/plugin/plugin_configuration.dart
|
| diff --git a/pkg/analyzer/lib/src/plugin/plugin_configuration.dart b/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
|
| index 9809bdcfea4178342983ae43647eb0e7075945c7..9bd0da3973901528cfd16527d788b9e1a3027240 100644
|
| --- a/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
|
| +++ b/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
|
| @@ -11,30 +11,75 @@ const _analyzerOptionScope = 'analyzer';
|
|
|
| const _pluginOptionScope = 'plugins';
|
|
|
| +/// Parse the given string into a plugin manifest.
|
| +PluginManifest parsePluginManifestString(String manifestSource) {
|
| + var yaml = loadYaml(manifestSource);
|
| + if (yaml == null) {
|
| + return null;
|
| + }
|
| + _verifyMap(yaml, 'plugin manifest');
|
| + Iterable<String> pluginHost = _parseHosts(yaml['contributes_to']);
|
| + PluginInfo plugin = _parsePlugin(yaml);
|
| + return new PluginManifest(contributesTo: pluginHost, plugin: plugin);
|
| +}
|
| +
|
| +String _asString(dynamic yaml) {
|
| + if (yaml != null && yaml is! String) {
|
| + throw new PluginConfigFormatException(
|
| + 'Unable to parse pugin manifest, '
|
| + 'expected `String`, got `${yaml.runtimeType}`',
|
| + yaml);
|
| + }
|
| + return yaml;
|
| +}
|
| +
|
| +Iterable<String> _parseHosts(dynamic yaml) {
|
| + List<String> hosts = <String>[];
|
| + if (yaml is String) {
|
| + hosts.add(yaml);
|
| + } else if (yaml is YamlList) {
|
| + yaml.forEach((h) {
|
| + hosts.add(_asString(h));
|
| + });
|
| + }
|
| + return hosts;
|
| +}
|
| +
|
| +PluginInfo _parsePlugin(dynamic yaml) {
|
| + if (yaml != null) {
|
| + _verifyMap(yaml, 'plugin manifest');
|
| + return new PluginInfo._fromYaml(details: yaml);
|
| + }
|
| + return null;
|
| +}
|
| +
|
| PluginInfo _processPluginMapping(dynamic name, dynamic details) {
|
| if (name is String) {
|
| if (details is String) {
|
| return new PluginInfo(name: name, version: details);
|
| }
|
| if (details is YamlMap) {
|
| - return new PluginInfo(
|
| - name: name,
|
| - version: details['version'],
|
| - className: details['class_name'],
|
| - libraryUri: details['library_uri'],
|
| - packageName: details['package_name'],
|
| - path: details['path']);
|
| + return new PluginInfo._fromYaml(name: name, details: details);
|
| }
|
| }
|
|
|
| return null;
|
| }
|
|
|
| +_verifyMap(dynamic yaml, String context) {
|
| + if (yaml is! YamlMap) {
|
| + throw new PluginConfigFormatException(
|
| + 'Unable to parse $context, '
|
| + 'expected `YamlMap`, got `${yaml.runtimeType}`',
|
| + yaml);
|
| + }
|
| +}
|
| +
|
| /// A callback for error handling.
|
| typedef ErrorHandler(Exception e);
|
|
|
| /// Describes plugin configuration information as extracted from an
|
| -/// analysis options map.
|
| +/// analysis options map or plugin manifest.
|
| class PluginConfig {
|
| final Iterable<PluginInfo> plugins;
|
| PluginConfig(this.plugins);
|
| @@ -57,7 +102,7 @@ class PluginConfig {
|
| // Anything but an empty list of plugins is treated as a format error.
|
| if (pluginConfig != null) {
|
| throw new PluginConfigFormatException(
|
| - 'Unrecognized plugin config format (expected `YamlMap`, got `${pluginConfig.runtimeType}`)',
|
| + 'Unrecognized plugin config format, expected `YamlMap`, got `${pluginConfig.runtimeType}`',
|
| pluginConfig);
|
| }
|
| }
|
| @@ -117,4 +162,36 @@ class PluginInfo {
|
| this.libraryUri,
|
| this.packageName,
|
| this.path});
|
| +
|
| + factory PluginInfo._fromYaml({String name, YamlMap details}) =>
|
| + new PluginInfo(
|
| + name: name,
|
| + version: _asString(details['version']),
|
| + className: _asString(details['class_name']),
|
| + libraryUri: _asString(details['library_uri']),
|
| + packageName: _asString(details['package_name']),
|
| + path: _asString(details['path']));
|
| +}
|
| +
|
| +/// Plugin manifests accompany plugin packages, providing
|
| +/// configuration information for published plugins.
|
| +///
|
| +/// Provisionally, plugin manifests live in a file `plugin.yaml`
|
| +/// at the root of the plugin package.
|
| +///
|
| +/// my_plugin/
|
| +/// bin/
|
| +/// lib/
|
| +/// plugin.yaml
|
| +/// pubspec.yaml
|
| +///
|
| +/// Provisional manifest file format:
|
| +///
|
| +/// class_name: MyAnalyzerPlugin
|
| +/// library_uri: 'my_plugin/my_analyzer_plugin.dart'
|
| +/// contributes_to: analyzer
|
| +class PluginManifest {
|
| + PluginInfo plugin;
|
| + Iterable<String> contributesTo;
|
| + PluginManifest({this.plugin, this.contributesTo});
|
| }
|
|
|