Skip to content

Commit 8764cc9

Browse files
Make flyimport respect #[doc(hidden)]
1 parent 16f3e2b commit 8764cc9

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

crates/hir/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,21 @@ impl ItemInNs {
15991599
ItemInNs::Macros(_) => None,
16001600
}
16011601
}
1602+
1603+
/// Returns the crate defining this item (or `None` if `self` is built-in).
1604+
pub fn krate(&self, db: &dyn HirDatabase) -> Option<Crate> {
1605+
match self {
1606+
ItemInNs::Types(did) | ItemInNs::Values(did) => did.module(db).map(|m| m.krate()),
1607+
ItemInNs::Macros(id) => id.module(db).map(|m| m.krate()),
1608+
}
1609+
}
1610+
1611+
pub fn attrs(&self, db: &dyn HirDatabase) -> Option<AttrsWithOwner> {
1612+
match self {
1613+
ItemInNs::Types(it) | ItemInNs::Values(it) => it.attrs(db),
1614+
ItemInNs::Macros(it) => Some(it.attrs(db)),
1615+
}
1616+
}
16021617
}
16031618

16041619
/// Invariant: `inner.as_assoc_item(db).is_some()`

crates/ide_completion/src/completions/flyimport.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
138138
import_assets
139139
.search_for_imports(&ctx.sema, ctx.config.insert_use.prefix_kind)
140140
.into_iter()
141+
.filter(|import| {
142+
!ctx.is_item_hidden(&import.item_to_import)
143+
&& !ctx.is_item_hidden(&import.original_item)
144+
})
141145
.sorted_by_key(|located_import| {
142146
compute_fuzzy_completion_order_key(
143147
&located_import.import_path,
@@ -1147,4 +1151,42 @@ mod bar {
11471151
expect![[r#""#]],
11481152
);
11491153
}
1154+
1155+
#[test]
1156+
fn respects_doc_hidden() {
1157+
check(
1158+
r#"
1159+
//- /lib.rs crate:lib deps:dep
1160+
fn f() {
1161+
().fro$0
1162+
}
1163+
1164+
//- /dep.rs crate:dep
1165+
#[doc(hidden)]
1166+
pub trait Private {
1167+
fn frob(&self) {}
1168+
}
1169+
1170+
impl<T> Private for T {}
1171+
"#,
1172+
expect![[r#""#]],
1173+
);
1174+
check(
1175+
r#"
1176+
//- /lib.rs crate:lib deps:dep
1177+
fn f() {
1178+
().fro$0
1179+
}
1180+
1181+
//- /dep.rs crate:dep
1182+
pub trait Private {
1183+
#[doc(hidden)]
1184+
fn frob(&self) {}
1185+
}
1186+
1187+
impl<T> Private for T {}
1188+
"#,
1189+
expect![[r#""#]],
1190+
);
1191+
}
11501192
}

crates/ide_completion/src/context.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,15 @@ impl<'a> CompletionContext<'a> {
378378
false
379379
}
380380

381+
pub(crate) fn is_item_hidden(&self, item: &hir::ItemInNs) -> bool {
382+
let attrs = item.attrs(self.db);
383+
let krate = item.krate(self.db);
384+
match (attrs, krate) {
385+
(Some(attrs), Some(krate)) => self.is_doc_hidden(&attrs, krate),
386+
_ => false,
387+
}
388+
}
389+
381390
/// A version of [`SemanticsScope::process_all_names`] that filters out `#[doc(hidden)]` items.
382391
pub(crate) fn process_all_names(&self, f: &mut dyn FnMut(Name, ScopeDef)) {
383392
self.scope.process_all_names(&mut |name, def| {

0 commit comments

Comments
 (0)