From 544eca10d6313eee45eee1bae7fcf7e3dd3f2d3a Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 4 Jun 2021 21:07:19 +0200 Subject: Complete third-party attributes --- crates/ide_completion/src/completions/attribute.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/ide_completion/src/completions/attribute.rs b/crates/ide_completion/src/completions/attribute.rs index f80d7eec3..d3392100d 100644 --- a/crates/ide_completion/src/completions/attribute.rs +++ b/crates/ide_completion/src/completions/attribute.rs @@ -3,6 +3,7 @@ //! This module uses a bit of static metadata to provide completions //! for built-in attributes. +use hir::HasAttrs; use ide_db::helpers::generated_lints::{CLIPPY_LINTS, DEFAULT_LINTS, FEATURES}; use once_cell::sync::Lazy; use rustc_hash::{FxHashMap, FxHashSet}; @@ -81,6 +82,24 @@ fn complete_new_attribute(acc: &mut Completions, ctx: &CompletionContext, attrib None if is_inner => ATTRIBUTES.iter().for_each(add_completion), None => ATTRIBUTES.iter().filter(|compl| !compl.prefer_inner).for_each(add_completion), } + + // FIXME: write a test for this when we can + ctx.scope.process_all_names(&mut |name, scope_def| { + if let hir::ScopeDef::MacroDef(mac) = scope_def { + if mac.kind() == hir::MacroKind::Attr { + let mut item = CompletionItem::new( + CompletionKind::Attribute, + ctx.source_range(), + name.to_string(), + ); + item.kind(CompletionItemKind::Attribute); + if let Some(docs) = mac.docs(ctx.sema.db) { + item.documentation(docs); + } + acc.add(item.build()); + } + } + }); } struct AttrCompletion { -- cgit v1.2.3