mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 14:03:35 +00:00
Auto merge of #15044 - lowr:fix/deduplicate-compl-fields, r=lnicola
Deduplicate tuple indices for completion Follow-up to #15026 A tuple struct may dereference to a primitive tuple (though unusual, which is why I previously overlooked this case). We should not show the same tuple index in completion in such cases. Deduplication of indices among multiple tuple structs is already handled in the previous PR.
This commit is contained in:
commit
25f1c728b4
1 changed files with 28 additions and 2 deletions
|
@ -113,8 +113,12 @@ fn complete_fields(
|
|||
}
|
||||
}
|
||||
for (i, ty) in receiver.tuple_fields(ctx.db).into_iter().enumerate() {
|
||||
// Tuple fields are always public (tuple struct fields are handled above).
|
||||
tuple_index(acc, i, ty);
|
||||
// Tuples are always the last type in a deref chain, so just check if the name is
|
||||
// already seen without inserting into the hashset.
|
||||
if !seen_names.contains(&hir::Name::new_tuple_field(i)) {
|
||||
// Tuple fields are always public (tuple struct fields are handled above).
|
||||
tuple_index(acc, i, ty);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -720,6 +724,28 @@ fn test(a: A) {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_tuple_struct_deref_to_tuple_no_same_index() {
|
||||
check(
|
||||
r#"
|
||||
//- minicore: deref
|
||||
struct A(u8);
|
||||
impl core::ops::Deref for A {
|
||||
type Target = (u16, u32);
|
||||
fn deref(&self) -> &Self::Target { loop {} }
|
||||
}
|
||||
fn test(a: A) {
|
||||
a.$0
|
||||
}
|
||||
"#,
|
||||
expect![[r#"
|
||||
fd 0 u8
|
||||
fd 1 u32
|
||||
me deref() (use core::ops::Deref) fn(&self) -> &<Self as Deref>::Target
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_completion_works_in_consts() {
|
||||
check(
|
||||
|
|
Loading…
Reference in a new issue