mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 14:03:35 +00:00
derive completions take existing derives into count
This commit is contained in:
parent
d1f6b4e2a0
commit
fedd0245d1
2 changed files with 31 additions and 11 deletions
|
@ -523,7 +523,8 @@ impl<'a> CompletionContext<'a> {
|
|||
// successful expansions
|
||||
(Some(actual_expansion), Some((fake_expansion, fake_mapped_token))) => {
|
||||
let new_offset = fake_mapped_token.text_range().start();
|
||||
derive_ctx = Some((actual_expansion, fake_expansion, new_offset));
|
||||
derive_ctx =
|
||||
Some((actual_expansion, fake_expansion, new_offset, orig_attr));
|
||||
break 'expansion;
|
||||
}
|
||||
// exactly one expansion failed, inconsistent state so stop expanding completely
|
||||
|
@ -718,7 +719,7 @@ impl<'a> CompletionContext<'a> {
|
|||
original_file: &SyntaxNode,
|
||||
file_with_fake_ident: SyntaxNode,
|
||||
offset: TextSize,
|
||||
derive_ctx: Option<(SyntaxNode, SyntaxNode, TextSize)>,
|
||||
derive_ctx: Option<(SyntaxNode, SyntaxNode, TextSize, ast::Attr)>,
|
||||
) {
|
||||
let fake_ident_token = file_with_fake_ident.token_at_offset(offset).right_biased().unwrap();
|
||||
let syntax_element = NodeOrToken::Token(fake_ident_token);
|
||||
|
@ -742,16 +743,14 @@ impl<'a> CompletionContext<'a> {
|
|||
(self.expected_type, self.expected_name) = self.expected_type_and_name();
|
||||
|
||||
// Overwrite the path kind for derives
|
||||
if let Some((original_file, file_with_fake_ident, offset)) = derive_ctx {
|
||||
let attr = self
|
||||
if let Some((original_file, file_with_fake_ident, offset, origin_attr)) = derive_ctx {
|
||||
self.existing_derives = self
|
||||
.sema
|
||||
.token_ancestors_with_macros(self.token.clone())
|
||||
.take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE)
|
||||
.find_map(ast::Attr::cast);
|
||||
if let Some(attr) = &attr {
|
||||
self.existing_derives =
|
||||
self.sema.resolve_derive_macro(attr).into_iter().flatten().flatten().collect();
|
||||
}
|
||||
.resolve_derive_macro(&origin_attr)
|
||||
.into_iter()
|
||||
.flatten()
|
||||
.flatten()
|
||||
.collect();
|
||||
|
||||
if let Some(ast::NameLike::NameRef(name_ref)) =
|
||||
find_node_at_offset(&file_with_fake_ident, offset)
|
||||
|
|
|
@ -747,6 +747,27 @@ mod derive {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn derive_with_existing_derives() {
|
||||
check_derive(
|
||||
r#"
|
||||
//- minicore: derive, copy, clone, ord, eq, default, fmt
|
||||
#[derive(PartialEq, Eq, Or$0)] struct Test;
|
||||
"#,
|
||||
expect![[r#"
|
||||
md core
|
||||
de Default macro Default
|
||||
de Clone, Copy
|
||||
de PartialOrd, Ord
|
||||
de Clone macro Clone
|
||||
de PartialOrd
|
||||
kw self::
|
||||
kw super::
|
||||
kw crate::
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn derive_flyimport() {
|
||||
check_derive(
|
||||
|
|
Loading…
Reference in a new issue