Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-completion/src/completions/attribute/macro_use.rs')
-rw-r--r--crates/ide-completion/src/completions/attribute/macro_use.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/crates/ide-completion/src/completions/attribute/macro_use.rs b/crates/ide-completion/src/completions/attribute/macro_use.rs
new file mode 100644
index 0000000000..f45f9cba25
--- /dev/null
+++ b/crates/ide-completion/src/completions/attribute/macro_use.rs
@@ -0,0 +1,35 @@
+//! Completion for macros in `#[macro_use(...)]`
+use hir::ModuleDef;
+use ide_db::SymbolKind;
+use syntax::ast;
+
+use crate::{context::CompletionContext, item::CompletionItem, Completions};
+
+pub(super) fn complete_macro_use(
+ acc: &mut Completions,
+ ctx: &CompletionContext<'_>,
+ extern_crate: Option<&ast::ExternCrate>,
+ existing_imports: &[ast::Path],
+) {
+ let Some(extern_crate) = extern_crate else { return };
+ let Some(extern_crate) = ctx.sema.to_def(extern_crate) else { return };
+ let Some(krate) = extern_crate.resolved_crate(ctx.db) else { return };
+
+ for mod_def in krate.root_module().declarations(ctx.db) {
+ if let ModuleDef::Macro(mac) = mod_def {
+ let mac_name = mac.name(ctx.db);
+ let Some(mac_name) = mac_name.as_str() else { continue };
+
+ let existing_import = existing_imports
+ .iter()
+ .filter_map(|p| p.as_single_name_ref())
+ .find(|n| n.text() == mac_name);
+ if existing_import.is_some() {
+ continue;
+ }
+
+ let item = CompletionItem::new(SymbolKind::Macro, ctx.source_range(), mac_name);
+ item.add_to(acc, ctx.db);
+ }
+ }
+}