about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorlcnr <rust@lcnr.de>2025-05-03 02:47:14 +0000
committerlcnr <rust@lcnr.de>2025-05-03 02:47:14 +0000
commitad3c35bea53793ff2b2f93853f688f29643db8bb (patch)
tree4e111dd85bba2fe4856e8f52cd397d7bdc23b8f9 /compiler
parent2d5ffc513f1c56b7bc95bacb2519705096e8cc2b (diff)
add `ReverseSccGraph::compute`
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_borrowck/src/region_infer/reverse_sccs.rs45
1 files changed, 27 insertions, 18 deletions
diff --git a/compiler/rustc_borrowck/src/region_infer/reverse_sccs.rs b/compiler/rustc_borrowck/src/region_infer/reverse_sccs.rs
index b2ed8a35827..8e04791461b 100644
--- a/compiler/rustc_borrowck/src/region_infer/reverse_sccs.rs
+++ b/compiler/rustc_borrowck/src/region_infer/reverse_sccs.rs
@@ -7,6 +7,8 @@ use rustc_middle::ty::RegionVid;
 
 use crate::RegionInferenceContext;
 use crate::constraints::ConstraintSccIndex;
+use crate::region_infer::ConstraintSccs;
+use crate::universal_regions::UniversalRegions;
 
 pub(crate) struct ReverseSccGraph {
     graph: VecGraph<ConstraintSccIndex>,
@@ -19,6 +21,29 @@ pub(crate) struct ReverseSccGraph {
 }
 
 impl ReverseSccGraph {
+    pub(super) fn compute(
+        constraint_sccs: &ConstraintSccs,
+        universal_regions: &UniversalRegions<'_>,
+    ) -> Self {
+        let graph = constraint_sccs.reverse();
+        let mut paired_scc_regions = universal_regions
+            .universal_regions_iter()
+            .map(|region| (constraint_sccs.scc(region), region))
+            .collect::<Vec<_>>();
+        paired_scc_regions.sort();
+        let universal_regions = paired_scc_regions.iter().map(|&(_, region)| region).collect();
+
+        let mut scc_regions = FxIndexMap::default();
+        let mut start = 0;
+        for chunk in paired_scc_regions.chunk_by(|&(scc1, _), &(scc2, _)| scc1 == scc2) {
+            let (scc, _) = chunk[0];
+
+            scc_regions.insert(scc, start..start + chunk.len());
+            start += chunk.len();
+        }
+        ReverseSccGraph { graph, scc_regions, universal_regions }
+    }
+
     /// Find all universal regions that are required to outlive the given SCC.
     pub(super) fn upper_bounds(&self, scc0: ConstraintSccIndex) -> impl Iterator<Item = RegionVid> {
         let mut duplicates = FxIndexSet::default();
@@ -40,23 +65,7 @@ impl RegionInferenceContext<'_> {
             return;
         }
 
-        let graph = self.constraint_sccs.reverse();
-        let mut paired_scc_regions = self
-            .universal_regions()
-            .universal_regions_iter()
-            .map(|region| (self.constraint_sccs.scc(region), region))
-            .collect::<Vec<_>>();
-        paired_scc_regions.sort();
-        let universal_regions = paired_scc_regions.iter().map(|&(_, region)| region).collect();
-
-        let mut scc_regions = FxIndexMap::default();
-        let mut start = 0;
-        for chunk in paired_scc_regions.chunk_by(|&(scc1, _), &(scc2, _)| scc1 == scc2) {
-            let (scc, _) = chunk[0];
-            scc_regions.insert(scc, start..start + chunk.len());
-            start += chunk.len();
-        }
-
-        self.rev_scc_graph = Some(ReverseSccGraph { graph, scc_regions, universal_regions });
+        self.rev_scc_graph =
+            Some(ReverseSccGraph::compute(&self.constraint_sccs, self.universal_regions()));
     }
 }