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

Side by Side Diff: pkg/analyzer_cli/lib/src/plugin/plugin_manager.dart

Issue 1459683003: `analyzer_cli` move to SDK. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: master merge Created 5 years, 1 month 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 unified diff | Download patch
« no previous file with comments | « pkg/analyzer_cli/lib/src/options.dart ('k') | pkg/analyzer_cli/pubspec.yaml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library analyzer_cli.src.plugin.plugin_manager;
6
7 import 'dart:io';
8
9 import 'package:analyzer/src/plugin/plugin_configuration.dart';
10 import 'package:path/path.dart' as path;
11
12 const _manifestFileName = 'plugins.yaml';
13
14 /// Given a local configuration (as defined in `.analysis_options`)
15 /// and information from a plugin manifest, return plugin info
16 /// appropriate for configuring this plugin.
17 PluginInfo combine(PluginInfo localConfig, PluginInfo manifestInfo) {
18 return new PluginInfo(
19 name: localConfig.name,
20 version: manifestInfo.version,
21 className: manifestInfo.className,
22 libraryUri: manifestInfo.libraryUri);
23 }
24
25 /// Call-back to allow for the injection of manifest readers that do not need
26 /// to go to disk (for testing purposes).
27 typedef String ManifestReader(Uri uri);
28
29 /// Wraps a [plugin] info object elaborated with any configuration information
30 /// extracted from an associated manifest and [status].
31 class PluginDetails {
32 /// Plugin status.
33 final PluginStatus status;
34
35 /// Plugin info.
36 final PluginInfo plugin;
37
38 /// Wrap a [plugin] with [status] info.
39 PluginDetails(this.plugin) : status = PluginStatus.Applicable;
40 PluginDetails.notApplicable(this.plugin)
41 : status = PluginStatus.NotApplicable;
42 PluginDetails.notFound(this.plugin) : status = PluginStatus.NotFound;
43 }
44
45 /// Manages plugin information derived from plugin manifests.
46 class PluginManager {
47 /// Mapping from package name to package location.
48 final Map<String, Uri> _packageMap;
49
50 /// The package naming the app to host plugins.
51 final String hostPackage;
52
53 /// Function to perform the reading of manifest URIs. (For testing.)
54 ManifestReader _manifestReader;
55
56 /// Create a plugin manager with backing package map information.
57 PluginManager(this._packageMap, this.hostPackage,
58 [ManifestReader manifestReader]) {
59 _manifestReader =
60 manifestReader != null ? manifestReader : _findAndReadManifestAtUri;
61 }
62
63 /// Find a plugin manifest describing the given [pluginPackage].
64 PluginManifest findManifest(String pluginPackage) {
65 Uri uri = _packageMap[pluginPackage];
66 String contents = _manifestReader(uri);
67 if (contents == null) {
68 return null;
69 }
70 return parsePluginManifestString(contents);
71 }
72
73 /// Return [PluginDetails] derived from associated plugin manifests
74 /// corresponding to plugins specified in the given [config].
75 Iterable<PluginDetails> getPluginDetails(PluginConfig config) =>
76 config.plugins.map((PluginInfo localConfig) {
77 PluginManifest manifest = findManifest(localConfig.name);
78 return _getDetails(localConfig, manifest);
79 });
80
81 String _findAndReadManifestAtUri(Uri uri) {
82 File manifestFile = _findManifest(uri);
83 return manifestFile?.readAsStringSync();
84 }
85
86 File _findManifest(Uri uri) {
87 if (uri == null) {
88 return null;
89 }
90
91 Directory directory = new Directory.fromUri(uri);
92 File file = new File(path.join(directory.path, _manifestFileName));
93
94 return file.existsSync() ? file : null;
95 }
96
97 PluginDetails _getDetails(PluginInfo localConfig, PluginManifest manifest) {
98 if (manifest == null) {
99 return new PluginDetails.notFound(localConfig);
100 }
101 if (!manifest.contributesTo.contains(hostPackage)) {
102 return new PluginDetails.notApplicable(localConfig);
103 }
104
105 return new PluginDetails(combine(localConfig, manifest.plugin));
106 }
107 }
108
109 /// Describes plugin status.
110 enum PluginStatus { Applicable, NotApplicable, NotFound }
OLDNEW
« no previous file with comments | « pkg/analyzer_cli/lib/src/options.dart ('k') | pkg/analyzer_cli/pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698