Index: pkg/analyzer/lib/source/package_map_resolver.dart |
diff --git a/pkg/analyzer/lib/source/package_map_resolver.dart b/pkg/analyzer/lib/source/package_map_resolver.dart |
index 056016fc32418d7c8833d6edd6b32a196c129d80..3eeda219d58253a953ccbdb87cf0f7c93d2ed955 100644 |
--- a/pkg/analyzer/lib/source/package_map_resolver.dart |
+++ b/pkg/analyzer/lib/source/package_map_resolver.dart |
@@ -41,6 +41,13 @@ class PackageMapUriResolver extends UriResolver { |
PackageMapUriResolver(this.resourceProvider, this.packageMap) { |
asserts.notNull(resourceProvider); |
asserts.notNull(packageMap); |
+ packageMap.forEach((name, folders) { |
+ if (folders.length != 1) { |
+ throw new ArgumentError( |
+ 'Exactly one folder must be specified for a package.' |
+ 'Found $name = $folders'); |
+ } |
+ }); |
} |
@override |
@@ -58,74 +65,31 @@ class PackageMapUriResolver extends UriResolver { |
// <pkgName>/<relPath> |
String pkgName = path.substring(0, index); |
String relPath = path.substring(index + 1); |
- // Try to find an existing file. |
+ // If the package is known, return the corresponding file. |
List<Folder> packageDirs = packageMap[pkgName]; |
if (packageDirs != null) { |
- for (Folder packageDir in packageDirs) { |
- if (packageDir.exists) { |
- Resource result = packageDir.getChild(relPath); |
- if (result is File && result.exists) { |
- return result.createSource(uri); |
- } |
- } |
- } |
+ Folder packageDir = packageDirs.single; |
+ File file = packageDir.getChildAssumingFile(relPath); |
+ return file.createSource(uri); |
} |
- // Return a NonExistingSource instance. |
- // This helps provide more meaningful error messages to users |
- // (a missing file error, as opposed to an invalid URI error). |
- String fullPath = packageDirs != null && packageDirs.isNotEmpty |
- ? packageDirs.first.canonicalizePath(relPath) |
- : relPath; |
- return new NonExistingSource(fullPath, uri, UriKind.PACKAGE_URI); |
+ return null; |
} |
@override |
Uri restoreAbsolute(Source source) { |
String sourcePath = source.fullName; |
- Uri bestMatch; |
- int bestMatchLength = -1; |
pathos.Context pathContext = resourceProvider.pathContext; |
for (String pkgName in packageMap.keys) { |
- List<Folder> pkgFolders = packageMap[pkgName]; |
- for (int i = 0; i < pkgFolders.length; i++) { |
- Folder pkgFolder = pkgFolders[i]; |
- String pkgFolderPath = pkgFolder.path; |
- if (pkgFolderPath.length > bestMatchLength && |
- sourcePath.startsWith(pkgFolderPath + pathContext.separator)) { |
- String relPath = sourcePath.substring(pkgFolderPath.length + 1); |
- if (_isReversibleTranslation(pkgFolders, i, relPath)) { |
- List<String> relPathComponents = pathContext.split(relPath); |
- String relUriPath = pathos.posix.joinAll(relPathComponents); |
- bestMatch = Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath'); |
- bestMatchLength = pkgFolderPath.length; |
- } |
- } |
- } |
- } |
- return bestMatch; |
- } |
- |
- /** |
- * A translation from file path to package URI has just been found for |
- * using the [packageDirIndex]th element of [packageDirs], and appending the |
- * relative path [relPath]. Determine whether the translation is reversible; |
- * that is, whether translating the package URI pack to a file path will |
- * produce the file path we started with. |
- */ |
- bool _isReversibleTranslation( |
- List<Folder> packageDirs, int packageDirIndex, String relPath) { |
- // The translation is reversible provided there is no prior element of |
- // [packageDirs] containing a file matching [relPath]. |
- for (int i = 0; i < packageDirIndex; i++) { |
- Folder packageDir = packageDirs[i]; |
- if (packageDir.exists) { |
- Resource result = packageDir.getChild(relPath); |
- if (result is File && result.exists) { |
- return false; |
- } |
+ Folder pkgFolder = packageMap[pkgName][0]; |
+ String pkgFolderPath = pkgFolder.path; |
+ if (sourcePath.startsWith(pkgFolderPath + pathContext.separator)) { |
+ String relPath = sourcePath.substring(pkgFolderPath.length + 1); |
+ List<String> relPathComponents = pathContext.split(relPath); |
+ String relUriPath = pathos.posix.joinAll(relPathComponents); |
+ return Uri.parse('$PACKAGE_SCHEME:$pkgName/$relUriPath'); |
} |
} |
- return true; |
+ return null; |
} |
/** |