From: unexge Date: Thu, 26 Aug 2021 16:44:46 +0000 (+0300) Subject: fix: correctly complete macro call if cursor at `!` X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=c0d2b44250528a847782abf984bf2c15c017abd8;p=rust.git fix: correctly complete macro call if cursor at `!` --- diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs index d81cb5391cb..8d421fc78d7 100644 --- a/crates/ide_completion/src/completions/unqualified_path.rs +++ b/crates/ide_completion/src/completions/unqualified_path.rs @@ -304,4 +304,31 @@ pub mod rust_2018 {} "#]], ); } + + #[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) +} +"#, + ); + } } diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs index 6c6f8f8512b..d9024157ce4 100644 --- a/crates/ide_completion/src/context.rs +++ b/crates/ide_completion/src/context.rs @@ -236,14 +236,21 @@ pub(crate) fn source_range(&self) -> TextRange { let kind = self.token.kind(); if kind == IDENT || kind == LIFETIME_IDENT || kind == UNDERSCORE || kind.is_keyword() { cov_mark::hit!(completes_if_prefix_is_keyword); - self.original_token.text_range() + return self.original_token.text_range(); } else if kind == CHAR { // assume we are completing a lifetime but the user has only typed the ' cov_mark::hit!(completes_if_lifetime_without_idents); - TextRange::at(self.original_token.text_range().start(), TextSize::from(1)) - } else { - TextRange::empty(self.position.offset) + return TextRange::at(self.original_token.text_range().start(), TextSize::from(1)); + } else if kind == BANG { + if let Some(n) = self.token.parent() { + if n.kind() == SyntaxKind::MACRO_CALL { + cov_mark::hit!(completes_macro_call_if_cursor_at_bang_token); + return n.text_range(); + } + } } + + TextRange::empty(self.position.offset) } pub(crate) fn previous_token_is(&self, kind: SyntaxKind) -> bool {