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.rs21
1 files changed, 18 insertions, 3 deletions
diff --git a/crates/ide-completion/src/context.rs b/crates/ide-completion/src/context.rs
index 3a2a4a23a1..2f1860cbb5 100644
--- a/crates/ide-completion/src/context.rs
+++ b/crates/ide-completion/src/context.rs
@@ -443,7 +443,9 @@ pub(crate) struct CompletionContext<'a> {
/// The module of the `scope`.
pub(crate) module: hir::Module,
/// Whether nightly toolchain is used. Cached since this is looked up a lot.
- is_nightly: bool,
+ pub(crate) is_nightly: bool,
+ /// The edition of the current crate
+ // FIXME: This should probably be the crate of the current token?
pub(crate) edition: Edition,
/// The expected name of what we are completing.
@@ -532,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,
@@ -568,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() {
@@ -645,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;
@@ -664,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()
}