WIP: Use `Vec` instead of `FxHashMap` to allow multiple versions of requirements to be passed to solver

This allows the solver to provide better error messages since we do not merge versions and drop information
This commit is contained in:
Zanie 2023-11-09 11:11:17 -06:00
parent 7f5ef26301
commit 210b481be8
2 changed files with 35 additions and 35 deletions

View File

@ -12,7 +12,7 @@ use crate::pubgrub::{PubGrubPackage, PubGrubVersion};
use crate::ResolveError;
#[derive(Debug)]
pub struct PubGrubDependencies(FxHashMap<PubGrubPackage, Range<PubGrubVersion>>);
pub struct PubGrubDependencies(Vec<(PubGrubPackage, Range<PubGrubVersion>)>);
impl PubGrubDependencies {
/// Generate a set of `PubGrub` dependencies from a set of requirements.
@ -23,7 +23,7 @@ impl PubGrubDependencies {
source: Option<&'a PackageName>,
env: &'a MarkerEnvironment,
) -> Result<Self, ResolveError> {
let mut dependencies = FxHashMap::<PubGrubPackage, Range<PubGrubVersion>>::default();
let mut dependencies = Vec::new();
// Iterate over all declared requirements.
for requirement in requirements {
@ -56,20 +56,22 @@ impl PubGrubDependencies {
) {
let (package, version) = result?;
if let Some(entry) = dependencies.get_key_value(&package) {
// Merge the versions.
let version = merge_versions(entry.1, &version);
dependencies.push((package.clone(), version.clone()));
// Merge the package.
if let Some(package) = merge_package(entry.0, &package)? {
dependencies.remove(&package);
dependencies.insert(package, version);
} else {
dependencies.insert(package, version);
}
} else {
dependencies.insert(package.clone(), version.clone());
}
// if let Some(entry) = dependencies.get_key_value(&package) {
// // Merge the versions.
// let version = merge_versions(entry.1, &version);
// // Merge the package.
// if let Some(package) = merge_package(entry.0, &package)? {
// dependencies.remove(&package);
// dependencies.insert(package, version);
// } else {
// dependencies.insert(package, version);
// }
// } else {
// dependencies.insert(package.clone(), version.clone());
// }
}
}
@ -104,40 +106,38 @@ impl PubGrubDependencies {
) {
let (package, version) = result?;
if let Some(entry) = dependencies.get_key_value(&package) {
// Merge the versions.
let version = merge_versions(entry.1, &version);
dependencies.push((package.clone(), version.clone()));
// Merge the package.
if let Some(package) = merge_package(entry.0, &package)? {
dependencies.insert(package, version);
} else {
dependencies.insert(package, version);
}
}
// if let Some(entry) = dependencies.get_key_value(&package) {
// // Merge the versions.
// let version = merge_versions(entry.1, &version);
// // Merge the package.
// if let Some(package) = merge_package(entry.0, &package)? {
// dependencies.insert(package, version);
// } else {
// dependencies.insert(package, version);
// }
// }
}
}
Ok(Self(dependencies))
}
/// Insert a [`PubGrubPackage`] and [`PubGrubVersion`] range into the set of dependencies.
pub(crate) fn insert(
&mut self,
package: PubGrubPackage,
version: Range<PubGrubVersion>,
) -> Option<Range<PubGrubVersion>> {
self.0.insert(package, version)
// Insert a [`PubGrubPackage`] and [`PubGrubVersion`] range into the set of dependencies.
pub(crate) fn insert(&mut self, package: PubGrubPackage, version: Range<PubGrubVersion>) {
self.0.push((package, version))
}
/// Iterate over the dependencies.
pub(crate) fn iter(&self) -> impl Iterator<Item = (&PubGrubPackage, &Range<PubGrubVersion>)> {
pub(crate) fn iter(&self) -> impl Iterator<Item = &(PubGrubPackage, Range<PubGrubVersion>)> {
self.0.iter()
}
}
/// Convert a [`PubGrubDependencies`] to a [`DependencyConstraints`].
impl From<PubGrubDependencies> for FxHashMap<PubGrubPackage, Range<PubGrubVersion>> {
impl From<PubGrubDependencies> for Vec<(PubGrubPackage, Range<PubGrubVersion>)> {
fn from(dependencies: PubGrubDependencies) -> Self {
dependencies.0
}

View File

@ -981,5 +981,5 @@ enum Dependencies {
/// Package dependencies are unavailable.
Unknown,
/// Container for all available package versions.
Known(FxHashMap<PubGrubPackage, Range<PubGrubVersion>>),
Known(Vec<(PubGrubPackage, Range<PubGrubVersion>)>),
}