diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b5e156..3015523 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ - Updated to support new rules for picking `package_config.json` over a specified `.packages`. +- Deduce package root from `.packages` derived package configuration, + and default all such packages to language version 2.7. ## 1.9.1 diff --git a/lib/src/packages_file.dart b/lib/src/packages_file.dart index e65e7e8..184b0dd 100644 --- a/lib/src/packages_file.dart +++ b/lib/src/packages_file.dart @@ -7,6 +7,12 @@ import "package_config_impl.dart"; import "util.dart"; import "errors.dart"; +/// The language version prior to the release of language versioning. +/// +/// This is the default language version used by all packages from a +/// `.packages` file. +final LanguageVersion _languageVersion = LanguageVersion(2, 7); + /// Parses a `.packages` file into a [PackageConfig]. /// /// The [source] is the byte content of a `.packages` file, assumed to be @@ -100,17 +106,24 @@ PackageConfig parse( "Package URI as location for package", source, separatorIndex + 1)); continue; } - if (!packageLocation.path.endsWith('/')) { - packageLocation = - packageLocation.replace(path: packageLocation.path + "/"); + var path = packageLocation.path; + if (!path.endsWith('/')) { + path += "/"; + packageLocation = packageLocation.replace(path: path); } if (packageNames.contains(packageName)) { onError(PackageConfigFormatException( "Same package name occured more than once", source, start)); continue; } + var rootUri = packageLocation; + if (path.endsWith("/lib/")) { + // Assume default Pub package layout. Include package itself in root. + rootUri = + packageLocation.replace(path: path.substring(0, path.length - 4)); + } var package = SimplePackage.validate( - packageName, packageLocation, packageLocation, null, null, (error) { + packageName, rootUri, packageLocation, _languageVersion, null, (error) { if (error is ArgumentError) { onError(PackageConfigFormatException(error.message, source)); } else { diff --git a/test/parse_test.dart b/test/parse_test.dart index 367b643..59a7e71 100644 --- a/test/parse_test.dart +++ b/test/parse_test.dart @@ -34,9 +34,9 @@ void main() { var foo = result["foo"]; expect(foo, isNotNull); - expect(foo.root, Uri.parse("file:///foo/lib/")); + expect(foo.root, Uri.parse("file:///foo/")); expect(foo.packageUriRoot, Uri.parse("file:///foo/lib/")); - expect(foo.languageVersion, null); + expect(foo.languageVersion, LanguageVersion(2, 7)); }); test("valid empty", () {