Index: pkg/analyzer_cli/lib/src/boot_loader.dart |
diff --git a/pkg/analyzer_cli/lib/src/boot_loader.dart b/pkg/analyzer_cli/lib/src/boot_loader.dart |
deleted file mode 100644 |
index 5b03f40ad6e4b0b513fe692f10c72f87f11af115..0000000000000000000000000000000000000000 |
--- a/pkg/analyzer_cli/lib/src/boot_loader.dart |
+++ /dev/null |
@@ -1,211 +0,0 @@ |
-// 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_cli.src.boot_loader; |
- |
-import 'dart:async'; |
-import 'dart:isolate'; |
- |
-import 'package:analyzer/file_system/file_system.dart'; |
-import 'package:analyzer/file_system/physical_file_system.dart'; |
-import 'package:analyzer/source/analysis_options_provider.dart'; |
-import 'package:analyzer/src/context/context.dart'; |
-import 'package:analyzer/src/generated/engine.dart' as engine; |
-import 'package:analyzer/src/plugin/plugin_configuration.dart'; |
-import 'package:analyzer_cli/src/driver.dart'; |
-import 'package:analyzer_cli/src/options.dart'; |
-import 'package:source_span/source_span.dart'; |
-import 'package:yaml/src/yaml_node.dart'; |
- |
-const _analyzerPackageName = 'analyzer'; |
- |
-/// Return non-null if there is a validation issue with this plugin. |
-String validate(PluginInfo plugin) { |
- var missing = <String>[]; |
- if (plugin.className == null) { |
- missing.add('class name'); |
- } |
- if (plugin.libraryUri == null) { |
- missing.add('library uri'); |
- } |
- if (missing.isEmpty) { |
- // All good. |
- return null; |
- } |
- return 'Plugin ${plugin.name} skipped, config missing: ${missing.join(", ")}'; |
-} |
- |
-List<PluginInfo> _validate(Iterable<PluginInfo> plugins) { |
- List<PluginInfo> validated = <PluginInfo>[]; |
- plugins.forEach((PluginInfo plugin) { |
- String validation = validate(plugin); |
- if (validation != null) { |
- errorSink.writeln(validation); |
- } else { |
- validated.add(plugin); |
- } |
- }); |
- return validated; |
-} |
- |
-/// Source code assembler. |
-class Assembler { |
- /// Plugins to configure. |
- final Iterable<PluginInfo> plugins; |
- |
- /// Create an assembler for the given plugin [config]. |
- Assembler(this.plugins); |
- |
- /// A string enumerating required package `import`s. |
- String get enumerateImports => |
- plugins.map((PluginInfo p) => "import '${p.libraryUri}';").join('\n'); |
- |
- /// A string listing initialized plugin instances. |
- String get pluginList => |
- plugins.map((PluginInfo p) => 'new ${p.className}()').join(', '); |
- |
- /// Create a file containing a `main()` suitable for loading in spawned |
- /// isolate. |
- String createMain() => _generateMain(); |
- |
- String _generateMain() => """ |
-// 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. |
- |
-// This code was auto-generated, is not intended to be edited, and is subject to |
-// significant change. Please see the README file for more information. |
- |
-import 'package:analyzer_cli/src/driver.dart'; |
- |
-$enumerateImports |
- |
-void main(List<String> args) { |
- var starter = new Driver(); |
- starter.userDefinedPlugins = [$pluginList]; |
- starter.start(args); |
-} |
-"""; |
-} |
- |
-/// Given environment information extracted from command-line `args`, creates a |
-/// a loadable analyzer "image". |
-class BootLoader { |
- /// Emits an error message to [errorSink] if plugin config can't be read. |
- static final ErrorHandler _pluginConfigErrorHandler = (Exception e) { |
- String details; |
- if (e is PluginConfigFormatException) { |
- details = e.message; |
- var node = e.yamlNode; |
- if (node is YamlNode) { |
- SourceLocation location = node.span.start; |
- details += ' (line ${location.line}, column ${location.column})'; |
- } |
- } else { |
- details = e.toString(); |
- } |
- |
- errorSink.writeln('Plugin configuration skipped: $details'); |
- }; |
- |
- /// Reads plugin config info from the analysis options file. |
- PluginConfigOptionsProcessor _pluginOptionsProcessor = |
- new PluginConfigOptionsProcessor(_pluginConfigErrorHandler); |
- |
- /// Create a loadable analyzer image configured with plugins derived from |
- /// the given analyzer command-line `args`. |
- Image createImage(List<String> args) { |
- // Parse commandline options. |
- CommandLineOptions options = CommandLineOptions.parse(args); |
- |
- // Process analysis options file (and notify all interested parties). |
- _processAnalysisOptions(options); |
- |
- // TODO(pquitslund): Pass in .packages info |
- return new Image(_pluginOptionsProcessor.config, |
- args: args, packageRootPath: options.packageRootPath); |
- } |
- |
- File _getOptionsFile( |
- CommandLineOptions options, ResourceProvider resourceProvider) { |
- String analysisOptionsFile = options.analysisOptionsFile; |
- if (analysisOptionsFile != null) { |
- return resourceProvider.getFile(analysisOptionsFile); |
- } |
- File file = |
- resourceProvider.getFile(engine.AnalysisEngine.ANALYSIS_OPTIONS_FILE); |
- if (!file.exists) { |
- file = resourceProvider |
- .getFile(engine.AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE); |
- } |
- return file; |
- } |
- |
- void _processAnalysisOptions(CommandLineOptions commandLineOptions) { |
- // Determine options file path. |
- try { |
- File file = _getOptionsFile( |
- commandLineOptions, PhysicalResourceProvider.INSTANCE); |
- AnalysisOptionsProvider analysisOptionsProvider = |
- new AnalysisOptionsProvider(); |
- Map<String, YamlNode> options = |
- analysisOptionsProvider.getOptionsFromFile(file); |
- //TODO(pq): thread in proper context. |
- var temporaryContext = new AnalysisContextImpl(); |
- _pluginOptionsProcessor.optionsProcessed(temporaryContext, options); |
- } on Exception catch (e) { |
- _pluginOptionsProcessor.onError(e); |
- } |
- } |
-} |
- |
-/// A loadable "image" of a a configured analyzer instance. |
-class Image { |
- /// (Optional) package root path. |
- final String packageRootPath; |
- |
- /// (Optional) package map. |
- final Map<String, Uri> packages; |
- |
- /// (Optional) args to be passed on to the loaded main. |
- final List<String> args; |
- |
- /// Plugin configuration. |
- final PluginConfig config; |
- |
- /// Create an image with the given [config] and optionally [packages], |
- /// [packageRootPath], and command line [args]. |
- Image(this.config, {this.packages, this.packageRootPath, this.args}); |
- |
- /// Load this image. |
- /// |
- /// Loading an image consists in assembling an analyzer `main()`, configured |
- /// to include the appropriate analyzer plugins as specified in |
- /// `.analyzer_options` which is then run in a spawned isolate. |
- Future load() { |
- List<PluginInfo> plugins = _validate(config.plugins); |
- String mainSource = new Assembler(plugins).createMain(); |
- |
- Completer completer = new Completer(); |
- ReceivePort exitListener = new ReceivePort(); |
- exitListener.listen((data) { |
- completer.complete(); |
- exitListener.close(); |
- }); |
- |
- Uri uri = |
- Uri.parse('data:application/dart;charset=utf-8,${Uri.encodeComponent( |
- mainSource)}'); |
- |
- // TODO(pquitslund): update once .packages are supported. |
- String packageRoot = |
- packageRootPath != null ? packageRootPath : './packages'; |
- Uri packageUri = new Uri.file(packageRoot); |
- |
- Isolate.spawnUri(uri, args, null /* msg */, |
- packageRoot: packageUri, onExit: exitListener.sendPort); |
- |
- return completer.future; |
- } |
-} |