Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/hover.rs')
-rw-r--r--crates/ide/src/hover.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index c3a8e0362f..28e1dc72bf 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -481,6 +481,10 @@ pub(crate) fn hover_for_definition(
};
let notable_traits = def_ty.map(|ty| notable_traits(db, &ty)).unwrap_or_default();
let subst_types = subst.map(|subst| subst.types(db));
+ let render_private_fields = sema.scope(scope_node).is_some_and(|scope| {
+ def.krate(db)
+ .is_some_and(|def_crate| should_render_private_fields(db, def_crate, scope.krate()))
+ });
let (markup, range_map) = render::definition(
sema.db,
@@ -489,6 +493,7 @@ pub(crate) fn hover_for_definition(
&notable_traits,
macro_arm,
render_extras,
+ render_private_fields,
subst_types.as_ref(),
config,
edition,
@@ -508,6 +513,27 @@ pub(crate) fn hover_for_definition(
}
}
+/// | Hover location | Definition location | Render private fields? |
+/// |---|---:|---:|
+/// | Workspace crate | Workspace crate | Yes |
+/// | Workspace crate | External/library crate | No |
+/// | External/library crate | Same external/library crate | Yes |
+/// | External/library crate | Different external/library crate | No |
+/// | Anywhere | Same crate as definition | Yes |
+fn should_render_private_fields(
+ db: &RootDatabase,
+ def_crate: hir::Crate,
+ hover_crate: hir::Crate,
+) -> bool {
+ let is_workspace_crate = |db: &RootDatabase, krate: hir::Crate| {
+ let origin = krate.origin(db);
+ !origin.is_lib() && !origin.is_lang()
+ };
+
+ def_crate == hover_crate
+ || is_workspace_crate(db, def_crate) && is_workspace_crate(db, hover_crate)
+}
+
fn notable_traits<'db>(
db: &'db RootDatabase,
ty: &hir::Type<'db>,