Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/opaques.rs')
-rw-r--r--crates/hir-ty/src/next_solver/opaques.rs80
1 files changed, 6 insertions, 74 deletions
diff --git a/crates/hir-ty/src/next_solver/opaques.rs b/crates/hir-ty/src/next_solver/opaques.rs
index 0aee779ed0..e8f5be2eb5 100644
--- a/crates/hir-ty/src/next_solver/opaques.rs
+++ b/crates/hir-ty/src/next_solver/opaques.rs
@@ -1,85 +1,17 @@
//! Things related to opaques in the next-trait-solver.
-use intern::Interned;
use rustc_ast_ir::try_visit;
+use rustc_type_ir::inherent::SliceLike;
-use crate::next_solver::SolverDefId;
-
-use super::{CanonicalVarKind, DbInterner, interned_vec_nolifetime_salsa};
+use super::{DbInterner, SolverDefId, Ty, interned_vec_db, interned_vec_nolifetime_salsa};
pub type OpaqueTypeKey<'db> = rustc_type_ir::OpaqueTypeKey<DbInterner<'db>>;
-pub type PredefinedOpaquesData<'db> = rustc_type_ir::solve::PredefinedOpaquesData<DbInterner<'db>>;
-pub type ExternalConstraintsData<'db> =
- rustc_type_ir::solve::ExternalConstraintsData<DbInterner<'db>>;
-
-#[salsa::interned(constructor = new_, debug)]
-pub struct PredefinedOpaques<'db> {
- #[returns(ref)]
- kind_: rustc_type_ir::solve::PredefinedOpaquesData<DbInterner<'db>>,
-}
-impl<'db> PredefinedOpaques<'db> {
- pub fn new(interner: DbInterner<'db>, data: PredefinedOpaquesData<'db>) -> Self {
- PredefinedOpaques::new_(interner.db(), data)
- }
+type PredefinedOpaque<'db> = (OpaqueTypeKey<'db>, Ty<'db>);
+interned_vec_db!(PredefinedOpaques, PredefinedOpaque);
- pub fn inner(&self) -> &PredefinedOpaquesData<'db> {
- crate::with_attached_db(|db| {
- let inner = self.kind_(db);
- // SAFETY: ¯\_(ツ)_/¯
- unsafe { std::mem::transmute(inner) }
- })
- }
-}
-
-impl<'db> rustc_type_ir::TypeVisitable<DbInterner<'db>> for PredefinedOpaques<'db> {
- fn visit_with<V: rustc_type_ir::TypeVisitor<DbInterner<'db>>>(
- &self,
- visitor: &mut V,
- ) -> V::Result {
- self.opaque_types.visit_with(visitor)
- }
-}
-
-impl<'db> rustc_type_ir::TypeFoldable<DbInterner<'db>> for PredefinedOpaques<'db> {
- fn try_fold_with<F: rustc_type_ir::FallibleTypeFolder<DbInterner<'db>>>(
- self,
- folder: &mut F,
- ) -> Result<Self, F::Error> {
- Ok(PredefinedOpaques::new(
- folder.cx(),
- PredefinedOpaquesData {
- opaque_types: self
- .opaque_types
- .iter()
- .cloned()
- .map(|opaque| opaque.try_fold_with(folder))
- .collect::<Result<_, F::Error>>()?,
- },
- ))
- }
- fn fold_with<F: rustc_type_ir::TypeFolder<DbInterner<'db>>>(self, folder: &mut F) -> Self {
- PredefinedOpaques::new(
- folder.cx(),
- PredefinedOpaquesData {
- opaque_types: self
- .opaque_types
- .iter()
- .cloned()
- .map(|opaque| opaque.fold_with(folder))
- .collect(),
- },
- )
- }
-}
-
-impl<'db> std::ops::Deref for PredefinedOpaques<'db> {
- type Target = PredefinedOpaquesData<'db>;
-
- fn deref(&self) -> &Self::Target {
- self.inner()
- }
-}
+pub type ExternalConstraintsData<'db> =
+ rustc_type_ir::solve::ExternalConstraintsData<DbInterner<'db>>;
interned_vec_nolifetime_salsa!(SolverDefIds, SolverDefId);