mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-11 20:58:54 +00:00
fix: do not offer completions within macro strings
This commit is contained in:
parent
4a03036744
commit
cb0221d774
3 changed files with 72 additions and 1 deletions
|
@ -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)) =
|
||||
|
|
|
@ -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::*;
|
||||
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue