| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 context.directory.manager; | 5 library context.directory.manager; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:collection'; | 8 import 'dart:collection'; |
| 9 import 'dart:convert'; | 9 import 'dart:convert'; |
| 10 import 'dart:core'; | 10 import 'dart:core'; |
| 11 | 11 |
| 12 import 'package:analysis_server/src/analysis_server.dart'; |
| 12 import 'package:analyzer/exception/exception.dart'; | 13 import 'package:analyzer/exception/exception.dart'; |
| 13 import 'package:analyzer/file_system/file_system.dart'; | 14 import 'package:analyzer/file_system/file_system.dart'; |
| 14 import 'package:analyzer/instrumentation/instrumentation.dart'; | 15 import 'package:analyzer/instrumentation/instrumentation.dart'; |
| 15 import 'package:analyzer/plugin/options.dart'; | 16 import 'package:analyzer/plugin/options.dart'; |
| 16 import 'package:analyzer/plugin/resolver_provider.dart'; | 17 import 'package:analyzer/plugin/resolver_provider.dart'; |
| 17 import 'package:analyzer/source/analysis_options_provider.dart'; | 18 import 'package:analyzer/source/analysis_options_provider.dart'; |
| 18 import 'package:analyzer/source/config.dart'; | 19 import 'package:analyzer/source/config.dart'; |
| 20 import 'package:analyzer/source/package_map_provider.dart'; |
| 19 import 'package:analyzer/source/package_map_resolver.dart'; | 21 import 'package:analyzer/source/package_map_resolver.dart'; |
| 20 import 'package:analyzer/source/path_filter.dart'; | 22 import 'package:analyzer/source/path_filter.dart'; |
| 23 import 'package:analyzer/source/pub_package_map_provider.dart'; |
| 21 import 'package:analyzer/source/sdk_ext.dart'; | 24 import 'package:analyzer/source/sdk_ext.dart'; |
| 22 import 'package:analyzer/src/context/builder.dart'; | 25 import 'package:analyzer/src/context/builder.dart'; |
| 23 import 'package:analyzer/src/context/context.dart' as context; | 26 import 'package:analyzer/src/context/context.dart' as context; |
| 24 import 'package:analyzer/src/dart/sdk/sdk.dart'; | 27 import 'package:analyzer/src/dart/sdk/sdk.dart'; |
| 25 import 'package:analyzer/src/generated/engine.dart'; | 28 import 'package:analyzer/src/generated/engine.dart'; |
| 26 import 'package:analyzer/src/generated/java_io.dart'; | 29 import 'package:analyzer/src/generated/java_io.dart'; |
| 27 import 'package:analyzer/src/generated/sdk.dart'; | 30 import 'package:analyzer/src/generated/sdk.dart'; |
| 28 import 'package:analyzer/src/generated/source.dart'; | 31 import 'package:analyzer/src/generated/source.dart'; |
| 29 import 'package:analyzer/src/generated/source_io.dart'; | 32 import 'package:analyzer/src/generated/source_io.dart'; |
| 30 import 'package:analyzer/src/task/options.dart'; | 33 import 'package:analyzer/src/task/options.dart'; |
| (...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 AnalysisContext addContext(Folder folder, AnalysisOptions options); | 327 AnalysisContext addContext(Folder folder, AnalysisOptions options); |
| 325 | 328 |
| 326 /** | 329 /** |
| 327 * Called when the set of files associated with a context have changed (or | 330 * Called when the set of files associated with a context have changed (or |
| 328 * some of those files have been modified). [changeSet] is the set of | 331 * some of those files have been modified). [changeSet] is the set of |
| 329 * changes that need to be applied to the context. | 332 * changes that need to be applied to the context. |
| 330 */ | 333 */ |
| 331 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet); | 334 void applyChangesToContext(Folder contextFolder, ChangeSet changeSet); |
| 332 | 335 |
| 333 /** | 336 /** |
| 337 * Signals that the context manager has started to compute a package map (if |
| 338 * [computing] is `true`) or has finished (if [computing] is `false`). |
| 339 */ |
| 340 void computingPackageMap(bool computing); |
| 341 |
| 342 /** |
| 334 * Create and return a context builder that can be used to create a context | 343 * Create and return a context builder that can be used to create a context |
| 335 * for the files in the given [folder] when analyzed using the given [options]
. | 344 * for the files in the given [folder] when analyzed using the given [options]
. |
| 336 */ | 345 */ |
| 337 ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options); | 346 ContextBuilder createContextBuilder(Folder folder, AnalysisOptions options); |
| 338 | 347 |
| 339 /** | 348 /** |
| 340 * Called when the context manager changes the folder with which a context is | 349 * Called when the context manager changes the folder with which a context is |
| 341 * associated. Currently this is mostly FYI, and used only in tests. | 350 * associated. Currently this is mostly FYI, and used only in tests. |
| 342 */ | 351 */ |
| 343 void moveContext(Folder from, Folder to); | 352 void moveContext(Folder from, Folder to); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 Map<String, String> normalizedPackageRoots = <String, String>{}; | 448 Map<String, String> normalizedPackageRoots = <String, String>{}; |
| 440 | 449 |
| 441 /** | 450 /** |
| 442 * A function that will return a [UriResolver] that can be used to resolve | 451 * A function that will return a [UriResolver] that can be used to resolve |
| 443 * `package:` URI's within a given folder, or `null` if we should fall back | 452 * `package:` URI's within a given folder, or `null` if we should fall back |
| 444 * to the standard URI resolver. | 453 * to the standard URI resolver. |
| 445 */ | 454 */ |
| 446 final ResolverProvider packageResolverProvider; | 455 final ResolverProvider packageResolverProvider; |
| 447 | 456 |
| 448 /** | 457 /** |
| 449 * Provider of analysis options. | 458 * Provider which is used to determine the mapping from package name to |
| 459 * package folder. |
| 450 */ | 460 */ |
| 461 final PubPackageMapProvider _packageMapProvider; |
| 462 |
| 463 /// Provider of analysis options. |
| 451 AnalysisOptionsProvider analysisOptionsProvider = | 464 AnalysisOptionsProvider analysisOptionsProvider = |
| 452 new AnalysisOptionsProvider(); | 465 new AnalysisOptionsProvider(); |
| 453 | 466 |
| 454 /** | 467 /** |
| 455 * A list of the globs used to determine which files should be analyzed. | 468 * A list of the globs used to determine which files should be analyzed. |
| 456 */ | 469 */ |
| 457 final List<Glob> analyzedFilesGlobs; | 470 final List<Glob> analyzedFilesGlobs; |
| 458 | 471 |
| 459 /** | 472 /** |
| 460 * The default options used to create new analysis contexts. | 473 * The default options used to create new analysis contexts. |
| (...skipping 25 matching lines...) Expand all Loading... |
| 486 * Stream subscription we are using to watch each analysis root directory for | 499 * Stream subscription we are using to watch each analysis root directory for |
| 487 * changes. | 500 * changes. |
| 488 */ | 501 */ |
| 489 final Map<Folder, StreamSubscription<WatchEvent>> changeSubscriptions = | 502 final Map<Folder, StreamSubscription<WatchEvent>> changeSubscriptions = |
| 490 <Folder, StreamSubscription<WatchEvent>>{}; | 503 <Folder, StreamSubscription<WatchEvent>>{}; |
| 491 | 504 |
| 492 ContextManagerImpl( | 505 ContextManagerImpl( |
| 493 this.resourceProvider, | 506 this.resourceProvider, |
| 494 this.sdkManager, | 507 this.sdkManager, |
| 495 this.packageResolverProvider, | 508 this.packageResolverProvider, |
| 509 this._packageMapProvider, |
| 496 this.analyzedFilesGlobs, | 510 this.analyzedFilesGlobs, |
| 497 this._instrumentationService, | 511 this._instrumentationService, |
| 498 this.defaultContextOptions) { | 512 this.defaultContextOptions) { |
| 499 absolutePathContext = resourceProvider.absolutePathContext; | 513 absolutePathContext = resourceProvider.absolutePathContext; |
| 500 pathContext = resourceProvider.pathContext; | 514 pathContext = resourceProvider.pathContext; |
| 501 } | 515 } |
| 502 | 516 |
| 503 @override | 517 @override |
| 504 Iterable<AnalysisContext> get analysisContexts => folderMap.values; | 518 Iterable<AnalysisContext> get analysisContexts => folderMap.values; |
| 505 | 519 |
| (...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 962 return new PackagesFileDisposition(packages); | 976 return new PackagesFileDisposition(packages); |
| 963 } | 977 } |
| 964 } | 978 } |
| 965 // The package root does not exist (or is not a folder). Since | 979 // The package root does not exist (or is not a folder). Since |
| 966 // [setRoots] ignores any package roots that don't exist (or aren't | 980 // [setRoots] ignores any package roots that don't exist (or aren't |
| 967 // folders), the only way we should be able to get here is due to a race | 981 // folders), the only way we should be able to get here is due to a race |
| 968 // condition. In any case, the package root folder is gone, so we can't | 982 // condition. In any case, the package root folder is gone, so we can't |
| 969 // resolve packages. | 983 // resolve packages. |
| 970 return new NoPackageFolderDisposition(packageRoot: packageRoot); | 984 return new NoPackageFolderDisposition(packageRoot: packageRoot); |
| 971 } else { | 985 } else { |
| 972 // Try .packages first. | 986 PackageMapInfo packageMapInfo; |
| 973 if (absolutePathContext.basename(packagespecFile.path) == | 987 callbacks.computingPackageMap(true); |
| 974 PACKAGE_SPEC_NAME) { | 988 try { |
| 975 Packages packages = _readPackagespec(packagespecFile); | 989 // Try .packages first. |
| 976 return new PackagesFileDisposition(packages); | 990 if (absolutePathContext.basename(packagespecFile.path) == |
| 991 PACKAGE_SPEC_NAME) { |
| 992 Packages packages = _readPackagespec(packagespecFile); |
| 993 return new PackagesFileDisposition(packages); |
| 994 } |
| 995 if (packageResolverProvider != null) { |
| 996 UriResolver resolver = packageResolverProvider(folder); |
| 997 if (resolver != null) { |
| 998 return new CustomPackageResolverDisposition(resolver); |
| 999 } |
| 1000 } |
| 1001 |
| 1002 ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
| 1003 packageMapInfo = _packageMapProvider.computePackageMap(folder); |
| 1004 }); |
| 1005 } finally { |
| 1006 callbacks.computingPackageMap(false); |
| 977 } | 1007 } |
| 978 if (packageResolverProvider != null) { | 1008 for (String dependencyPath in packageMapInfo.dependencies) { |
| 979 UriResolver resolver = packageResolverProvider(folder); | 1009 addDependency(dependencyPath); |
| 980 if (resolver != null) { | |
| 981 return new CustomPackageResolverDisposition(resolver); | |
| 982 } | |
| 983 } | 1010 } |
| 984 return new NoPackageFolderDisposition(); | 1011 if (packageMapInfo.packageMap == null) { |
| 1012 return new NoPackageFolderDisposition(); |
| 1013 } |
| 1014 return new PackageMapDisposition(packageMapInfo.packageMap); |
| 985 } | 1015 } |
| 986 } | 1016 } |
| 987 | 1017 |
| 988 /** | 1018 /** |
| 989 * Create a new empty context associated with [folder], having parent | 1019 * Create a new empty context associated with [folder], having parent |
| 990 * [parent] and using [packagespecFile] to resolve package URI's. | 1020 * [parent] and using [packagespecFile] to resolve package URI's. |
| 991 */ | 1021 */ |
| 992 ContextInfo _createContext( | 1022 ContextInfo _createContext( |
| 993 ContextInfo parent, Folder folder, File packagespecFile) { | 1023 ContextInfo parent, Folder folder, File packagespecFile) { |
| 994 List<String> dependencies = <String>[]; | 1024 List<String> dependencies = <String>[]; |
| (...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1785 } | 1815 } |
| 1786 return _embedderLocator; | 1816 return _embedderLocator; |
| 1787 } | 1817 } |
| 1788 | 1818 |
| 1789 @override | 1819 @override |
| 1790 SdkExtensionFinder getSdkExtensionFinder(ResourceProvider resourceProvider) { | 1820 SdkExtensionFinder getSdkExtensionFinder(ResourceProvider resourceProvider) { |
| 1791 return _sdkExtensionFinder ??= | 1821 return _sdkExtensionFinder ??= |
| 1792 new SdkExtensionFinder(buildPackageMap(resourceProvider)); | 1822 new SdkExtensionFinder(buildPackageMap(resourceProvider)); |
| 1793 } | 1823 } |
| 1794 } | 1824 } |
| OLD | NEW |