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.rs | 201 |
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 ) => { |