ide_completion/completions/attribute/
macro_use.rs1use hir::ModuleDef;
3use ide_db::SymbolKind;
4use syntax::ast;
5
6use crate::{Completions, context::CompletionContext, item::CompletionItem};
7
8pub(super) fn complete_macro_use(
9 acc: &mut Completions,
10 ctx: &CompletionContext<'_>,
11 extern_crate: Option<&ast::ExternCrate>,
12 existing_imports: &[ast::Path],
13) {
14 let Some(extern_crate) = extern_crate else { return };
15 let Some(extern_crate) = ctx.sema.to_def(extern_crate) else { return };
16 let Some(krate) = extern_crate.resolved_crate(ctx.db) else { return };
17
18 for mod_def in krate.root_module(ctx.db).declarations(ctx.db) {
19 if let ModuleDef::Macro(mac) = mod_def {
20 let mac_name = mac.name(ctx.db);
21 let mac_name = mac_name.as_str();
22
23 let existing_import = existing_imports
24 .iter()
25 .filter_map(|p| p.as_single_name_ref())
26 .find(|n| n.text() == mac_name);
27 if existing_import.is_some() {
28 continue;
29 }
30
31 let item =
32 CompletionItem::new(SymbolKind::Macro, ctx.source_range(), mac_name, ctx.edition);
33 item.add_to(acc, ctx.db);
34 }
35 }
36}