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.rs | 26 |
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( ¬able_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>, |