| //! 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 |
| "#]], |
| ); |
| } |
| } |