ide_completion/completions/attribute/
macro_use.rs

1//! Completion for macros in `#[macro_use(...)]`
2use 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}