mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-25 19:35:06 +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,
|
derive_ctx,
|
||||||
} = expansion_result;
|
} = 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
|
// Overwrite the path kind for derives
|
||||||
if let Some((original_file, file_with_fake_ident, offset, origin_attr)) = derive_ctx {
|
if let Some((original_file, file_with_fake_ident, offset, origin_attr)) = derive_ctx {
|
||||||
if let Some(ast::NameLike::NameRef(name_ref)) =
|
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 {
|
mod cfg {
|
||||||
use super::*;
|
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#"
|
r#"
|
||||||
|
@ -483,6 +483,21 @@ pub fn issue_18840(_attr: TokenStream, _item: TokenStream) -> TokenStream {
|
||||||
disabled: false,
|
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