Chromium Code Reviews| Index: lib/src/analyzer/multi_package_resolver.dart |
| diff --git a/lib/src/analyzer/multi_package_resolver.dart b/lib/src/analyzer/multi_package_resolver.dart |
| index 66905eca920fb7b54801265e105d244a7fd2b67d..5d12f5e7393c4d3b79bda4b49dc13132defb790c 100644 |
| --- a/lib/src/analyzer/multi_package_resolver.dart |
| +++ b/lib/src/analyzer/multi_package_resolver.dart |
| @@ -7,7 +7,7 @@ import 'dart:io'; |
| import 'package:analyzer/src/generated/java_io.dart'; |
| import 'package:analyzer/src/generated/source.dart'; |
| import 'package:analyzer/src/generated/source_io.dart'; |
| -import 'package:path/path.dart' show join; |
| +import 'package:path/path.dart' as path; |
| /// A package resolver that supports a non-standard package layout, where |
| /// packages with dotted names are expanded to a hierarchy of directories, and |
| @@ -31,11 +31,33 @@ class MultiPackageResolver extends UriResolver { |
| return null; |
| } |
| - /// Resolve [path] by looking at each prefix in [searchPaths] and returning |
| - /// the first location where `prefix + path` exists. |
| - String _resolve(String path) { |
| + @override |
| + Uri restoreAbsolute(Source source) { |
|
Paul Berry
2016/04/27 19:19:57
FYI, technically this breaks the interface contrac
|
| + var uri = source.uri; |
| + if (uri.scheme == 'package' || uri.scheme == 'dart') { |
| + return uri; |
| + } |
| + if (uri.scheme == '' || uri.scheme == 'file') { |
| + var filePath = path.absolute(uri.path); |
|
Paul Berry
2016/04/27 19:19:57
This won't work on Windows, since uri.path uses '/
|
| + for (var searchPath in searchPaths) { |
| + if (path.isWithin(searchPath, filePath)) { |
| + var relativePath = path.relative(filePath, from: searchPath); |
| + var segments = path.split(relativePath); |
| + var libIndex = segments.lastIndexOf('lib'); |
|
vsm
2016/04/27 18:24:35
This is not yet tested and seems brittle...
|
| + var packageName = segments.sublist(0, libIndex).join('.'); |
| + var packageRelativePath = segments.sublist(libIndex + 1).join('/'); |
| + return Uri.parse('package:$packageName/$packageRelativePath'); |
| + } |
| + } |
| + } |
| + return null; |
| + } |
| + |
| + /// Resolve [packagePath] by looking at each prefix in [searchPaths] and returning |
|
Jennifer Messerly
2016/04/27 18:30:05
long line
|
| + /// the first location where `prefix + packagePath` exists. |
| + String _resolve(String packagePath) { |
| for (var prefix in searchPaths) { |
| - var resolvedPath = join(prefix, path); |
| + var resolvedPath = path.join(prefix, packagePath); |
| if (new File(resolvedPath).existsSync()) return resolvedPath; |
| } |
| return null; |