blob: b44c90757f68763aa3e51e354fc3b4d9ccf7e365 [file] [log] [blame]
//! Injected completions for `#[rust_analyzer::rust_fixture]`.
use hir::FilePositionWrapper;
use ide_db::{
impl_empty_upmap_from_ra_fixture,
ra_fixture::{RaFixtureAnalysis, UpmapFromRaFixture},
};
use syntax::ast;
use crate::{
CompletionItemKind, CompletionItemRefMode, CompletionRelevance, completions::Completions,
context::CompletionContext, item::CompletionItemLabel,
};
pub(crate) fn complete_ra_fixture(
acc: &mut Completions,
ctx: &CompletionContext<'_>,
original: &ast::String,
expanded: &ast::String,
) -> Option<()> {
let analysis = RaFixtureAnalysis::analyze_ra_fixture(
&ctx.sema,
original.clone(),
expanded,
ctx.config.minicore,
&mut |_| {},
)?;
let (virtual_file_id, virtual_offset) = analysis.map_offset_down(ctx.position.offset)?;
let completions = hir::attach_db_allow_change(&analysis.db, || {
crate::completions(
&analysis.db,
ctx.config,
FilePositionWrapper { file_id: virtual_file_id, offset: virtual_offset },
ctx.trigger_character,
)
})?;
let completions =
completions.upmap_from_ra_fixture(&analysis, virtual_file_id, ctx.position.file_id).ok()?;
acc.add_many(completions);
Some(())
}
impl_empty_upmap_from_ra_fixture!(
CompletionItemLabel,
CompletionItemKind,
CompletionRelevance,
CompletionItemRefMode,
);
#[cfg(test)]
mod tests {
use expect_test::expect;
use crate::tests::check;
#[test]
fn it_works() {
check(
r##"
fn fixture(#[rust_analyzer::rust_fixture] ra_fixture: &str) {}
fn foo() {
fixture(r#"
fn complete_me() {}
fn baz() {
let foo_bar_baz = 123;
f$0
}
"#);
}
"##,
expect![[r#"
fn baz() fn()
fn complete_me() fn()
lc foo_bar_baz i32
bt u32 u32
kw async
kw const
kw crate::
kw enum
kw extern
kw false
kw fn
kw for
kw if
kw if let
kw impl
kw impl for
kw let
kw letm
kw loop
kw match
kw mod
kw return
kw self::
kw static
kw struct
kw trait
kw true
kw type
kw union
kw unsafe
kw use
kw while
kw while let
sn macro_rules
sn pd
sn ppd
"#]],
);
}
}