| Index: pkg/analyzer/lib/src/context/builder.dart
|
| diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
|
| index 377e9b1e434f11fd2e01610beba1a9686bbb781e..729fa65d3a639b8460099211c2f6944b1a9194bb 100644
|
| --- a/pkg/analyzer/lib/src/context/builder.dart
|
| +++ b/pkg/analyzer/lib/src/context/builder.dart
|
| @@ -12,9 +12,9 @@ import 'package:analyzer/context/declared_variables.dart';
|
| import 'package:analyzer/file_system/file_system.dart';
|
| import 'package:analyzer/plugin/resolver_provider.dart';
|
| import 'package:analyzer/source/analysis_options_provider.dart';
|
| -import 'package:analyzer/source/embedder.dart';
|
| import 'package:analyzer/source/package_map_resolver.dart';
|
| import 'package:analyzer/source/sdk_ext.dart';
|
| +import 'package:analyzer/src/dart/sdk/sdk.dart';
|
| import 'package:analyzer/src/generated/engine.dart';
|
| import 'package:analyzer/src/generated/java_io.dart';
|
| import 'package:analyzer/src/generated/sdk.dart';
|
| @@ -210,6 +210,7 @@ class ContextBuilder {
|
| Folder folder() {
|
| return _folder ??= resourceProvider.getResource('.');
|
| }
|
| +
|
| UriResolver fileResolver = fileResolverProvider == null
|
| ? new ResourceUriResolver(resourceProvider)
|
| : fileResolverProvider(folder());
|
| @@ -264,7 +265,8 @@ class ContextBuilder {
|
| List<String> extFilePaths = extResolver.extensionFilePaths;
|
| EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap);
|
| Map<Folder, YamlMap> embedderYamls = locator.embedderYamls;
|
| - EmbedderSdk embedderSdk = new EmbedderSdk(embedderYamls);
|
| + EmbedderSdk embedderSdk =
|
| + new EmbedderSdk(resourceProvider, embedderYamls);
|
| if (embedderSdk.sdkLibraries.length > 0) {
|
| //
|
| // There is an embedder file that defines the content of the SDK and
|
| @@ -357,3 +359,98 @@ class ContextBuilder {
|
| return null;
|
| }
|
| }
|
| +
|
| +/**
|
| + * Given a package map, check in each package's lib directory for the existence
|
| + * of an `_embedder.yaml` file. If the file contains a top level YamlMap, it
|
| + * will be added to the [embedderYamls] map.
|
| + */
|
| +class EmbedderYamlLocator {
|
| + /**
|
| + * The name of the embedder files being searched for.
|
| + */
|
| + static const String EMBEDDER_FILE_NAME = '_embedder.yaml';
|
| +
|
| + /**
|
| + * A mapping from a package's library directory to the parsed YamlMap.
|
| + */
|
| + final Map<Folder, YamlMap> embedderYamls = new HashMap<Folder, YamlMap>();
|
| +
|
| + /**
|
| + * Initialize a newly created locator by processing the packages in the given
|
| + * [packageMap].
|
| + */
|
| + EmbedderYamlLocator(Map<String, List<Folder>> packageMap) {
|
| + if (packageMap != null) {
|
| + _processPackageMap(packageMap);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Programatically add an `_embedder.yaml` mapping.
|
| + */
|
| + void addEmbedderYaml(Folder libDir, String embedderYaml) {
|
| + _processEmbedderYaml(libDir, embedderYaml);
|
| + }
|
| +
|
| + /**
|
| + * Refresh the map of located files to those found by processing the given
|
| + * [packageMap].
|
| + */
|
| + void refresh(Map<String, List<Folder>> packageMap) {
|
| + // Clear existing.
|
| + embedderYamls.clear();
|
| + if (packageMap != null) {
|
| + _processPackageMap(packageMap);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Given the yaml for an embedder ([embedderYaml]) and a folder ([libDir]),
|
| + * setup the uri mapping.
|
| + */
|
| + void _processEmbedderYaml(Folder libDir, String embedderYaml) {
|
| + try {
|
| + YamlNode yaml = loadYaml(embedderYaml);
|
| + if (yaml is YamlMap) {
|
| + embedderYamls[libDir] = yaml;
|
| + }
|
| + } catch (_) {
|
| + // Ignored
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Given a package [name] and a list of folders ([libDirs]), process any
|
| + * `_embedder.yaml` files that are found in any of the folders.
|
| + */
|
| + void _processPackage(String name, List<Folder> libDirs) {
|
| + for (Folder libDir in libDirs) {
|
| + String embedderYaml = _readEmbedderYaml(libDir);
|
| + if (embedderYaml != null) {
|
| + _processEmbedderYaml(libDir, embedderYaml);
|
| + }
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * Process each of the entries in the [packageMap].
|
| + */
|
| + void _processPackageMap(Map<String, List<Folder>> packageMap) {
|
| + packageMap.forEach(_processPackage);
|
| + }
|
| +
|
| + /**
|
| + * Read and return the contents of [libDir]/[EMBEDDER_FILE_NAME], or `null` if
|
| + * the file doesn't exist.
|
| + */
|
| + String _readEmbedderYaml(Folder libDir) {
|
| + File file = libDir.getChild(EMBEDDER_FILE_NAME);
|
| + try {
|
| + return file.readAsStringSync();
|
| + } on FileSystemException {
|
| + // File can't be read.
|
| + return null;
|
| + }
|
| + }
|
| +}
|
|
|