mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Merge #3694
3694: Complete only missing fields r=matklad a=SomeoneToIgnore Co-authored-by: Kirill Bulatov <mail4score@gmail.com>
This commit is contained in:
commit
8617fe641d
1 changed files with 61 additions and 1 deletions
|
@ -1,6 +1,7 @@
|
|||
//! FIXME: write short doc here
|
||||
|
||||
use crate::completion::{CompletionContext, Completions};
|
||||
use ra_syntax::SmolStr;
|
||||
|
||||
/// Complete fields in fields literals.
|
||||
pub(super) fn complete_record_literal(acc: &mut Completions, ctx: &CompletionContext) {
|
||||
|
@ -11,8 +12,24 @@ pub(super) fn complete_record_literal(acc: &mut Completions, ctx: &CompletionCon
|
|||
_ => return,
|
||||
};
|
||||
|
||||
let already_present_names: Vec<SmolStr> = ctx
|
||||
.record_lit_syntax
|
||||
.as_ref()
|
||||
.and_then(|record_literal| record_literal.record_field_list())
|
||||
.map(|field_list| field_list.fields())
|
||||
.map(|fields| {
|
||||
fields
|
||||
.into_iter()
|
||||
.filter_map(|field| field.name_ref())
|
||||
.map(|name_ref| name_ref.text().clone())
|
||||
.collect()
|
||||
})
|
||||
.unwrap_or_default();
|
||||
|
||||
for (field, field_ty) in ty.variant_fields(ctx.db, variant) {
|
||||
acc.add_field(ctx, field, &field_ty);
|
||||
if !already_present_names.contains(&SmolStr::from(field.name(ctx.db).to_string())) {
|
||||
acc.add_field(ctx, field, &field_ty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,4 +195,47 @@ mod tests {
|
|||
]
|
||||
"###);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn only_missing_fields_are_completed() {
|
||||
let completions = complete(
|
||||
r"
|
||||
struct S {
|
||||
foo1: u32,
|
||||
foo2: u32,
|
||||
bar: u32,
|
||||
baz: u32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let foo1 = 1;
|
||||
let s = S {
|
||||
foo1,
|
||||
foo2: 5,
|
||||
<|>
|
||||
}
|
||||
}
|
||||
",
|
||||
);
|
||||
assert_debug_snapshot!(completions, @r###"
|
||||
[
|
||||
CompletionItem {
|
||||
label: "bar",
|
||||
source_range: [302; 302),
|
||||
delete: [302; 302),
|
||||
insert: "bar",
|
||||
kind: Field,
|
||||
detail: "u32",
|
||||
},
|
||||
CompletionItem {
|
||||
label: "baz",
|
||||
source_range: [302; 302),
|
||||
delete: [302; 302),
|
||||
insert: "baz",
|
||||
kind: Field,
|
||||
detail: "u32",
|
||||
},
|
||||
]
|
||||
"###);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue