Deduplicate tuple indices for completion

This commit is contained in:
Ryo Yoshida 2023-06-13 17:32:00 +09:00
parent 42eab5e100
commit d01283b1f7
No known key found for this signature in database
GPG Key ID: E25698A930586171

View File

@ -113,11 +113,15 @@ fn complete_fields(
} }
} }
for (i, ty) in receiver.tuple_fields(ctx.db).into_iter().enumerate() { for (i, ty) in receiver.tuple_fields(ctx.db).into_iter().enumerate() {
// 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 fields are always public (tuple struct fields are handled above).
tuple_index(acc, i, ty); tuple_index(acc, i, ty);
} }
} }
} }
}
fn complete_methods( fn complete_methods(
ctx: &CompletionContext<'_>, ctx: &CompletionContext<'_>,
@ -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] #[test]
fn test_completion_works_in_consts() { fn test_completion_works_in_consts() {
check( check(