2023-03-30 08:53:36 +02:00
|
|
|
//! Completion for extern crates
|
|
|
|
|
2023-09-02 16:26:48 +02:00
|
|
|
use hir::Name;
|
|
|
|
use ide_db::{documentation::HasDocs, SymbolKind};
|
2023-03-30 08:53:36 +02:00
|
|
|
|
|
|
|
use crate::{context::CompletionContext, CompletionItem, CompletionItemKind};
|
|
|
|
|
|
|
|
use super::Completions;
|
|
|
|
|
|
|
|
pub(crate) fn complete_extern_crate(acc: &mut Completions, ctx: &CompletionContext<'_>) {
|
|
|
|
let imported_extern_crates: Vec<Name> = ctx.scope.extern_crate_decls().collect();
|
|
|
|
|
|
|
|
for (name, module) in ctx.scope.extern_crates() {
|
|
|
|
if imported_extern_crates.contains(&name) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
let mut item = CompletionItem::new(
|
|
|
|
CompletionItemKind::SymbolKind(SymbolKind::Module),
|
|
|
|
ctx.source_range(),
|
|
|
|
name.to_smol_str(),
|
|
|
|
);
|
|
|
|
item.set_documentation(module.docs(ctx.db));
|
|
|
|
|
|
|
|
item.add_to(acc, ctx.db);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod test {
|
|
|
|
use crate::tests::completion_list_no_kw;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn can_complete_extern_crate() {
|
|
|
|
let case = r#"
|
|
|
|
//- /lib.rs crate:other_crate_a
|
|
|
|
// nothing here
|
|
|
|
//- /other_crate_b.rs crate:other_crate_b
|
|
|
|
pub mod good_mod{}
|
|
|
|
//- /lib.rs crate:crate_c
|
|
|
|
// nothing here
|
|
|
|
//- /lib.rs crate:lib deps:other_crate_a,other_crate_b,crate_c extern-prelude:other_crate_a
|
|
|
|
extern crate oth$0
|
|
|
|
mod other_mod {}
|
|
|
|
"#;
|
|
|
|
|
|
|
|
let completion_list = completion_list_no_kw(case);
|
|
|
|
|
2024-02-10 00:47:35 +09:00
|
|
|
assert_eq!("md other_crate_a\n".to_owned(), completion_list);
|
2023-03-30 08:53:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn will_not_complete_existing_import() {
|
|
|
|
let case = r#"
|
|
|
|
//- /lib.rs crate:other_crate_a
|
|
|
|
// nothing here
|
|
|
|
//- /lib.rs crate:crate_c
|
|
|
|
// nothing here
|
|
|
|
//- /lib.rs crate:other_crate_b
|
|
|
|
//
|
|
|
|
//- /lib.rs crate:lib deps:other_crate_a,other_crate_b,crate_c extern-prelude:other_crate_a,other_crate_b
|
|
|
|
extern crate other_crate_b;
|
|
|
|
extern crate oth$0
|
|
|
|
mod other_mod {}
|
|
|
|
"#;
|
|
|
|
|
|
|
|
let completion_list = completion_list_no_kw(case);
|
|
|
|
|
2024-02-10 00:47:35 +09:00
|
|
|
assert_eq!("md other_crate_a\n".to_owned(), completion_list);
|
2023-03-30 08:53:36 +02:00
|
|
|
}
|
|
|
|
}
|