Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/lib.rs')
-rw-r--r--crates/hir-ty/src/lib.rs47
1 files changed, 36 insertions, 11 deletions
diff --git a/crates/hir-ty/src/lib.rs b/crates/hir-ty/src/lib.rs
index 120c265fdc..d217024b56 100644
--- a/crates/hir-ty/src/lib.rs
+++ b/crates/hir-ty/src/lib.rs
@@ -81,6 +81,7 @@ use rustc_type_ir::{
BoundVarIndexKind, TypeSuperVisitable, TypeVisitableExt,
inherent::{IntoKind, Ty as _},
};
+use salsa::Update;
use stdx::impl_from;
use syntax::ast::{ConstArg, make};
use traits::FnTrait;
@@ -165,7 +166,7 @@ impl ComplexMemoryMap<'_> {
}
impl<'db> MemoryMap<'db> {
- pub fn vtable_ty(&self, id: usize) -> Result<Ty<'db>, MirEvalError> {
+ pub fn vtable_ty(&self, id: usize) -> Result<Ty<'db>, MirEvalError<'db>> {
match self {
MemoryMap::Empty | MemoryMap::Simple(_) => Err(MirEvalError::InvalidVTableId(id)),
MemoryMap::Complex(cm) => cm.vtable.ty(id),
@@ -181,8 +182,8 @@ impl<'db> MemoryMap<'db> {
/// allocator function as `f` and it will return a mapping of old addresses to new addresses.
fn transform_addresses(
&self,
- mut f: impl FnMut(&[u8], usize) -> Result<usize, MirEvalError>,
- ) -> Result<FxHashMap<usize, usize>, MirEvalError> {
+ mut f: impl FnMut(&[u8], usize) -> Result<usize, MirEvalError<'db>>,
+ ) -> Result<FxHashMap<usize, usize>, MirEvalError<'db>> {
let mut transform = |(addr, val): (&usize, &[u8])| {
let addr = *addr;
let align = if addr == 0 { 64 } else { (addr - (addr & (addr - 1))).min(64) };
@@ -553,19 +554,43 @@ impl Span {
}
/// A [`DefWithBodyId`], or an anon const.
-#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, salsa::Supertype)]
-pub enum InferBodyId {
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, salsa::Supertype, Update)]
+pub enum InferBodyId<'db> {
DefWithBodyId(DefWithBodyId),
- AnonConstId(AnonConstId),
+ AnonConstId(AnonConstId<'db>),
}
-impl_from!(DefWithBodyId(FunctionId, ConstId, StaticId), AnonConstId for InferBodyId);
-impl From<EnumVariantId> for InferBodyId {
+impl<'db> From<DefWithBodyId> for InferBodyId<'db> {
+ fn from(it: DefWithBodyId) -> InferBodyId<'db> {
+ InferBodyId::DefWithBodyId(it)
+ }
+}
+impl<'db> From<FunctionId> for InferBodyId<'db> {
+ fn from(it: FunctionId) -> InferBodyId<'db> {
+ InferBodyId::DefWithBodyId(it.into())
+ }
+}
+impl<'db> From<ConstId> for InferBodyId<'db> {
+ fn from(it: ConstId) -> InferBodyId<'db> {
+ InferBodyId::DefWithBodyId(it.into())
+ }
+}
+impl<'db> From<StaticId> for InferBodyId<'db> {
+ fn from(it: StaticId) -> InferBodyId<'db> {
+ InferBodyId::DefWithBodyId(it.into())
+ }
+}
+impl<'db> From<AnonConstId<'db>> for InferBodyId<'db> {
+ fn from(it: AnonConstId<'db>) -> InferBodyId<'db> {
+ InferBodyId::AnonConstId(it)
+ }
+}
+impl<'db> From<EnumVariantId> for InferBodyId<'db> {
fn from(id: EnumVariantId) -> Self {
InferBodyId::DefWithBodyId(DefWithBodyId::VariantId(id))
}
}
-impl HasModule for InferBodyId {
+impl HasModule for InferBodyId<'_> {
fn module(&self, db: &dyn SourceDatabase) -> ModuleId {
match self {
InferBodyId::DefWithBodyId(id) => id.module(db),
@@ -574,7 +599,7 @@ impl HasModule for InferBodyId {
}
}
-impl HasResolver for InferBodyId {
+impl HasResolver for InferBodyId<'_> {
fn resolver(self, db: &dyn SourceDatabase) -> Resolver<'_> {
match self {
InferBodyId::DefWithBodyId(id) => id.resolver(db),
@@ -583,7 +608,7 @@ impl HasResolver for InferBodyId {
}
}
-impl InferBodyId {
+impl InferBodyId<'_> {
pub fn expression_store_owner(self, db: &dyn HirDatabase) -> ExpressionStoreOwnerId {
match self {
InferBodyId::DefWithBodyId(id) => id.into(),