in tools/determinator/src/determinator.rs [573:619]
fn new(determinator: &Determinator<'g, '_>, build_cache: &CargoBuildCache<'g>) -> Self {
let mut reverse_index = GraphMap::new();
let workspace_set = determinator.new.resolve_workspace();
// First, look at the result cache and add edges based on that.
for (id, build_result) in &build_cache.result_cache {
reverse_index.extend(
build_result
.unified_workspace_set(&workspace_set)
.package_ids(DependencyDirection::Forward)
.map(|dep_id| (Some(dep_id), Some(*id), ReverseIndexEdge::CargoBuild)),
);
}
// Now, look at all the package rules and add anything in them to the reverse index.
// IMPORTANT: This comes later so that PackageRule edges overwrite CargoBuild edges.
for package_rule in &determinator.rules.package_rules {
for on_affected in package_rule
.on_affected
.package_ids(DependencyDirection::Forward)
{
match &package_rule.mark_changed {
MarkChangedImpl::Packages(packages) => {
// Add edges from on_affected to mark_changed.
reverse_index.extend(packages.iter().map(|package| {
(
Some(on_affected),
Some(package.id()),
ReverseIndexEdge::PackageRule,
)
}));
}
MarkChangedImpl::All => {
// Add an edge to the None/"all" sentinel value.
reverse_index.add_edge(
Some(on_affected),
None,
ReverseIndexEdge::PackageRule,
);
}
}
}
}
Self { reverse_index }
}