Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/hover/render.rs')
-rw-r--r--crates/ide/src/hover/render.rs48
1 files changed, 28 insertions, 20 deletions
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index 83adf6548a..01fa316d5f 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -3,9 +3,9 @@ use std::{mem, ops::Not};
use either::Either;
use hir::{
- db::ExpandDatabase, Adt, AsAssocItem, AsExternAssocItem, CaptureKind, HasCrate, HasSource,
- HirDisplay, Layout, LayoutError, MethodViolationCode, Name, ObjectSafetyViolation, Semantics,
- Trait, Type, TypeInfo,
+ db::ExpandDatabase, Adt, AsAssocItem, AsExternAssocItem, AssocItemContainer, CaptureKind,
+ DynCompatibilityViolation, HasCrate, HasSource, HirDisplay, Layout, LayoutError,
+ MethodViolationCode, Name, Semantics, Trait, Type, TypeInfo,
};
use ide_db::{
base_db::SourceDatabase,
@@ -529,10 +529,10 @@ pub(super) fn definition(
_ => None,
};
- let object_safety_info = if let Definition::Trait(it) = def {
- let mut object_safety_info = String::new();
- render_object_safety(db, &mut object_safety_info, it.object_safety(db));
- Some(object_safety_info)
+ let dyn_compatibility_info = if let Definition::Trait(it) = def {
+ let mut dyn_compatibility_info = String::new();
+ render_dyn_compatibility(db, &mut dyn_compatibility_info, it.dyn_compatibility(db));
+ Some(dyn_compatibility_info)
} else {
None
};
@@ -546,8 +546,8 @@ pub(super) fn definition(
desc.push_str(&layout_info);
desc.push('\n');
}
- if let Some(object_safety_info) = object_safety_info {
- desc.push_str(&object_safety_info);
+ if let Some(dyn_compatibility_info) = dyn_compatibility_info {
+ desc.push_str(&dyn_compatibility_info);
desc.push('\n');
}
desc.push_str(&label);
@@ -813,7 +813,15 @@ fn definition_mod_path(db: &RootDatabase, def: &Definition, edition: Edition) ->
if matches!(def, Definition::GenericParam(_) | Definition::Local(_) | Definition::Label(_)) {
return None;
}
- def.module(db).map(|module| path(db, module, definition_owner_name(db, def, edition), edition))
+ let container: Option<Definition> =
+ def.as_assoc_item(db).and_then(|assoc| match assoc.container(db) {
+ AssocItemContainer::Trait(trait_) => Some(trait_.into()),
+ AssocItemContainer::Impl(impl_) => impl_.self_ty(db).as_adt().map(|adt| adt.into()),
+ });
+ container
+ .unwrap_or(*def)
+ .module(db)
+ .map(|module| path(db, module, definition_owner_name(db, def, edition), edition))
}
fn markup(docs: Option<String>, desc: String, mod_path: Option<String>) -> Markup {
@@ -980,24 +988,24 @@ fn keyword_hints(
}
}
-fn render_object_safety(
+fn render_dyn_compatibility(
db: &RootDatabase,
buf: &mut String,
- safety: Option<ObjectSafetyViolation>,
+ safety: Option<DynCompatibilityViolation>,
) {
let Some(osv) = safety else {
- buf.push_str("// Object Safety: Yes");
+ buf.push_str("// Dyn Compatible: Yes");
return;
};
- buf.push_str("// Object Safety: No\n// - Reason: ");
+ buf.push_str("// Dyn Compatible: No\n// - Reason: ");
match osv {
- ObjectSafetyViolation::SizedSelf => {
+ DynCompatibilityViolation::SizedSelf => {
buf.push_str("has a `Self: Sized` bound");
}
- ObjectSafetyViolation::SelfReferential => {
+ DynCompatibilityViolation::SelfReferential => {
buf.push_str("has a bound that references `Self`");
}
- ObjectSafetyViolation::Method(func, mvc) => {
+ DynCompatibilityViolation::Method(func, mvc) => {
let name = hir::Function::from(func).name(db);
format_to!(
buf,
@@ -1020,7 +1028,7 @@ fn render_object_safety(
};
buf.push_str(desc);
}
- ObjectSafetyViolation::AssocConst(const_) => {
+ DynCompatibilityViolation::AssocConst(const_) => {
let name = hir::Const::from(const_).name(db);
if let Some(name) = name {
format_to!(buf, "has an associated constant `{}`", name.as_str());
@@ -1028,11 +1036,11 @@ fn render_object_safety(
buf.push_str("has an associated constant");
}
}
- ObjectSafetyViolation::GAT(alias) => {
+ DynCompatibilityViolation::GAT(alias) => {
let name = hir::TypeAlias::from(alias).name(db);
format_to!(buf, "has a generic associated type `{}`", name.as_str());
}
- ObjectSafetyViolation::HasNonSafeSuperTrait(super_trait) => {
+ DynCompatibilityViolation::HasNonCompatibleSuperTrait(super_trait) => {
let name = hir::Trait::from(super_trait).name(db);
format_to!(buf, "has a object unsafe supertrait `{}`", name.as_str());
}