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.rs29
1 files changed, 27 insertions, 2 deletions
diff --git a/crates/hir-ty/src/traits.rs b/crates/hir-ty/src/traits.rs
index 2f8c31ec60..ad8de293d5 100644
--- a/crates/hir-ty/src/traits.rs
+++ b/crates/hir-ty/src/traits.rs
@@ -21,8 +21,8 @@ use rustc_type_ir::{
use crate::{
db::HirDatabase,
next_solver::{
- Canonical, DbInterner, GenericArgs, Goal, ParamEnv, Predicate, SolverContext, Span, Ty,
- TyKind,
+ Canonical, DbInterner, GenericArgs, Goal, ParamEnv, Predicate, SolverContext, Span,
+ StoredClauses, Ty, TyKind,
infer::{DbInternerInferExt, InferCtxt, traits::ObligationCause},
obligation_ctxt::ObligationCtxt,
},
@@ -35,6 +35,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>,