Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/traits.rs')
-rw-r--r--crates/hir-ty/src/traits.rs54
1 files changed, 51 insertions, 3 deletions
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index 2f8c31ec60..fb598fe5ac 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -21,9 +21,12 @@ use rustc_type_ir::{
use crate::{
db::HirDatabase,
next_solver::{
- Canonical, DbInterner, GenericArgs, Goal, ParamEnv, Predicate, SolverContext, Span, Ty,
- TyKind,
- infer::{DbInternerInferExt, InferCtxt, traits::ObligationCause},
+ Canonical, DbInterner, GenericArgs, Goal, ParamEnv, Predicate, SolverContext, Span,
+ StoredClauses, Ty, TyKind,
+ infer::{
+ DbInternerInferExt, InferCtxt,
+ traits::{Obligation, ObligationCause},
+ },
obligation_ctxt::ObligationCtxt,
},
};
@@ -35,6 +38,31 @@ pub struct ParamEnvAndCrate<'db> {
pub krate: Crate,
}
+impl<'db> ParamEnvAndCrate<'db> {
+ #[inline]
+ pub fn store(self) -> StoredParamEnvAndCrate {
+ StoredParamEnvAndCrate { param_env: self.param_env.clauses.store(), krate: self.krate }
+ }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct StoredParamEnvAndCrate {
+ param_env: StoredClauses,
+ pub krate: Crate,
+}
+
+impl StoredParamEnvAndCrate {
+ #[inline]
+ pub fn param_env(&self) -> ParamEnv<'_> {
+ ParamEnv { clauses: self.param_env.as_ref() }
+ }
+
+ #[inline]
+ pub fn as_ref(&self) -> ParamEnvAndCrate<'_> {
+ ParamEnvAndCrate { param_env: self.param_env(), krate: self.krate }
+ }
+}
+
/// This should be used in `hir` only.
pub fn structurally_normalize_ty<'db>(
infcx: &InferCtxt<'db>,
@@ -82,6 +110,16 @@ pub fn next_trait_solve_canonical_in_ctxt<'db>(
let res = context.evaluate_root_goal(goal, Span::dummy(), None);
+ let obligation = Obligation {
+ cause: ObligationCause::dummy(),
+ param_env: goal.param_env,
+ recursion_depth: 0,
+ predicate: goal.predicate,
+ };
+ infer_ctxt.inspect_evaluated_obligation(&obligation, &res, || {
+ Some(context.evaluate_root_goal_for_proof_tree(goal, Span::dummy()).1)
+ });
+
let res = res.map(|r| (r.has_changed, r.certainty));
tracing::debug!("solve_nextsolver({:?}) => {:?}", goal, res);
@@ -105,6 +143,16 @@ pub fn next_trait_solve_in_ctxt<'db, 'a>(
let res = context.evaluate_root_goal(goal, Span::dummy(), None);
+ let obligation = Obligation {
+ cause: ObligationCause::dummy(),
+ param_env: goal.param_env,
+ recursion_depth: 0,
+ predicate: goal.predicate,
+ };
+ infer_ctxt.inspect_evaluated_obligation(&obligation, &res, || {
+ Some(context.evaluate_root_goal_for_proof_tree(goal, Span::dummy()).1)
+ });
+
let res = res.map(|r| (r.has_changed, r.certainty));
tracing::debug!("solve_nextsolver({:?}) => {:?}", goal, res);