Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/context/analysis.rs9
-rw-r--r--crates/ide-completion/src/tests/attribute.rs22
-rw-r--r--crates/test-fixture/src/lib.rs42
3 files changed, 72 insertions, 1 deletions
diff --git a/crates/ide-completion/src/context/analysis.rs b/crates/ide-completion/src/context/analysis.rs
index 1979755ee5..acce62a041 100644
--- a/crates/ide-completion/src/context/analysis.rs
+++ b/crates/ide-completion/src/context/analysis.rs
@@ -417,6 +417,15 @@ fn analyze(
derive_ctx,
} = expansion_result;
+ if original_token.kind() != self_token.kind()
+ // FIXME: This check can be removed once we use speculative database forking for completions
+ && !(original_token.kind().is_punct() || original_token.kind().is_trivia())
+ && !(SyntaxKind::is_any_identifier(original_token.kind())
+ && SyntaxKind::is_any_identifier(self_token.kind()))
+ {
+ return None;
+ }
+
// Overwrite the path kind for derives
if let Some((original_file, file_with_fake_ident, offset, origin_attr)) = derive_ctx {
if let Some(ast::NameLike::NameRef(name_ref)) =
diff --git a/crates/ide-completion/src/tests/attribute.rs b/crates/ide-completion/src/tests/attribute.rs
index acafa6518f..ebf3582057 100644
--- a/crates/ide-completion/src/tests/attribute.rs
+++ b/crates/ide-completion/src/tests/attribute.rs
@@ -713,6 +713,28 @@ struct Foo;
);
}
+#[test]
+fn issue_17479() {
+ check(
+ r#"
+//- proc_macros: issue_17479
+fn main() {
+ proc_macros::issue_17479!("te$0");
+}
+"#,
+ expect![""],
+ );
+ check(
+ r#"
+//- proc_macros: issue_17479
+fn main() {
+ proc_macros::issue_17479!("$0");
+}
+"#,
+ expect![""],
+ )
+}
+
mod cfg {
use super::*;
diff --git a/crates/test-fixture/src/lib.rs b/crates/test-fixture/src/lib.rs
index b40b7757c6..0e72d79687 100644
--- a/crates/test-fixture/src/lib.rs
+++ b/crates/test-fixture/src/lib.rs
@@ -376,7 +376,7 @@ impl ChangeFixture {
}
}
-fn default_test_proc_macros() -> [(String, ProcMacro); 7] {
+fn default_test_proc_macros() -> [(String, ProcMacro); 8] {
[
(
r#"
@@ -483,6 +483,21 @@ pub fn issue_18840(_attr: TokenStream, _item: TokenStream) -> TokenStream {
disabled: false,
},
),
+ (
+ r#"
+#[proc_macro]
+pub fn issue_17479(input: TokenStream) -> TokenStream {
+ input
+}
+"#
+ .into(),
+ ProcMacro {
+ name: Symbol::intern("issue_17479"),
+ kind: ProcMacroKind::Bang,
+ expander: sync::Arc::new(Issue17479ProcMacroExpander),
+ disabled: false,
+ },
+ ),
]
}
@@ -761,3 +776,28 @@ impl ProcMacroExpander for ShortenProcMacroExpander {
}
}
}
+
+// Reads ident type within string quotes, for issue #17479.
+#[derive(Debug)]
+struct Issue17479ProcMacroExpander;
+impl ProcMacroExpander for Issue17479ProcMacroExpander {
+ fn expand(
+ &self,
+ subtree: &TopSubtree,
+ _: Option<&TopSubtree>,
+ _: &Env,
+ _: Span,
+ _: Span,
+ _: Span,
+ _: Option<String>,
+ ) -> Result<TopSubtree, ProcMacroExpansionError> {
+ let TokenTree::Leaf(Leaf::Literal(lit)) = &subtree.0[1] else {
+ return Err(ProcMacroExpansionError::Panic("incorrect Input".into()));
+ };
+ let symbol = &lit.symbol;
+ let span = lit.span;
+ Ok(quote! { span =>
+ #symbol()
+ })
+ }
+}