fix: do not offer completions within macro strings

This commit is contained in:
Vishruth-Thimmaiah 2025-01-01 21:50:06 +05:30
parent 4a03036744
commit cb0221d774
No known key found for this signature in database
GPG key ID: B89775C5BE008866
3 changed files with 72 additions and 1 deletions

View file

@ -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)) =

View file

@ -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::*;

View file

@ -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()
})
}
}