|
6 | 6 | use std::fmt;
|
7 | 7 | use std::ops::{Deref, DerefMut};
|
8 | 8 |
|
| 9 | +use rustc_hash::FxHashSet; |
| 10 | + |
9 | 11 | use crate::package::Package;
|
10 | 12 | use crate::term::Term;
|
11 | 13 | use crate::type_aliases::Map;
|
@@ -72,6 +74,31 @@ pub struct Derived<P: Package, VS: VersionSet> {
|
72 | 74 | }
|
73 | 75 |
|
74 | 76 | impl<P: Package, VS: VersionSet> DerivationTree<P, VS> {
|
| 77 | + /// Get all [Package]s referred to in the deriviation tree. |
| 78 | + pub fn packages(&self) -> FxHashSet<&P> { |
| 79 | + let mut packages = FxHashSet::default(); |
| 80 | + match self { |
| 81 | + Self::External(external) => match external { |
| 82 | + External::FromDependencyOf(p, _, p2, _) => { |
| 83 | + packages.insert(p); |
| 84 | + packages.insert(p2); |
| 85 | + } |
| 86 | + External::NoVersions(p, _) |
| 87 | + | External::NotRoot(p, _) |
| 88 | + | External::UnavailableDependencies(p, _) |
| 89 | + | External::UnusableDependencies(p, ..) => { |
| 90 | + packages.insert(p); |
| 91 | + } |
| 92 | + }, |
| 93 | + Self::Derived(derived) => { |
| 94 | + packages.extend(derived.terms.keys()); |
| 95 | + packages.extend(derived.cause1.packages().iter()); |
| 96 | + packages.extend(derived.cause2.packages().iter()); |
| 97 | + } |
| 98 | + } |
| 99 | + packages |
| 100 | + } |
| 101 | + |
75 | 102 | /// Merge the [NoVersions](External::NoVersions) external incompatibilities
|
76 | 103 | /// with the other one they are matched with
|
77 | 104 | /// in a derived incompatibility.
|
|
0 commit comments