10048: fix: correctly complete macro call if cursor at `!` r=Veykril a=unexge

Fixes https://github.com/rust-analyzer/rust-analyzer/issues/9904

Co-authored-by: unexge <unexge@gmail.com>
This commit is contained in:
bors[bot] 2021-09-15 18:13:09 +00:00 committed by GitHub
commit 911659a166
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 2 deletions

View File

@ -438,6 +438,10 @@ pub(crate) fn is_item_hidden(&self, item: &hir::ItemInNs) -> bool {
} }
} }
pub(crate) fn is_immediately_after_macro_bang(&self) -> bool {
self.token.kind() == BANG && self.token.parent().map_or(false, |it| it.kind() == MACRO_CALL)
}
/// A version of [`SemanticsScope::process_all_names`] that filters out `#[doc(hidden)]` items. /// A version of [`SemanticsScope::process_all_names`] that filters out `#[doc(hidden)]` items.
pub(crate) fn process_all_names(&self, f: &mut dyn FnMut(Name, ScopeDef)) { pub(crate) fn process_all_names(&self, f: &mut dyn FnMut(Name, ScopeDef)) {
self.scope.process_all_names(&mut |name, def| { self.scope.process_all_names(&mut |name, def| {

View File

@ -41,8 +41,13 @@ fn new(ctx: RenderContext<'a>, name: hir::Name, macro_: hir::MacroDef) -> MacroR
} }
fn render(&self, import_to_add: Option<ImportEdit>) -> Option<CompletionItem> { fn render(&self, import_to_add: Option<ImportEdit>) -> Option<CompletionItem> {
let mut item = let source_range = if self.ctx.completion.is_immediately_after_macro_bang() {
CompletionItem::new(CompletionKind::Reference, self.ctx.source_range(), &self.label()); cov_mark::hit!(completes_macro_call_if_cursor_at_bang_token);
self.ctx.completion.token.parent().map(|it| it.text_range())
} else {
Some(self.ctx.source_range())
}?;
let mut item = CompletionItem::new(CompletionKind::Reference, source_range, &self.label());
item.kind(SymbolKind::Macro) item.kind(SymbolKind::Macro)
.set_documentation(self.docs.clone()) .set_documentation(self.docs.clone())
.set_deprecated(self.ctx.is_deprecated(self.macro_)) .set_deprecated(self.ctx.is_deprecated(self.macro_))
@ -230,4 +235,31 @@ fn main() { foo! {$0} }
"#, "#,
) )
} }
#[test]
fn completes_macro_call_if_cursor_at_bang_token() {
// Regression test for https://github.com/rust-analyzer/rust-analyzer/issues/9904
cov_mark::check!(completes_macro_call_if_cursor_at_bang_token);
check_edit(
"foo!",
r#"
macro_rules! foo {
() => {}
}
fn main() {
foo!$0
}
"#,
r#"
macro_rules! foo {
() => {}
}
fn main() {
foo!($0)
}
"#,
);
}
} }