| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |