about summary refs log tree commit diff
path: root/compiler/rustc_next_trait_solver/src/resolve.rs
diff options
context:
space:
mode:
authorlcnr <rust@lcnr.de>2025-05-23 14:46:38 +0000
committerMichael Goulet <michael@errs.io>2025-05-26 19:57:48 +0000
commitc56efaedfa0a28d842365c6c98a11af591eab1a5 (patch)
treeab39d9f2faf11d48a63b555a6c0092be3383a447 /compiler/rustc_next_trait_solver/src/resolve.rs
parent9c0bcb514f49cd1e6a30affb2fe4cfca060129a2 (diff)
downloadrust-c56efaedfa0a28d842365c6c98a11af591eab1a5.tar.gz
rust-c56efaedfa0a28d842365c6c98a11af591eab1a5.zip
add additional `TypeFlags` fast paths
Diffstat (limited to 'compiler/rustc_next_trait_solver/src/resolve.rs')
-rw-r--r--compiler/rustc_next_trait_solver/src/resolve.rs20
1 files changed, 18 insertions, 2 deletions
diff --git a/compiler/rustc_next_trait_solver/src/resolve.rs b/compiler/rustc_next_trait_solver/src/resolve.rs
index 39abec2d7d8..c3c57eccd6e 100644
--- a/compiler/rustc_next_trait_solver/src/resolve.rs
+++ b/compiler/rustc_next_trait_solver/src/resolve.rs
@@ -11,7 +11,7 @@ use crate::delegate::SolverDelegate;
 // EAGER RESOLUTION
 
 /// Resolves ty, region, and const vars to their inferred values or their root vars.
-pub struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner>
+struct EagerResolver<'a, D, I = <D as SolverDelegate>::Interner>
 where
     D: SolverDelegate<Interner = I>,
     I: Interner,
@@ -22,8 +22,20 @@ where
     cache: DelayedMap<I::Ty, I::Ty>,
 }
 
+pub fn eager_resolve_vars<D: SolverDelegate, T: TypeFoldable<D::Interner>>(
+    delegate: &D,
+    value: T,
+) -> T {
+    if value.has_infer() {
+        let mut folder = EagerResolver::new(delegate);
+        value.fold_with(&mut folder)
+    } else {
+        value
+    }
+}
+
 impl<'a, D: SolverDelegate> EagerResolver<'a, D> {
-    pub fn new(delegate: &'a D) -> Self {
+    fn new(delegate: &'a D) -> Self {
         EagerResolver { delegate, cache: Default::default() }
     }
 }
@@ -90,4 +102,8 @@ impl<D: SolverDelegate<Interner = I>, I: Interner> TypeFolder<I> for EagerResolv
     fn fold_predicate(&mut self, p: I::Predicate) -> I::Predicate {
         if p.has_infer() { p.super_fold_with(self) } else { p }
     }
+
+    fn fold_clauses(&mut self, c: I::Clauses) -> I::Clauses {
+        if c.has_infer() { c.super_fold_with(self) } else { c }
+    }
 }