Skip to main content

clippy_utils/mir/
transitive_relation.rs

1use rustc_data_structures::fx::FxHashMap;
2use rustc_index::bit_set::DenseBitSet;
3use rustc_middle::mir;
4
5#[derive(Default)]
6pub(super) struct TransitiveRelation {
7    relations: FxHashMap<mir::Local, Vec<mir::Local>>,
8}
9
10impl TransitiveRelation {
11    /// Records a direct relation from local `a` to local `b`.
12    pub fn add(&mut self, a: mir::Local, b: mir::Local) {
13        self.relations.entry(a).or_default().push(b);
14    }
15
16    /// Finds all locals directly or indirectly reachable from local `a`.
17    pub fn reachable_from(&self, a: mir::Local, domain_size: usize) -> DenseBitSet<mir::Local> {
18        let mut seen = DenseBitSet::new_empty(domain_size);
19        let mut stack = vec![a];
20        while let Some(u) = stack.pop() {
21            if let Some(edges) = self.relations.get(&u) {
22                for &v in edges {
23                    if seen.insert(v) {
24                        stack.push(v);
25                    }
26                }
27            }
28        }
29        seen
30    }
31}