Unnamed repository; edit this file 'description' to name the repository.
fix: correctly complete macro call if cursor at `!`
unexge 2021-08-26
parent 55d4813 · commit c0d2b44
-rw-r--r--crates/ide_completion/src/completions/unqualified_path.rs27
-rw-r--r--crates/ide_completion/src/context.rs15
2 files changed, 38 insertions, 4 deletions
diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs
index d81cb5391c..8d421fc78d 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 prelude {
"#]],
);
}
+
+ #[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 6c6f8f8512..d9024157ce 100644
--- a/crates/ide_completion/src/context.rs
+++ b/crates/ide_completion/src/context.rs
@@ -236,14 +236,21 @@ impl<'a> CompletionContext<'a> {
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 {