1 //! Complete fields in record literals and patterns.
2 use ide_db::{helpers::FamousDefs, SymbolKind};
5 use crate::{item::CompletionKind, CompletionContext, CompletionItem, Completions};
7 pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> Option<()> {
8 let missing_fields = match (ctx.record_pat_syntax.as_ref(), ctx.record_lit_syntax.as_ref()) {
9 (None, None) => return None,
10 (Some(_), Some(_)) => unreachable!("A record cannot be both a literal and a pattern"),
11 (Some(record_pat), _) => ctx.sema.record_pattern_missing_fields(record_pat),
12 (_, Some(record_lit)) => {
13 let ty = ctx.sema.type_of_expr(&Expr::RecordExpr(record_lit.clone()));
14 let default_trait = FamousDefs(&ctx.sema, ctx.krate).core_default_Default();
15 let impl_default_trait = default_trait
16 .and_then(|default_trait| ty.map(|ty| ty.impls_trait(ctx.db, default_trait, &[])))
19 let missing_fields = ctx.sema.record_literal_missing_fields(record_lit);
20 if impl_default_trait && !missing_fields.is_empty() {
21 let completion_text = "..Default::default()";
22 let completion_text = completion_text
23 .strip_prefix(ctx.token.to_string().as_str())
24 .unwrap_or(completion_text);
25 let mut builder = CompletionItem::new(
26 CompletionKind::Snippet,
28 "..Default::default()",
30 builder.insert_text(completion_text).kind(SymbolKind::Field);
31 acc.add(builder.build());
38 for (field, ty) in missing_fields {
39 acc.add_field(ctx, field, &ty);
47 use expect_test::{expect, Expect};
48 use ide_db::helpers::FamousDefs;
51 test_utils::{self, completion_list},
55 fn check(ra_fixture: &str, expect: Expect) {
56 let actual = completion_list(ra_fixture, CompletionKind::Reference);
57 expect.assert_eq(&actual);
60 fn check_snippet(ra_fixture: &str, expect: Expect) {
61 let actual = completion_list(
62 &format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE),
63 CompletionKind::Snippet,
65 expect.assert_eq(&actual);
68 fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
69 test_utils::check_edit(
72 "//- /main.rs crate:main deps:core{}\n{}",
76 &(ra_fixture_after.to_owned() + "\n"),
81 fn test_record_literal_field_default() {
83 struct S { foo: u32, bar: usize }
85 impl core::default::Default for S {
86 fn default() -> Self {
113 fd ..Default::default()
119 fn test_record_literal_field_default_completion() {
121 "..Default::default()",
123 struct S { foo: u32, bar: usize }
125 impl core::default::Default for S {
126 fn default() -> Self {
142 struct S { foo: u32, bar: usize }
144 impl core::default::Default for S {
145 fn default() -> Self {
164 fn test_record_literal_field_without_default() {
166 struct S { foo: u32, bar: usize }
192 fn test_record_pattern_field() {
195 struct S { foo: u32 }
210 fn test_record_pattern_enum_variant() {
213 enum E { S { foo: u32, bar: () } }
229 fn test_record_pattern_field_in_simple_macro() {
232 macro_rules! m { ($e:expr) => { $e } }
233 struct S { foo: u32 }
248 fn only_missing_fields_are_completed_in_destruct_pats() {
252 foo1: u32, foo2: u32,
261 if let S { foo1, foo2: a, $0 } = s {}
272 fn test_record_literal_field() {
275 struct A { the_field: u32 }
287 fn test_record_literal_enum_variant() {
290 enum E { A { a: u32 } }
302 fn test_record_literal_two_structs() {
319 fn test_record_literal_generic_struct() {
325 let _: A<u32> = A { $0 }
335 fn test_record_literal_field_in_simple_macro() {
338 macro_rules! m { ($e:expr) => { $e } }
339 struct A { the_field: u32 }
351 fn only_missing_fields_are_completed() {
355 foo1: u32, foo2: u32,
361 let s = S { foo1, foo2: 5, $0 }
372 fn completes_functional_update() {
375 struct S { foo1: u32, foo2: u32 }
379 let s = S { foo1, $0 .. loop {} }