f60536c194
Change-Id: Id2734d4c9ce591c5746bb9aa55810c78183db38f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/135940 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
88 lines
3.5 KiB
Dart
88 lines
3.5 KiB
Dart
// Copyright (c) 2017, 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.
|
|
|
|
import 'package:analyzer/file_system/file_system.dart';
|
|
|
|
/// An object used to locate a plugin within a package.
|
|
class PluginLocator {
|
|
/// The key used in the `pubspec.yaml` file to specify the location of the
|
|
/// analysis plugin.
|
|
static const String analyzerPluginKey = 'analyzer_plugin';
|
|
|
|
/// The name of the default plugin directory, located within the `tools`
|
|
/// directory.
|
|
static const String defaultPluginFolderName = 'analyzer_plugin';
|
|
|
|
/// The name of the `pubspec.yaml` file.
|
|
static const String pubspecFileName = 'pubspec.yaml';
|
|
|
|
/// The name of the `tools` directory, in which the default plugin directory
|
|
/// is located.
|
|
static const String toolsFolderName = 'tools';
|
|
|
|
/// The resource provider used to access the file system.
|
|
final ResourceProvider resourceProvider;
|
|
|
|
final Map<String, String> pluginMap = <String, String>{};
|
|
|
|
/// Initialize a newly created plugin locator to use the given
|
|
/// [resourceProvider] to access the file system.
|
|
PluginLocator(this.resourceProvider);
|
|
|
|
/// Given the root directory of a package (the [packageRoot]), return the path
|
|
/// to the plugin associated with the package, or `null` if there is no plugin
|
|
/// associated with the package.
|
|
///
|
|
/// This will look first in the `pubspec.yaml` file in the package root for a
|
|
/// top-level key (`analysis_plugin`) indicating where the plugin is located.
|
|
/// The value associated with the key is expected to be the path of the plugin
|
|
/// relative to the package root. If the directory exists, the it is returned.
|
|
///
|
|
/// If the key is not defined in the `pubspec.yaml` file, or if the directory
|
|
/// given does not exist, then this method will look for the directory
|
|
/// `tools/analysis_plugin` relative to the package root. If the directory
|
|
/// exists, then it is returned.
|
|
///
|
|
/// This method does not validate the content of the plugin directory before
|
|
/// returning it.
|
|
String findPlugin(String packageRoot) {
|
|
return pluginMap.putIfAbsent(packageRoot, () => _findPlugin(packageRoot));
|
|
}
|
|
|
|
/// The implementation of [findPlugin].
|
|
String _findPlugin(String packageRoot) {
|
|
Folder packageFolder = resourceProvider.getFolder(packageRoot);
|
|
// TODO(brianwilkerson) Re-enable this after deciding how we want to deal
|
|
// with discovery of plugins.
|
|
// import 'package:yaml/yaml.dart';
|
|
// File pubspecFile = packageFolder.getChildAssumingFile(pubspecFileName);
|
|
// if (pubspecFile.exists) {
|
|
// try {
|
|
// YamlDocument document = loadYamlDocument(pubspecFile.readAsStringSync(),
|
|
// sourceUrl: pubspecFile.toUri());
|
|
// YamlNode contents = document.contents;
|
|
// if (contents is YamlMap) {
|
|
// String pluginPath = contents[analyzerPluginKey];
|
|
// if (pluginPath != null) {
|
|
// Folder pluginFolder =
|
|
// packageFolder.getChildAssumingFolder(pluginPath);
|
|
// if (pluginFolder.exists) {
|
|
// return pluginFolder.path;
|
|
// }
|
|
// }
|
|
// }
|
|
// } catch (exception) {
|
|
// // If we can't read the file, or if it isn't valid YAML, then ignore it.
|
|
// }
|
|
// }
|
|
Folder pluginFolder = packageFolder
|
|
.getChildAssumingFolder(toolsFolderName)
|
|
.getChildAssumingFolder(defaultPluginFolderName);
|
|
if (pluginFolder.exists) {
|
|
return pluginFolder.path;
|
|
}
|
|
return null;
|
|
}
|
|
}
|