Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/next_solver/def_id.rs')
-rw-r--r--crates/hir-ty/src/next_solver/def_id.rs201
1 files changed, 58 insertions, 143 deletions
diff --git a/crates/hir-ty/src/next_solver/def_id.rs b/crates/hir-ty/src/next_solver/def_id.rs
index f7d831d7fc..b122a8cddc 100644
--- a/crates/hir-ty/src/next_solver/def_id.rs
+++ b/crates/hir-ty/src/next_solver/def_id.rs
@@ -43,7 +43,7 @@ pub enum SolverDefId<'db> {
InternedClosureId(InternedClosureId<'db>),
InternedCoroutineId(InternedCoroutineId<'db>),
InternedCoroutineClosureId(InternedCoroutineClosureId<'db>),
- InternedOpaqueTyId(InternedOpaqueTyId),
+ InternedOpaqueTyId(InternedOpaqueTyId<'db>),
EnumVariantId(EnumVariantId),
Ctor(Ctor),
}
@@ -136,7 +136,7 @@ impl_from!(
InternedClosureId<'db>,
InternedCoroutineId<'db>,
InternedCoroutineClosureId<'db>,
- InternedOpaqueTyId,
+ InternedOpaqueTyId<'db>,
EnumVariantId,
Ctor
for SolverDefId<'db>
@@ -387,162 +387,77 @@ macro_rules! declare_id_wrapper {
};
}
-declare_id_wrapper!(TraitIdWrapper, TraitId);
-declare_id_wrapper!(TypeAliasIdWrapper, TypeAliasId);
-#[derive(Clone, Copy, PartialEq, Eq, Hash)]
-pub struct ClosureIdWrapper<'db>(pub InternedClosureId<'db>);
-
-impl std::fmt::Debug for ClosureIdWrapper<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Debug::fmt(&SolverDefId::from(self.0), f)
- }
-}
-
-impl<'db> From<ClosureIdWrapper<'db>> for InternedClosureId<'db> {
- #[inline]
- fn from(value: ClosureIdWrapper<'db>) -> InternedClosureId<'db> {
- value.0
- }
-}
-
-impl<'db> From<InternedClosureId<'db>> for ClosureIdWrapper<'db> {
- #[inline]
- fn from(value: InternedClosureId<'db>) -> ClosureIdWrapper<'db> {
- Self(value)
- }
-}
+/// This is similar to [`declare_id_wrapper`], but handles ids which have the `'db` lifetime.
+macro_rules! declare_id_wrapper_with_lt {
+ ($name:ident, $wraps:ident) => {
+ declare_id_wrapper_with_lt!($name, $wraps, SolverDefId<'db>);
+ };
-impl<'db> From<ClosureIdWrapper<'db>> for SolverDefId<'db> {
- #[inline]
- fn from(value: ClosureIdWrapper<'db>) -> SolverDefId<'db> {
- value.0.into()
- }
-}
+ ($name:ident, $wraps:ident, $local:ty) => {
+ declare_id_wrapper_with_lt!($name, $wraps, $local, no_try_from);
-impl<'db> TryFrom<SolverDefId<'db>> for ClosureIdWrapper<'db> {
- type Error = ();
+ impl<'db> TryFrom<SolverDefId<'db>> for $name<'db> {
+ type Error = ();
- #[inline]
- fn try_from(value: SolverDefId<'db>) -> Result<Self, Self::Error> {
- match value {
- SolverDefId::InternedClosureId(it) => Ok(Self(it)),
- _ => Err(()),
+ #[inline]
+ fn try_from(value: SolverDefId<'db>) -> Result<Self, Self::Error> {
+ match value {
+ SolverDefId::$wraps(it) => Ok(Self(it)),
+ _ => Err(()),
+ }
+ }
}
- }
-}
-
-impl<'db> inherent::DefId<DbInterner<'db>, SolverDefId<'db>> for ClosureIdWrapper<'db> {
- fn as_local(self) -> Option<SolverDefId<'db>> {
- Some(self.into())
- }
- fn is_local(self) -> bool {
- true
- }
-}
-
-#[derive(Clone, Copy, PartialEq, Eq, Hash)]
-pub struct CoroutineIdWrapper<'db>(pub InternedCoroutineId<'db>);
-
-impl std::fmt::Debug for CoroutineIdWrapper<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Debug::fmt(&SolverDefId::from(self.0), f)
- }
-}
-
-impl<'db> From<CoroutineIdWrapper<'db>> for InternedCoroutineId<'db> {
- #[inline]
- fn from(value: CoroutineIdWrapper<'db>) -> InternedCoroutineId<'db> {
- value.0
- }
-}
-
-impl<'db> From<InternedCoroutineId<'db>> for CoroutineIdWrapper<'db> {
- #[inline]
- fn from(value: InternedCoroutineId<'db>) -> CoroutineIdWrapper<'db> {
- Self(value)
- }
-}
-
-impl<'db> From<CoroutineIdWrapper<'db>> for SolverDefId<'db> {
- #[inline]
- fn from(value: CoroutineIdWrapper<'db>) -> SolverDefId<'db> {
- value.0.into()
- }
-}
+ };
-impl<'db> TryFrom<SolverDefId<'db>> for CoroutineIdWrapper<'db> {
- type Error = ();
+ ($name:ident, $wraps:ident, $local:ty, no_try_from) => {
+ #[derive(Clone, Copy, PartialEq, Eq, Hash)]
+ pub struct $name<'db>(pub $wraps<'db>);
- #[inline]
- fn try_from(value: SolverDefId<'db>) -> Result<Self, Self::Error> {
- match value {
- SolverDefId::InternedCoroutineId(it) => Ok(Self(it)),
- _ => Err(()),
+ impl std::fmt::Debug for $name<'_> {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ std::fmt::Debug::fmt(&SolverDefId::from(self.0), f)
+ }
}
- }
-}
-impl<'db> inherent::DefId<DbInterner<'db>, SolverDefId<'db>> for CoroutineIdWrapper<'db> {
- fn as_local(self) -> Option<SolverDefId<'db>> {
- Some(self.into())
- }
- fn is_local(self) -> bool {
- true
- }
-}
-
-#[derive(Clone, Copy, PartialEq, Eq, Hash)]
-pub struct CoroutineClosureIdWrapper<'db>(pub InternedCoroutineClosureId<'db>);
-
-impl std::fmt::Debug for CoroutineClosureIdWrapper<'_> {
- fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- std::fmt::Debug::fmt(&SolverDefId::from(self.0), f)
- }
-}
-
-impl<'db> From<CoroutineClosureIdWrapper<'db>> for InternedCoroutineClosureId<'db> {
- #[inline]
- fn from(value: CoroutineClosureIdWrapper<'db>) -> InternedCoroutineClosureId<'db> {
- value.0
- }
-}
-
-impl<'db> From<InternedCoroutineClosureId<'db>> for CoroutineClosureIdWrapper<'db> {
- #[inline]
- fn from(value: InternedCoroutineClosureId<'db>) -> CoroutineClosureIdWrapper<'db> {
- Self(value)
- }
-}
+ impl<'db> From<$name<'db>> for $wraps<'db> {
+ #[inline]
+ fn from(value: $name<'db>) -> $wraps<'db> {
+ value.0
+ }
+ }
-impl<'db> From<CoroutineClosureIdWrapper<'db>> for SolverDefId<'db> {
- #[inline]
- fn from(value: CoroutineClosureIdWrapper<'db>) -> SolverDefId<'db> {
- value.0.into()
- }
-}
+ impl<'db> From<$wraps<'db>> for $name<'db> {
+ #[inline]
+ fn from(value: $wraps<'db>) -> $name<'db> {
+ Self(value)
+ }
+ }
-impl<'db> TryFrom<SolverDefId<'db>> for CoroutineClosureIdWrapper<'db> {
- type Error = ();
+ impl<'db> From<$name<'db>> for SolverDefId<'db> {
+ #[inline]
+ fn from(value: $name<'db>) -> SolverDefId<'db> {
+ value.0.into()
+ }
+ }
- #[inline]
- fn try_from(value: SolverDefId<'db>) -> Result<Self, Self::Error> {
- match value {
- SolverDefId::InternedCoroutineClosureId(it) => Ok(Self(it)),
- _ => Err(()),
+ impl<'db> inherent::DefId<DbInterner<'db>, $local> for $name<'db> {
+ fn as_local(self) -> Option<$local> {
+ Some(self.into())
+ }
+ fn is_local(self) -> bool {
+ true
+ }
}
- }
+ };
}
-impl<'db> inherent::DefId<DbInterner<'db>, SolverDefId<'db>> for CoroutineClosureIdWrapper<'db> {
- fn as_local(self) -> Option<SolverDefId<'db>> {
- Some(self.into())
- }
- fn is_local(self) -> bool {
- true
- }
-}
+declare_id_wrapper!(TraitIdWrapper, TraitId);
+declare_id_wrapper!(TypeAliasIdWrapper, TypeAliasId);
+declare_id_wrapper_with_lt!(ClosureIdWrapper, InternedClosureId);
+declare_id_wrapper_with_lt!(CoroutineIdWrapper, InternedCoroutineId);
+declare_id_wrapper_with_lt!(CoroutineClosureIdWrapper, InternedCoroutineClosureId);
declare_id_wrapper!(AdtIdWrapper, AdtId);
-declare_id_wrapper!(OpaqueTyIdWrapper, InternedOpaqueTyId, OpaqueTyIdWrapper);
+declare_id_wrapper_with_lt!(OpaqueTyIdWrapper, InternedOpaqueTyId, OpaqueTyIdWrapper<'db>);
macro_rules! declare_ty_const_pair {
( $ty_id_name:ident, $const_id_name:ident, $term_id_name:ident ) => {