Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/attribute/feature.rs')
| -rw-r--r-- | crates/ide-completion/src/completions/attribute/feature.rs | 52 |
1 files changed, 14 insertions, 38 deletions
diff --git a/crates/ide-completion/src/completions/attribute/feature.rs b/crates/ide-completion/src/completions/attribute/feature.rs index d662f5d543..1e6baca864 100644 --- a/crates/ide-completion/src/completions/attribute/feature.rs +++ b/crates/ide-completion/src/completions/attribute/feature.rs @@ -1,51 +1,27 @@ -//! Completion for lints -use ide_db::{SymbolKind, documentation::Documentation, generated::lints::Lint}; +//! Completion for features +use ide_db::{ + SymbolKind, + documentation::Documentation, + generated::lints::{FEATURES, Lint}, +}; use syntax::ast; use crate::{Completions, context::CompletionContext, item::CompletionItem}; -pub(super) fn complete_lint( +pub(super) fn complete_feature( acc: &mut Completions, ctx: &CompletionContext<'_>, - is_qualified: bool, - existing_lints: &[ast::Path], - lints_completions: &[Lint], + existing_features: &[ast::Path], ) { - for &Lint { label, description, .. } in lints_completions { - // FIXME: change `Lint`'s label to not store a path in it but split the prefix off instead? - let (qual, name) = match label.split_once("::") { - Some((qual, name)) => (Some(qual), name), - None => (None, label), - }; - if qual.is_none() && is_qualified { - // qualified completion requested, but this lint is unqualified - continue; - } - let lint_already_annotated = existing_lints + for &Lint { label, description, .. } in FEATURES { + let feature_already_annotated = existing_features .iter() - .filter_map(|path| { - let q = path.qualifier(); - if q.as_ref().and_then(|it| it.qualifier()).is_some() { - return None; - } - Some((q.and_then(|it| it.as_single_name_ref()), path.segment()?.name_ref()?)) - }) - .any(|(q, name_ref)| { - let qualifier_matches = match (q, qual) { - (None, None) => true, - (None, Some(_)) => false, - (Some(_), None) => false, - (Some(q), Some(ns)) => q.text() == ns, - }; - qualifier_matches && name_ref.text() == name - }); - if lint_already_annotated { + .filter_map(|p| p.as_single_name_ref()) + .any(|n| n.text() == label); + if feature_already_annotated { continue; } - let label = match qual { - Some(qual) if !is_qualified => format!("{qual}::{name}"), - _ => name.to_owned(), - }; + let mut item = CompletionItem::new(SymbolKind::Attribute, ctx.source_range(), label, ctx.edition); item.documentation(Documentation::new_borrowed(description)); |