blob: 2552f3306436899a3697eb285c521849cdd7035a [file] [log] [blame]
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/file_system/file_system.dart';
import 'package:analyzer/src/context/package_config_json.dart';
import 'package:analyzer/src/util/uri.dart';
import 'package:meta/meta.dart';
import 'package:package_config/packages_file.dart' as dot_packages;
import 'package:pub_semver/pub_semver.dart';
/// Parse the [file] as a `.packages` file.
Packages parseDotPackagesFile(ResourceProvider provider, File file) {
var uri = file.toUri();
var content = file.readAsBytesSync();
var uriMap = dot_packages.parse(content, uri);
var map = <String, Package>{};
for (var name in uriMap.keys) {
var libUri = uriMap[name];
var libPath = fileUriToNormalizedPath(
provider.pathContext,
libUri,
);
var libFolder = provider.getFolder(libPath);
map[name] = Package(
name: name,
rootFolder: libFolder,
libFolder: libFolder,
languageVersion: null,
);
}
return Packages(map);
}
/// Parse the [file] as a `package_config.json` file.
Packages parsePackageConfigJsonFile(ResourceProvider provider, File file) {
var uri = file.toUri();
var content = file.readAsStringSync();
var jsonConfig = parsePackageConfigJson(uri, content);
var map = <String, Package>{};
for (var jsonPackage in jsonConfig.packages) {
var name = jsonPackage.name;
var rootPath = fileUriToNormalizedPath(
provider.pathContext,
jsonPackage.rootUri,
);
var libPath = fileUriToNormalizedPath(
provider.pathContext,
jsonPackage.packageUri,
);
Version languageVersion;
if (jsonPackage.languageVersion != null) {
languageVersion = Version(
jsonPackage.languageVersion.major,
jsonPackage.languageVersion.minor,
0,
);
// New features were added in `2.2.2` over `2.2.0`.
// But `2.2.2` is not representable, so we special case it.
if (languageVersion.major == 2 && languageVersion.minor == 2) {
languageVersion = Version(2, 2, 2);
}
}
map[name] = Package(
name: name,
rootFolder: provider.getFolder(rootPath),
libFolder: provider.getFolder(libPath),
languageVersion: languageVersion,
);
}
return Packages(map);
}
class Package {
final String name;
final Folder rootFolder;
final Folder libFolder;
/// The language version for this package, `null` not specified explicitly.
final Version languageVersion;
Package({
@required this.name,
@required this.rootFolder,
@required this.libFolder,
@required this.languageVersion,
});
}
class Packages {
static final empty = Packages({});
final Map<String, Package> _map;
Packages(Map<String, Package> map) : _map = map;
Iterable<Package> get packages => _map.values;
/// Return the [Package] with the given [name], or `null`.
Package operator [](String name) => _map[name];
}