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' hide Resource; | 10 import 'dart:core' hide Resource; |
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 } catch (e, s) { | 779 } catch (e, s) { |
780 // Ignore packages that do not exist | 780 // Ignore packages that do not exist |
781 _instrumentationService.logException(e, s); | 781 _instrumentationService.logException(e, s); |
782 continue; | 782 continue; |
783 } | 783 } |
784 Resource res = resourceProvider.getResource(path); | 784 Resource res = resourceProvider.getResource(path); |
785 if (res is Folder) { | 785 if (res is Folder) { |
786 packageMap[file.getName()] = <Folder>[res]; | 786 packageMap[file.getName()] = <Folder>[res]; |
787 } | 787 } |
788 } | 788 } |
789 return new PackageMapDisposition(packageMap); | 789 return new PackageMapDisposition(packageMap, |
| 790 packageRoot: info.packageRoot); |
790 } | 791 } |
791 // The package root does not exist (or is not a folder). Since | 792 // The package root does not exist (or is not a folder). Since |
792 // [setRoots] ignores any package roots that don't exist (or aren't | 793 // [setRoots] ignores any package roots that don't exist (or aren't |
793 // folders), the only way we should be able to get here is due to a race | 794 // folders), the only way we should be able to get here is due to a race |
794 // condition. In any case, the package root folder is gone, so we can't | 795 // condition. In any case, the package root folder is gone, so we can't |
795 // resolve packages. | 796 // resolve packages. |
796 return new NoPackageFolderDisposition(); | 797 return new NoPackageFolderDisposition(packageRoot: info.packageRoot); |
797 } else { | 798 } else { |
798 callbacks.beginComputePackageMap(); | 799 callbacks.beginComputePackageMap(); |
799 if (packageResolverProvider != null) { | 800 if (packageResolverProvider != null) { |
800 UriResolver resolver = packageResolverProvider(folder); | 801 UriResolver resolver = packageResolverProvider(folder); |
801 if (resolver != null) { | 802 if (resolver != null) { |
802 return new CustomPackageResolverDisposition(resolver); | 803 return new CustomPackageResolverDisposition(resolver); |
803 } | 804 } |
804 } | 805 } |
805 PackageMapInfo packageMapInfo; | 806 PackageMapInfo packageMapInfo; |
806 ServerPerformanceStatistics.pub.makeCurrentWhile(() { | 807 ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1262 */ | 1263 */ |
1263 class CustomPackageResolverDisposition extends FolderDisposition { | 1264 class CustomPackageResolverDisposition extends FolderDisposition { |
1264 /** | 1265 /** |
1265 * The [UriResolver] that should be used to resolve package URIs. | 1266 * The [UriResolver] that should be used to resolve package URIs. |
1266 */ | 1267 */ |
1267 UriResolver resolver; | 1268 UriResolver resolver; |
1268 | 1269 |
1269 CustomPackageResolverDisposition(this.resolver); | 1270 CustomPackageResolverDisposition(this.resolver); |
1270 | 1271 |
1271 @override | 1272 @override |
| 1273 String get packageRoot => null; |
| 1274 |
| 1275 @override |
1272 Packages get packages => null; | 1276 Packages get packages => null; |
1273 | 1277 |
1274 @override | 1278 @override |
1275 Iterable<UriResolver> createPackageUriResolvers( | 1279 Iterable<UriResolver> createPackageUriResolvers( |
1276 ResourceProvider resourceProvider) => <UriResolver>[resolver]; | 1280 ResourceProvider resourceProvider) => <UriResolver>[resolver]; |
1277 } | 1281 } |
1278 | 1282 |
1279 /** | 1283 /** |
1280 * An instance of the class [FolderDisposition] represents the information | 1284 * An instance of the class [FolderDisposition] represents the information |
1281 * gathered by the [ContextManagerImpl] to determine how to create an | 1285 * gathered by the [ContextManagerImpl] to determine how to create an |
1282 * [AnalysisContext] for a given folder. | 1286 * [AnalysisContext] for a given folder. |
1283 * | 1287 * |
1284 * Note: [ContextManagerImpl] may use equality testing and hash codes to | 1288 * Note: [ContextManagerImpl] may use equality testing and hash codes to |
1285 * determine when two folders should share the same context, so derived classes | 1289 * determine when two folders should share the same context, so derived classes |
1286 * may need to override operator== and hashCode() if object identity is | 1290 * may need to override operator== and hashCode() if object identity is |
1287 * insufficient. | 1291 * insufficient. |
1288 * | 1292 * |
1289 * TODO(paulberry): consider adding a flag to indicate that it is not necessary | 1293 * TODO(paulberry): consider adding a flag to indicate that it is not necessary |
1290 * to recurse into the given folder looking for additional contexts to create | 1294 * to recurse into the given folder looking for additional contexts to create |
1291 * or files to analyze (this could help avoid unnecessarily weighing down the | 1295 * or files to analyze (this could help avoid unnecessarily weighing down the |
1292 * system with file watchers). | 1296 * system with file watchers). |
1293 */ | 1297 */ |
1294 abstract class FolderDisposition { | 1298 abstract class FolderDisposition { |
1295 /** | 1299 /** |
| 1300 * If this [FolderDisposition] was created based on a package root |
| 1301 * folder, the absolute path to that folder. Otherwise `null`. |
| 1302 */ |
| 1303 String get packageRoot; |
| 1304 |
| 1305 /** |
1296 * If contexts governed by this [FolderDisposition] should resolve packages | 1306 * If contexts governed by this [FolderDisposition] should resolve packages |
1297 * using the ".packages" file mechanism (DEP 5), retrieve the [Packages] | 1307 * using the ".packages" file mechanism (DEP 5), retrieve the [Packages] |
1298 * object that resulted from parsing the ".packages" file. | 1308 * object that resulted from parsing the ".packages" file. |
1299 */ | 1309 */ |
1300 Packages get packages; | 1310 Packages get packages; |
1301 | 1311 |
1302 /** | 1312 /** |
1303 * Create all the [UriResolver]s which should be used to resolve packages in | 1313 * Create all the [UriResolver]s which should be used to resolve packages in |
1304 * contexts governed by this [FolderDisposition]. | 1314 * contexts governed by this [FolderDisposition]. |
1305 * | 1315 * |
1306 * [resourceProvider] is provided since it is needed to construct most | 1316 * [resourceProvider] is provided since it is needed to construct most |
1307 * [UriResolver]s. | 1317 * [UriResolver]s. |
1308 */ | 1318 */ |
1309 Iterable<UriResolver> createPackageUriResolvers( | 1319 Iterable<UriResolver> createPackageUriResolvers( |
1310 ResourceProvider resourceProvider); | 1320 ResourceProvider resourceProvider); |
1311 } | 1321 } |
1312 | 1322 |
1313 /** | 1323 /** |
1314 * Concrete [FolderDisposition] object indicating that the context for a given | 1324 * Concrete [FolderDisposition] object indicating that the context for a given |
1315 * folder should not resolve "package:" URIs at all. | 1325 * folder should not resolve "package:" URIs at all. |
1316 * | |
1317 * TODO(paulberry): consider making this a singleton object (which would cause | |
1318 * all folders that don't resolve "package:" URIs to share the same context). | |
1319 */ | 1326 */ |
1320 class NoPackageFolderDisposition extends FolderDisposition { | 1327 class NoPackageFolderDisposition extends FolderDisposition { |
1321 @override | 1328 @override |
| 1329 final String packageRoot; |
| 1330 |
| 1331 NoPackageFolderDisposition({this.packageRoot}); |
| 1332 |
| 1333 @override |
1322 Packages get packages => null; | 1334 Packages get packages => null; |
1323 | 1335 |
1324 @override | 1336 @override |
1325 Iterable<UriResolver> createPackageUriResolvers( | 1337 Iterable<UriResolver> createPackageUriResolvers( |
1326 ResourceProvider resourceProvider) => const <UriResolver>[]; | 1338 ResourceProvider resourceProvider) => const <UriResolver>[]; |
1327 } | 1339 } |
1328 | 1340 |
1329 /** | 1341 /** |
1330 * Concrete [FolderDisposition] object indicating that the context for a given | 1342 * Concrete [FolderDisposition] object indicating that the context for a given |
1331 * folder should resolve packages using a package map. | 1343 * folder should resolve packages using a package map. |
1332 */ | 1344 */ |
1333 class PackageMapDisposition extends FolderDisposition { | 1345 class PackageMapDisposition extends FolderDisposition { |
1334 final Map<String, List<Folder>> packageMap; | 1346 final Map<String, List<Folder>> packageMap; |
1335 | 1347 |
1336 PackageMapDisposition(this.packageMap); | 1348 @override |
| 1349 final String packageRoot; |
| 1350 |
| 1351 PackageMapDisposition(this.packageMap, {this.packageRoot}); |
1337 | 1352 |
1338 @override | 1353 @override |
1339 Packages get packages => null; | 1354 Packages get packages => null; |
1340 | 1355 |
1341 @override | 1356 @override |
1342 Iterable<UriResolver> createPackageUriResolvers( | 1357 Iterable<UriResolver> createPackageUriResolvers( |
1343 ResourceProvider resourceProvider) => | 1358 ResourceProvider resourceProvider) => |
1344 <UriResolver>[new PackageMapUriResolver(resourceProvider, packageMap)]; | 1359 <UriResolver>[new PackageMapUriResolver(resourceProvider, packageMap)]; |
1345 } | 1360 } |
1346 | 1361 |
1347 /** | 1362 /** |
1348 * Concrete [FolderDisposition] object indicating that the context for a given | 1363 * Concrete [FolderDisposition] object indicating that the context for a given |
1349 * folder should resolve packages using a ".packages" file. | 1364 * folder should resolve packages using a ".packages" file. |
1350 */ | 1365 */ |
1351 class PackagesFileDisposition extends FolderDisposition { | 1366 class PackagesFileDisposition extends FolderDisposition { |
1352 @override | 1367 @override |
1353 final Packages packages; | 1368 final Packages packages; |
1354 | 1369 |
1355 PackagesFileDisposition(this.packages) {} | 1370 PackagesFileDisposition(this.packages) {} |
1356 | 1371 |
1357 @override | 1372 @override |
| 1373 String get packageRoot => null; |
| 1374 |
| 1375 @override |
1358 Iterable<UriResolver> createPackageUriResolvers( | 1376 Iterable<UriResolver> createPackageUriResolvers( |
1359 ResourceProvider resourceProvider) => const <UriResolver>[]; | 1377 ResourceProvider resourceProvider) => const <UriResolver>[]; |
1360 } | 1378 } |
OLD | NEW |