Skip to content

Commit fd8afe2

Browse files
committed
feat: Implement object safety
1 parent ab34fdd commit fd8afe2

File tree

10 files changed

+660
-23
lines changed

10 files changed

+660
-23
lines changed

crates/hir-ty/src/db.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use base_db::{
1111
use hir_def::{
1212
db::DefDatabase, hir::ExprId, layout::TargetDataLayout, AdtId, BlockId, CallableDefId,
1313
ConstParamId, DefWithBodyId, EnumVariantId, FunctionId, GeneralConstId, GenericDefId, ImplId,
14-
LifetimeParamId, LocalFieldId, StaticId, TypeAliasId, TypeOrConstParamId, VariantId,
14+
LifetimeParamId, LocalFieldId, StaticId, TraitId, TypeAliasId, TypeOrConstParamId, VariantId,
1515
};
1616
use la_arena::ArenaMap;
1717
use smallvec::SmallVec;
@@ -24,6 +24,7 @@ use crate::{
2424
lower::{GenericDefaults, GenericPredicates},
2525
method_resolution::{InherentImpls, TraitImpls, TyFingerprint},
2626
mir::{BorrowckResult, MirBody, MirLowerError},
27+
object_safety::ObjectSafetyViolation,
2728
Binders, ClosureId, Const, FnDefId, ImplTraitId, ImplTraits, InferenceResult, Interner,
2829
PolyFnSig, Substitution, TraitEnvironment, TraitRef, Ty, TyDefId, ValueTyDefId,
2930
};
@@ -104,6 +105,9 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
104105
#[salsa::cycle(crate::layout::layout_of_ty_recover)]
105106
fn layout_of_ty(&self, ty: Ty, env: Arc<TraitEnvironment>) -> Result<Arc<Layout>, LayoutError>;
106107

108+
#[salsa::invoke(crate::object_safety::object_safety_of_trait_query)]
109+
fn object_safety_of_trait(&self, trait_: TraitId) -> Option<ObjectSafetyViolation>;
110+
107111
#[salsa::invoke(crate::layout::target_data_layout_query)]
108112
fn target_data_layout(&self, krate: CrateId) -> Result<Arc<TargetDataLayout>, Arc<str>>;
109113

crates/hir-ty/src/generics.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,22 @@ impl Generics {
225225
}
226226
}
227227

228+
pub(crate) fn trait_self_param_idx(db: &dyn DefDatabase, def: GenericDefId) -> Option<usize> {
229+
match def {
230+
GenericDefId::TraitId(_) | GenericDefId::ImplId(_) => {
231+
let params = db.generic_params(def);
232+
params.trait_self_param().map(|idx| idx.into_raw().into_u32() as usize)
233+
}
234+
_ => {
235+
let parent_def = parent_generic_def(db, def)?;
236+
let parent_params = db.generic_params(parent_def);
237+
let parent_self_idx = parent_params.trait_self_param()?.into_raw().into_u32() as usize;
238+
let self_params = db.generic_params(def);
239+
Some(self_params.len() + parent_self_idx)
240+
}
241+
}
242+
}
243+
228244
fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option<GenericDefId> {
229245
let container = match def {
230246
GenericDefId::FunctionId(it) => it.lookup(db).container,

crates/hir-ty/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub mod lang_items;
4040
pub mod layout;
4141
pub mod method_resolution;
4242
pub mod mir;
43+
pub mod object_safety;
4344
pub mod primitive;
4445
pub mod traits;
4546

crates/hir-ty/src/lower.rs

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ use crate::{
5858
},
5959
db::HirDatabase,
6060
error_lifetime,
61-
generics::{generics, Generics},
61+
generics::{generics, trait_self_param_idx, Generics},
6262
make_binders,
6363
mapping::{from_chalk_trait_id, lt_to_placeholder_idx, ToChalk},
6464
static_lifetime, to_assoc_type_id, to_chalk_trait_id, to_placeholder_idx,
@@ -1747,21 +1747,7 @@ fn implicitly_sized_clauses<'a, 'subst: 'a>(
17471747
.lang_item(resolver.krate(), LangItem::Sized)
17481748
.and_then(|lang_item| lang_item.as_trait().map(to_chalk_trait_id))?;
17491749

1750-
let get_trait_self_idx = |container: ItemContainerId| {
1751-
if matches!(container, ItemContainerId::TraitId(_)) {
1752-
let generics = generics(db.upcast(), def);
1753-
Some(generics.len_self())
1754-
} else {
1755-
None
1756-
}
1757-
};
1758-
let trait_self_idx = match def {
1759-
GenericDefId::TraitId(_) => Some(0),
1760-
GenericDefId::FunctionId(it) => get_trait_self_idx(it.lookup(db.upcast()).container),
1761-
GenericDefId::ConstId(it) => get_trait_self_idx(it.lookup(db.upcast()).container),
1762-
GenericDefId::TypeAliasId(it) => get_trait_self_idx(it.lookup(db.upcast()).container),
1763-
_ => None,
1764-
};
1750+
let trait_self_idx = trait_self_param_idx(db.upcast(), def);
17651751

17661752
Some(
17671753
substitution

0 commit comments

Comments
 (0)