Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/method_resolution.rs')
-rw-r--r--crates/hir-ty/src/method_resolution.rs87
1 files changed, 53 insertions, 34 deletions
diff --git a/crates/hir-ty/src/method_resolution.rs b/crates/hir-ty/src/method_resolution.rs
index 1076bc22c3..f0362fed14 100644
--- a/crates/hir-ty/src/method_resolution.rs
+++ b/crates/hir-ty/src/method_resolution.rs
@@ -10,8 +10,8 @@ use chalk_ir::{UniverseIndex, WithKind, cast::Cast};
use hir_def::{
AssocItemId, BlockId, ConstId, FunctionId, HasModule, ImplId, ItemContainerId, Lookup,
ModuleId, TraitId,
- data::{TraitFlags, adt::StructFlags},
nameres::{DefMap, assoc::ImplItems},
+ signatures::{ConstFlags, EnumFlags, FnFlags, StructFlags, TraitFlags, TypeAliasFlags},
};
use hir_expand::name::Name;
use intern::sym;
@@ -313,7 +313,7 @@ impl InherentImpls {
fn collect_def_map(&mut self, db: &dyn HirDatabase, def_map: &DefMap) {
for (_module_id, module_data) in def_map.modules() {
for impl_id in module_data.scope.impls() {
- let data = db.impl_data(impl_id);
+ let data = db.impl_signature(impl_id);
if data.target_trait.is_some() {
continue;
}
@@ -384,14 +384,17 @@ pub fn def_crates(db: &dyn HirDatabase, ty: &Ty, cur_crate: Crate) -> Option<Sma
&TyKind::Adt(AdtId(def_id), _) => {
let rustc_has_incoherent_inherent_impls = match def_id {
hir_def::AdtId::StructId(id) => db
- .struct_data(id)
+ .struct_signature(id)
.flags
- .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPL),
+ .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPLS),
hir_def::AdtId::UnionId(id) => db
- .union_data(id)
+ .union_signature(id)
.flags
- .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPL),
- hir_def::AdtId::EnumId(id) => db.enum_data(id).rustc_has_incoherent_inherent_impls,
+ .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPLS),
+ hir_def::AdtId::EnumId(id) => db
+ .enum_signature(id)
+ .flags
+ .contains(EnumFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPLS),
};
Some(if rustc_has_incoherent_inherent_impls {
db.incoherent_inherent_impl_crates(cur_crate, TyFingerprint::Adt(def_id))
@@ -401,17 +404,23 @@ pub fn def_crates(db: &dyn HirDatabase, ty: &Ty, cur_crate: Crate) -> Option<Sma
}
&TyKind::Foreign(id) => {
let alias = from_foreign_def_id(id);
- Some(if db.type_alias_data(alias).rustc_has_incoherent_inherent_impls() {
- db.incoherent_inherent_impl_crates(cur_crate, TyFingerprint::ForeignType(id))
- } else {
- smallvec![alias.module(db.upcast()).krate()]
- })
+ Some(
+ if db
+ .type_alias_signature(alias)
+ .flags
+ .contains(TypeAliasFlags::RUSTC_HAS_INCOHERENT_INHERENT_IMPLS)
+ {
+ db.incoherent_inherent_impl_crates(cur_crate, TyFingerprint::ForeignType(id))
+ } else {
+ smallvec![alias.module(db.upcast()).krate()]
+ },
+ )
}
TyKind::Dyn(_) => {
let trait_id = ty.dyn_trait()?;
Some(
if db
- .trait_data(trait_id)
+ .trait_signature(trait_id)
.flags
.contains(TraitFlags::RUSTC_HAS_INCOHERENT_INHERENT_IMPLS)
{
@@ -618,8 +627,8 @@ pub fn lookup_impl_const(
let substitution = Substitution::from_iter(Interner, subs.iter(Interner));
let trait_ref = TraitRef { trait_id: to_chalk_trait_id(trait_id), substitution };
- let const_data = db.const_data(const_id);
- let name = match const_data.name.as_ref() {
+ let const_signature = db.const_signature(const_id);
+ let name = match const_signature.name.as_ref() {
Some(name) => name,
None => return (const_id, subs),
};
@@ -691,7 +700,7 @@ pub(crate) fn lookup_impl_method_query(
substitution: Substitution::from_iter(Interner, fn_subst.iter(Interner).skip(fn_params)),
};
- let name = &db.function_data(func).name;
+ let name = &db.function_signature(func).name;
let Some((impl_fn, impl_subst)) =
lookup_impl_assoc_item_for_trait_ref(trait_ref, db, env, name).and_then(|assoc| {
if let (AssocItemId::FunctionId(id), subst) = assoc { Some((id, subst)) } else { None }
@@ -822,17 +831,20 @@ fn is_inherent_impl_coherent(
&TyKind::Adt(AdtId(adt), _) => match adt {
hir_def::AdtId::StructId(id) => db
- .struct_data(id)
+ .struct_signature(id)
.flags
- .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPL),
+ .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPLS),
hir_def::AdtId::UnionId(id) => db
- .union_data(id)
+ .union_signature(id)
+ .flags
+ .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPLS),
+ hir_def::AdtId::EnumId(it) => db
+ .enum_signature(it)
.flags
- .contains(StructFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPL),
- hir_def::AdtId::EnumId(it) => db.enum_data(it).rustc_has_incoherent_inherent_impls,
+ .contains(EnumFlags::IS_RUSTC_HAS_INCOHERENT_INHERENT_IMPLS),
},
TyKind::Dyn(it) => it.principal_id().is_some_and(|trait_id| {
- db.trait_data(from_chalk_trait_id(trait_id))
+ db.trait_signature(from_chalk_trait_id(trait_id))
.flags
.contains(TraitFlags::RUSTC_HAS_INCOHERENT_INHERENT_IMPLS)
}),
@@ -843,11 +855,16 @@ fn is_inherent_impl_coherent(
rustc_has_incoherent_inherent_impls
&& !items.items.is_empty()
&& items.items.iter().all(|&(_, assoc)| match assoc {
- AssocItemId::FunctionId(it) => db.function_data(it).rustc_allow_incoherent_impl(),
- AssocItemId::ConstId(it) => db.const_data(it).rustc_allow_incoherent_impl(),
- AssocItemId::TypeAliasId(it) => {
- db.type_alias_data(it).rustc_allow_incoherent_impl()
+ AssocItemId::FunctionId(it) => {
+ db.function_signature(it).flags.contains(FnFlags::RUSTC_ALLOW_INCOHERENT_IMPLS)
}
+ AssocItemId::ConstId(it) => {
+ db.const_signature(it).flags.contains(ConstFlags::RUSTC_ALLOW_INCOHERENT_IMPL)
+ }
+ AssocItemId::TypeAliasId(it) => db
+ .type_alias_signature(it)
+ .flags
+ .contains(TypeAliasFlags::RUSTC_ALLOW_INCOHERENT_IMPLS),
})
}
}
@@ -882,8 +899,8 @@ pub fn check_orphan_rules(db: &dyn HirDatabase, impl_: ImplId) -> bool {
match ty.kind(Interner) {
TyKind::Ref(_, _, referenced) => ty = referenced.clone(),
&TyKind::Adt(AdtId(hir_def::AdtId::StructId(s)), ref subs) => {
- let struct_data = db.struct_data(s);
- if struct_data.flags.contains(StructFlags::IS_FUNDAMENTAL) {
+ let struct_signature = db.struct_signature(s);
+ if struct_signature.flags.contains(StructFlags::IS_FUNDAMENTAL) {
let next = subs.type_parameters(Interner).next();
match next {
Some(it) => ty = it,
@@ -901,7 +918,7 @@ pub fn check_orphan_rules(db: &dyn HirDatabase, impl_: ImplId) -> bool {
// FIXME: param coverage
// - No uncovered type parameters `P1..=Pn` may appear in `T0..Ti`` (excluding `Ti`)
- trait_ref.substitution.type_parameters(Interner).any(|ty| {
+ let is_not_orphan = trait_ref.substitution.type_parameters(Interner).any(|ty| {
match unwrap_fundamental(ty).kind(Interner) {
&TyKind::Adt(AdtId(id), _) => is_local(id.module(db.upcast()).krate()),
TyKind::Error => true,
@@ -910,7 +927,9 @@ pub fn check_orphan_rules(db: &dyn HirDatabase, impl_: ImplId) -> bool {
}),
_ => false,
}
- })
+ });
+ #[allow(clippy::let_and_return)]
+ is_not_orphan
}
pub fn iterate_path_candidates(
@@ -1206,7 +1225,7 @@ fn iterate_trait_method_candidates(
let TraitEnvironment { krate, block, .. } = *table.trait_env;
'traits: for &t in traits_in_scope {
- let data = db.trait_data(t);
+ let data = db.trait_signature(t);
// Traits annotated with `#[rustc_skip_during_method_dispatch]` are skipped during
// method resolution, if the receiver is an array, and we're compiling for editions before
@@ -1521,7 +1540,7 @@ fn is_valid_trait_method_candidate(
let db = table.db;
match item {
AssocItemId::FunctionId(fn_id) => {
- let data = db.function_data(fn_id);
+ let data = db.function_signature(fn_id);
check_that!(name.is_none_or(|n| n == &data.name));
@@ -1552,7 +1571,7 @@ fn is_valid_trait_method_candidate(
}
AssocItemId::ConstId(c) => {
check_that!(receiver_ty.is_none());
- check_that!(name.is_none_or(|n| db.const_data(c).name.as_ref() == Some(n)));
+ check_that!(name.is_none_or(|n| db.const_signature(c).name.as_ref() == Some(n)));
IsValidCandidate::Yes
}
@@ -1574,7 +1593,7 @@ fn is_valid_impl_fn_candidate(
check_that!(name.is_none_or(|n| n == item_name));
let db = table.db;
- let data = db.function_data(fn_id);
+ let data = db.function_signature(fn_id);
if let Some(from_module) = visible_from_module {
if !db.function_visibility(fn_id).is_visible_from(db.upcast(), from_module) {