| 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 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 * Class that maintains a mapping from included/excluded paths to a set of | 310 * Class that maintains a mapping from included/excluded paths to a set of |
| 311 * folders that should correspond to analysis contexts. | 311 * folders that should correspond to analysis contexts. |
| 312 */ | 312 */ |
| 313 class ContextManagerImpl implements ContextManager { | 313 class ContextManagerImpl implements ContextManager { |
| 314 /** | 314 /** |
| 315 * File name of analysis options files. | 315 * File name of analysis options files. |
| 316 */ | 316 */ |
| 317 static const String ANALYSIS_OPTIONS_FILE = '.analysis_options'; | 317 static const String ANALYSIS_OPTIONS_FILE = '.analysis_options'; |
| 318 | 318 |
| 319 /** | 319 /** |
| 320 * Temporary flag to hide WIP .packages support (DEP 5). | |
| 321 */ | |
| 322 static bool ENABLE_PACKAGESPEC_SUPPORT = serverOptions.isSet( | |
| 323 'ContextManagerImpl.ENABLE_PACKAGESPEC_SUPPORT', | |
| 324 defaultValue: true); | |
| 325 | |
| 326 /** | |
| 327 * The name of the `lib` directory. | 320 * The name of the `lib` directory. |
| 328 */ | 321 */ |
| 329 static const String LIB_DIR_NAME = 'lib'; | 322 static const String LIB_DIR_NAME = 'lib'; |
| 330 | 323 |
| 331 /** | 324 /** |
| 332 * The name of `packages` folders. | 325 * The name of `packages` folders. |
| 333 */ | 326 */ |
| 334 static const String PACKAGES_NAME = 'packages'; | 327 static const String PACKAGES_NAME = 'packages'; |
| 335 | 328 |
| 336 /** | 329 /** |
| (...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 820 // The package root does not exist (or is not a folder). Since | 813 // The package root does not exist (or is not a folder). Since |
| 821 // [setRoots] ignores any package roots that don't exist (or aren't | 814 // [setRoots] ignores any package roots that don't exist (or aren't |
| 822 // folders), the only way we should be able to get here is due to a race | 815 // folders), the only way we should be able to get here is due to a race |
| 823 // condition. In any case, the package root folder is gone, so we can't | 816 // condition. In any case, the package root folder is gone, so we can't |
| 824 // resolve packages. | 817 // resolve packages. |
| 825 return new NoPackageFolderDisposition(packageRoot: packageRoot); | 818 return new NoPackageFolderDisposition(packageRoot: packageRoot); |
| 826 } else { | 819 } else { |
| 827 PackageMapInfo packageMapInfo; | 820 PackageMapInfo packageMapInfo; |
| 828 callbacks.beginComputePackageMap(); | 821 callbacks.beginComputePackageMap(); |
| 829 try { | 822 try { |
| 830 if (ENABLE_PACKAGESPEC_SUPPORT) { | 823 // Try .packages first. |
| 831 // Try .packages first. | 824 if (pathContext.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) { |
| 832 if (pathContext.basename(packagespecFile.path) == PACKAGE_SPEC_NAME) { | 825 Packages packages = _readPackagespec(packagespecFile); |
| 833 Packages packages = _readPackagespec(packagespecFile); | 826 return new PackagesFileDisposition(packages); |
| 834 return new PackagesFileDisposition(packages); | |
| 835 } | |
| 836 } | 827 } |
| 837 if (packageResolverProvider != null) { | 828 if (packageResolverProvider != null) { |
| 838 UriResolver resolver = packageResolverProvider(folder); | 829 UriResolver resolver = packageResolverProvider(folder); |
| 839 if (resolver != null) { | 830 if (resolver != null) { |
| 840 return new CustomPackageResolverDisposition(resolver); | 831 return new CustomPackageResolverDisposition(resolver); |
| 841 } | 832 } |
| 842 } | 833 } |
| 843 ServerPerformanceStatistics.pub.makeCurrentWhile(() { | 834 ServerPerformanceStatistics.pub.makeCurrentWhile(() { |
| 844 packageMapInfo = _packageMapProvider.computePackageMap(folder); | 835 packageMapInfo = _packageMapProvider.computePackageMap(folder); |
| 845 }); | 836 }); |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 /** | 977 /** |
| 987 * Find the file that should be used to determine whether a context needs to | 978 * Find the file that should be used to determine whether a context needs to |
| 988 * be created here--this is either the ".packages" file or the "pubspec.yaml" | 979 * be created here--this is either the ".packages" file or the "pubspec.yaml" |
| 989 * file. | 980 * file. |
| 990 */ | 981 */ |
| 991 File _findPackageSpecFile(Folder folder) { | 982 File _findPackageSpecFile(Folder folder) { |
| 992 // Decide whether a context needs to be created for [folder] here, and if | 983 // Decide whether a context needs to be created for [folder] here, and if |
| 993 // so, create it. | 984 // so, create it. |
| 994 File packageSpec; | 985 File packageSpec; |
| 995 | 986 |
| 996 if (ENABLE_PACKAGESPEC_SUPPORT) { | 987 // Start by looking for .packages. |
| 997 // Start by looking for .packages. | 988 packageSpec = folder.getChild(PACKAGE_SPEC_NAME); |
| 998 packageSpec = folder.getChild(PACKAGE_SPEC_NAME); | |
| 999 } | |
| 1000 | 989 |
| 1001 // Fall back to looking for a pubspec. | 990 // Fall back to looking for a pubspec. |
| 1002 if (packageSpec == null || !packageSpec.exists) { | 991 if (packageSpec == null || !packageSpec.exists) { |
| 1003 packageSpec = folder.getChild(PUBSPEC_NAME); | 992 packageSpec = folder.getChild(PUBSPEC_NAME); |
| 1004 } | 993 } |
| 1005 return packageSpec; | 994 return packageSpec; |
| 1006 } | 995 } |
| 1007 | 996 |
| 1008 /** | 997 /** |
| 1009 * Return the [ContextInfo] for the "innermost" context whose associated | 998 * Return the [ContextInfo] for the "innermost" context whose associated |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 } | 1052 } |
| 1064 // handle the change | 1053 // handle the change |
| 1065 switch (event.type) { | 1054 switch (event.type) { |
| 1066 case ChangeType.ADD: | 1055 case ChangeType.ADD: |
| 1067 if (_isInPackagesDir(path, info.folder)) { | 1056 if (_isInPackagesDir(path, info.folder)) { |
| 1068 return; | 1057 return; |
| 1069 } | 1058 } |
| 1070 | 1059 |
| 1071 Resource resource = resourceProvider.getResource(path); | 1060 Resource resource = resourceProvider.getResource(path); |
| 1072 | 1061 |
| 1073 if (ENABLE_PACKAGESPEC_SUPPORT) { | 1062 String directoryPath = pathContext.dirname(path); |
| 1074 String directoryPath = pathContext.dirname(path); | |
| 1075 | 1063 |
| 1076 // Check to see if we need to create a new context. | 1064 // Check to see if we need to create a new context. |
| 1077 if (info.isTopLevel) { | 1065 if (info.isTopLevel) { |
| 1078 // Only create a new context if this is not the same directory | 1066 // Only create a new context if this is not the same directory |
| 1079 // described by our info object. | 1067 // described by our info object. |
| 1080 if (info.folder.path != directoryPath) { | 1068 if (info.folder.path != directoryPath) { |
| 1081 if (_isPubspec(path)) { | 1069 if (_isPubspec(path)) { |
| 1082 // Check for a sibling .packages file. | 1070 // Check for a sibling .packages file. |
| 1083 if (!resourceProvider | 1071 if (!resourceProvider |
| 1084 .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME)) | 1072 .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME)) |
| 1085 .exists) { | 1073 .exists) { |
| 1086 _extractContext(info, resource); | 1074 _extractContext(info, resource); |
| 1087 return; | 1075 return; |
| 1088 } | |
| 1089 } | |
| 1090 if (_isPackagespec(path)) { | |
| 1091 // Check for a sibling pubspec.yaml file. | |
| 1092 if (!resourceProvider | |
| 1093 .getFile(pathContext.join(directoryPath, PUBSPEC_NAME)) | |
| 1094 .exists) { | |
| 1095 _extractContext(info, resource); | |
| 1096 return; | |
| 1097 } | |
| 1098 } | 1076 } |
| 1099 } | 1077 } |
| 1100 } | 1078 if (_isPackagespec(path)) { |
| 1101 } else { | 1079 // Check for a sibling pubspec.yaml file. |
| 1102 // pubspec was added in a sub-folder, extract a new context | 1080 if (!resourceProvider |
| 1103 if (_isPubspec(path) && | 1081 .getFile(pathContext.join(directoryPath, PUBSPEC_NAME)) |
| 1104 info.isTopLevel && | 1082 .exists) { |
| 1105 !info.isPathToPackageDescription(path)) { | 1083 _extractContext(info, resource); |
| 1106 _extractContext(info, resource); | 1084 return; |
| 1107 return; | 1085 } |
| 1086 } |
| 1108 } | 1087 } |
| 1109 } | 1088 } |
| 1110 | 1089 |
| 1111 // If the file went away and was replaced by a folder before we | 1090 // If the file went away and was replaced by a folder before we |
| 1112 // had a chance to process the event, resource might be a Folder. In | 1091 // had a chance to process the event, resource might be a Folder. In |
| 1113 // that case don't add it. | 1092 // that case don't add it. |
| 1114 if (resource is File) { | 1093 if (resource is File) { |
| 1115 File file = resource; | 1094 File file = resource; |
| 1116 if (callbacks.shouldFileBeAnalyzed(file)) { | 1095 if (callbacks.shouldFileBeAnalyzed(file)) { |
| 1117 ChangeSet changeSet = new ChangeSet(); | 1096 ChangeSet changeSet = new ChangeSet(); |
| 1118 Source source = createSourceInContext(info.context, file); | 1097 Source source = createSourceInContext(info.context, file); |
| 1119 changeSet.addedSource(source); | 1098 changeSet.addedSource(source); |
| 1120 callbacks.applyChangesToContext(info.folder, changeSet); | 1099 callbacks.applyChangesToContext(info.folder, changeSet); |
| 1121 info.sources[path] = source; | 1100 info.sources[path] = source; |
| 1122 } | 1101 } |
| 1123 } | 1102 } |
| 1124 break; | 1103 break; |
| 1125 case ChangeType.REMOVE: | 1104 case ChangeType.REMOVE: |
| 1126 | 1105 |
| 1127 // If package spec info is removed, check to see if we can merge context
s. | 1106 // If package spec info is removed, check to see if we can merge context
s. |
| 1128 // Note that it's important to verify that there is NEITHER a .packages
nor a | 1107 // Note that it's important to verify that there is NEITHER a .packages
nor a |
| 1129 // lingering pubspec.yaml before merging. | 1108 // lingering pubspec.yaml before merging. |
| 1130 if (!info.isTopLevel) { | 1109 if (!info.isTopLevel) { |
| 1131 if (ENABLE_PACKAGESPEC_SUPPORT) { | 1110 String directoryPath = pathContext.dirname(path); |
| 1132 String directoryPath = pathContext.dirname(path); | |
| 1133 | 1111 |
| 1134 // Only merge if this is the same directory described by our info ob
ject. | 1112 // Only merge if this is the same directory described by our info obje
ct. |
| 1135 if (info.folder.path == directoryPath) { | 1113 if (info.folder.path == directoryPath) { |
| 1136 if (_isPubspec(path)) { | 1114 if (_isPubspec(path)) { |
| 1137 // Check for a sibling .packages file. | 1115 // Check for a sibling .packages file. |
| 1138 if (!resourceProvider | 1116 if (!resourceProvider |
| 1139 .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME)) | 1117 .getFile(pathContext.join(directoryPath, PACKAGE_SPEC_NAME)) |
| 1140 .exists) { | 1118 .exists) { |
| 1141 _mergeContext(info); | 1119 _mergeContext(info); |
| 1142 return; | 1120 return; |
| 1143 } | |
| 1144 } | |
| 1145 if (_isPackagespec(path)) { | |
| 1146 // Check for a sibling pubspec.yaml file. | |
| 1147 if (!resourceProvider | |
| 1148 .getFile(pathContext.join(directoryPath, PUBSPEC_NAME)) | |
| 1149 .exists) { | |
| 1150 _mergeContext(info); | |
| 1151 return; | |
| 1152 } | |
| 1153 } | 1121 } |
| 1154 } | 1122 } |
| 1155 } else { | 1123 if (_isPackagespec(path)) { |
| 1156 if (info.isPathToPackageDescription(path)) { | 1124 // Check for a sibling pubspec.yaml file. |
| 1157 _mergeContext(info); | 1125 if (!resourceProvider |
| 1158 return; | 1126 .getFile(pathContext.join(directoryPath, PUBSPEC_NAME)) |
| 1127 .exists) { |
| 1128 _mergeContext(info); |
| 1129 return; |
| 1130 } |
| 1159 } | 1131 } |
| 1160 } | 1132 } |
| 1161 } | 1133 } |
| 1162 | 1134 |
| 1163 List<Source> sources = info.context.getSourcesWithFullName(path); | 1135 List<Source> sources = info.context.getSourcesWithFullName(path); |
| 1164 if (!sources.isEmpty) { | 1136 if (!sources.isEmpty) { |
| 1165 ChangeSet changeSet = new ChangeSet(); | 1137 ChangeSet changeSet = new ChangeSet(); |
| 1166 sources.forEach((Source source) { | 1138 sources.forEach((Source source) { |
| 1167 changeSet.removedSource(source); | 1139 changeSet.removedSource(source); |
| 1168 }); | 1140 }); |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1474 var path = resourceProvider.pathContext.fromUri(uri); | 1446 var path = resourceProvider.pathContext.fromUri(uri); |
| 1475 packageMap[name] = <Folder>[resourceProvider.getFolder(path)]; | 1447 packageMap[name] = <Folder>[resourceProvider.getFolder(path)]; |
| 1476 } | 1448 } |
| 1477 }); | 1449 }); |
| 1478 return <UriResolver>[new SdkExtUriResolver(packageMap)]; | 1450 return <UriResolver>[new SdkExtUriResolver(packageMap)]; |
| 1479 } else { | 1451 } else { |
| 1480 return const <UriResolver>[]; | 1452 return const <UriResolver>[]; |
| 1481 } | 1453 } |
| 1482 } | 1454 } |
| 1483 } | 1455 } |
| OLD | NEW |