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

Unified Diff: pkg/analyzer/lib/src/context/builder.dart

Issue 2208503004: Move embedder locator and convert context builder to use the new API (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 4 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/analyzer/lib/source/embedder.dart ('k') | pkg/analyzer/lib/src/context/context.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
+ }
+ }
+}
« no previous file with comments | « pkg/analyzer/lib/source/embedder.dart ('k') | pkg/analyzer/lib/src/context/context.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698