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 |