Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/context.rs')
-rw-r--r--crates/ide-completion/src/context.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/crates/ide-completion/src/context.rs b/crates/ide-completion/src/context.rs
index 366e79cddf..2f1860cbb5 100644
--- a/crates/ide-completion/src/context.rs
+++ b/crates/ide-completion/src/context.rs
@@ -534,7 +534,7 @@ impl CompletionContext<'_> {
}
}
- /// Checks if an item is visible and not `doc(hidden)` at the completion site.
+ /// Checks if an item is visible, not `doc(hidden)` and stable at the completion site.
pub(crate) fn is_visible<I>(&self, item: &I) -> Visible
where
I: hir::HasVisibility + hir::HasAttrs + hir::HasCrate + Copy,
@@ -570,6 +570,15 @@ impl CompletionContext<'_> {
!attrs.is_unstable() || self.is_nightly
}
+ pub(crate) fn check_stability_and_hidden<I>(&self, item: I) -> bool
+ where
+ I: hir::HasAttrs + hir::HasCrate,
+ {
+ let defining_crate = item.krate(self.db);
+ let attrs = item.attrs(self.db);
+ self.check_stability(Some(&attrs)) && !self.is_doc_hidden(&attrs, defining_crate)
+ }
+
/// Whether the given trait is an operator trait or not.
pub(crate) fn is_ops_trait(&self, trait_: hir::Trait) -> bool {
match trait_.attrs(self.db).lang() {
@@ -647,6 +656,10 @@ impl CompletionContext<'_> {
attrs: &hir::Attrs,
defining_crate: hir::Crate,
) -> Visible {
+ if !self.check_stability(Some(attrs)) {
+ return Visible::No;
+ }
+
if !vis.is_visible_from(self.db, self.module.into()) {
if !self.config.enable_private_editable {
return Visible::No;
@@ -666,7 +679,7 @@ impl CompletionContext<'_> {
}
}
- fn is_doc_hidden(&self, attrs: &hir::Attrs, defining_crate: hir::Crate) -> bool {
+ pub(crate) fn is_doc_hidden(&self, attrs: &hir::Attrs, defining_crate: hir::Crate) -> bool {
// `doc(hidden)` items are only completed within the defining crate.
self.krate != defining_crate && attrs.has_doc_hidden()
}