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

Side by Side 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 unified diff | 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 »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.src.context.context_builder; 5 library analyzer.src.context.context_builder;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:core' hide Resource; 8 import 'dart:core' hide Resource;
9 import 'dart:io' as io; 9 import 'dart:io' as io;
10 10
11 import 'package:analyzer/context/declared_variables.dart'; 11 import 'package:analyzer/context/declared_variables.dart';
12 import 'package:analyzer/file_system/file_system.dart'; 12 import 'package:analyzer/file_system/file_system.dart';
13 import 'package:analyzer/plugin/resolver_provider.dart'; 13 import 'package:analyzer/plugin/resolver_provider.dart';
14 import 'package:analyzer/source/analysis_options_provider.dart'; 14 import 'package:analyzer/source/analysis_options_provider.dart';
15 import 'package:analyzer/source/embedder.dart';
16 import 'package:analyzer/source/package_map_resolver.dart'; 15 import 'package:analyzer/source/package_map_resolver.dart';
17 import 'package:analyzer/source/sdk_ext.dart'; 16 import 'package:analyzer/source/sdk_ext.dart';
17 import 'package:analyzer/src/dart/sdk/sdk.dart';
18 import 'package:analyzer/src/generated/engine.dart'; 18 import 'package:analyzer/src/generated/engine.dart';
19 import 'package:analyzer/src/generated/java_io.dart'; 19 import 'package:analyzer/src/generated/java_io.dart';
20 import 'package:analyzer/src/generated/sdk.dart'; 20 import 'package:analyzer/src/generated/sdk.dart';
21 import 'package:analyzer/src/generated/sdk_io.dart'; 21 import 'package:analyzer/src/generated/sdk_io.dart';
22 import 'package:analyzer/src/generated/source.dart'; 22 import 'package:analyzer/src/generated/source.dart';
23 import 'package:analyzer/src/generated/source_io.dart'; 23 import 'package:analyzer/src/generated/source_io.dart';
24 import 'package:analyzer/src/task/options.dart'; 24 import 'package:analyzer/src/task/options.dart';
25 import 'package:package_config/discovery.dart'; 25 import 'package:package_config/discovery.dart';
26 import 'package:package_config/packages.dart'; 26 import 'package:package_config/packages.dart';
27 import 'package:package_config/packages_file.dart'; 27 import 'package:package_config/packages_file.dart';
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 } 203 }
204 return findPackagesFromFile(new Uri.directory(rootDirectoryPath)); 204 return findPackagesFromFile(new Uri.directory(rootDirectoryPath));
205 } 205 }
206 206
207 SourceFactory createSourceFactory( 207 SourceFactory createSourceFactory(
208 String rootDirectoryPath, AnalysisOptions options) { 208 String rootDirectoryPath, AnalysisOptions options) {
209 Folder _folder = null; 209 Folder _folder = null;
210 Folder folder() { 210 Folder folder() {
211 return _folder ??= resourceProvider.getResource('.'); 211 return _folder ??= resourceProvider.getResource('.');
212 } 212 }
213
213 UriResolver fileResolver = fileResolverProvider == null 214 UriResolver fileResolver = fileResolverProvider == null
214 ? new ResourceUriResolver(resourceProvider) 215 ? new ResourceUriResolver(resourceProvider)
215 : fileResolverProvider(folder()); 216 : fileResolverProvider(folder());
216 if (packageResolverProvider != null) { 217 if (packageResolverProvider != null) {
217 UriResolver packageResolver = packageResolverProvider(folder()); 218 UriResolver packageResolver = packageResolverProvider(folder());
218 if (packageResolver != null) { 219 if (packageResolver != null) {
219 // TODO(brianwilkerson) This doesn't support either embedder files or 220 // TODO(brianwilkerson) This doesn't support either embedder files or
220 // sdk extensions because we don't have a way to get the package map 221 // sdk extensions because we don't have a way to get the package map
221 // from the resolver. 222 // from the resolver.
222 List<UriResolver> resolvers = <UriResolver>[ 223 List<UriResolver> resolvers = <UriResolver>[
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
257 */ 258 */
258 DartSdk findSdk( 259 DartSdk findSdk(
259 Map<String, List<Folder>> packageMap, AnalysisOptions options) { 260 Map<String, List<Folder>> packageMap, AnalysisOptions options) {
260 if (packageMap != null) { 261 if (packageMap != null) {
261 // TODO(brianwilkerson) Fix it so that we don't have to create a resolver 262 // TODO(brianwilkerson) Fix it so that we don't have to create a resolver
262 // to figure out what the extensions are. 263 // to figure out what the extensions are.
263 SdkExtUriResolver extResolver = new SdkExtUriResolver(packageMap); 264 SdkExtUriResolver extResolver = new SdkExtUriResolver(packageMap);
264 List<String> extFilePaths = extResolver.extensionFilePaths; 265 List<String> extFilePaths = extResolver.extensionFilePaths;
265 EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap); 266 EmbedderYamlLocator locator = new EmbedderYamlLocator(packageMap);
266 Map<Folder, YamlMap> embedderYamls = locator.embedderYamls; 267 Map<Folder, YamlMap> embedderYamls = locator.embedderYamls;
267 EmbedderSdk embedderSdk = new EmbedderSdk(embedderYamls); 268 EmbedderSdk embedderSdk =
269 new EmbedderSdk(resourceProvider, embedderYamls);
268 if (embedderSdk.sdkLibraries.length > 0) { 270 if (embedderSdk.sdkLibraries.length > 0) {
269 // 271 //
270 // There is an embedder file that defines the content of the SDK and 272 // There is an embedder file that defines the content of the SDK and
271 // there might be an extension file that extends it. 273 // there might be an extension file that extends it.
272 // 274 //
273 List<String> paths = <String>[]; 275 List<String> paths = <String>[];
274 for (Folder folder in embedderYamls.keys) { 276 for (Folder folder in embedderYamls.keys) {
275 paths.add(folder 277 paths.add(folder
276 .getChildAssumingFile(EmbedderYamlLocator.EMBEDDER_FILE_NAME) 278 .getChildAssumingFile(EmbedderYamlLocator.EMBEDDER_FILE_NAME)
277 .path); 279 .path);
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 } 352 }
351 file = folder 353 file = folder
352 .getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE); 354 .getChildAssumingFile(AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE);
353 if (file.exists) { 355 if (file.exists) {
354 return file; 356 return file;
355 } 357 }
356 } 358 }
357 return null; 359 return null;
358 } 360 }
359 } 361 }
362
363 /**
364 * Given a package map, check in each package's lib directory for the existence
365 * of an `_embedder.yaml` file. If the file contains a top level YamlMap, it
366 * will be added to the [embedderYamls] map.
367 */
368 class EmbedderYamlLocator {
369 /**
370 * The name of the embedder files being searched for.
371 */
372 static const String EMBEDDER_FILE_NAME = '_embedder.yaml';
373
374 /**
375 * A mapping from a package's library directory to the parsed YamlMap.
376 */
377 final Map<Folder, YamlMap> embedderYamls = new HashMap<Folder, YamlMap>();
378
379 /**
380 * Initialize a newly created locator by processing the packages in the given
381 * [packageMap].
382 */
383 EmbedderYamlLocator(Map<String, List<Folder>> packageMap) {
384 if (packageMap != null) {
385 _processPackageMap(packageMap);
386 }
387 }
388
389 /**
390 * Programatically add an `_embedder.yaml` mapping.
391 */
392 void addEmbedderYaml(Folder libDir, String embedderYaml) {
393 _processEmbedderYaml(libDir, embedderYaml);
394 }
395
396 /**
397 * Refresh the map of located files to those found by processing the given
398 * [packageMap].
399 */
400 void refresh(Map<String, List<Folder>> packageMap) {
401 // Clear existing.
402 embedderYamls.clear();
403 if (packageMap != null) {
404 _processPackageMap(packageMap);
405 }
406 }
407
408 /**
409 * Given the yaml for an embedder ([embedderYaml]) and a folder ([libDir]),
410 * setup the uri mapping.
411 */
412 void _processEmbedderYaml(Folder libDir, String embedderYaml) {
413 try {
414 YamlNode yaml = loadYaml(embedderYaml);
415 if (yaml is YamlMap) {
416 embedderYamls[libDir] = yaml;
417 }
418 } catch (_) {
419 // Ignored
420 }
421 }
422
423 /**
424 * Given a package [name] and a list of folders ([libDirs]), process any
425 * `_embedder.yaml` files that are found in any of the folders.
426 */
427 void _processPackage(String name, List<Folder> libDirs) {
428 for (Folder libDir in libDirs) {
429 String embedderYaml = _readEmbedderYaml(libDir);
430 if (embedderYaml != null) {
431 _processEmbedderYaml(libDir, embedderYaml);
432 }
433 }
434 }
435
436 /**
437 * Process each of the entries in the [packageMap].
438 */
439 void _processPackageMap(Map<String, List<Folder>> packageMap) {
440 packageMap.forEach(_processPackage);
441 }
442
443 /**
444 * Read and return the contents of [libDir]/[EMBEDDER_FILE_NAME], or `null` if
445 * the file doesn't exist.
446 */
447 String _readEmbedderYaml(Folder libDir) {
448 File file = libDir.getChild(EMBEDDER_FILE_NAME);
449 try {
450 return file.readAsStringSync();
451 } on FileSystemException {
452 // File can't be read.
453 return null;
454 }
455 }
456 }
OLDNEW
« 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