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
17 .map_or(false, |(default_trait, 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 mut item = CompletionItem::new(
23 CompletionKind::Snippet,
28 completion_text.strip_prefix(ctx.token.text()).unwrap_or(completion_text);
29 item.insert_text(completion_text).kind(SymbolKind::Field);
37 for (field, ty) in missing_fields {
38 acc.add_field(ctx, field, &ty);
46 use expect_test::{expect, Expect};
47 use ide_db::helpers::FamousDefs;
50 test_utils::{self, completion_list},
54 fn check(ra_fixture: &str, expect: Expect) {
55 let actual = completion_list(ra_fixture, CompletionKind::Reference);
56 expect.assert_eq(&actual);
59 fn check_snippet(ra_fixture: &str, expect: Expect) {
60 let actual = completion_list(
61 &format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE),
62 CompletionKind::Snippet,
64 expect.assert_eq(&actual);
67 fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
68 test_utils::check_edit(
71 "//- /main.rs crate:main deps:core{}\n{}",
75 &(ra_fixture_after.to_owned() + "\n"),
80 fn test_record_literal_field_default() {
82 struct S { foo: u32, bar: usize }
84 impl core::default::Default for S {
85 fn default() -> Self {
110 fd ..Default::default()
116 fn test_record_literal_field_default_completion() {
118 "..Default::default()",
120 struct S { foo: u32, bar: usize }
122 impl core::default::Default for S {
123 fn default() -> Self {
139 struct S { foo: u32, bar: usize }
141 impl core::default::Default for S {
142 fn default() -> Self {
161 fn test_record_literal_field_without_default() {
163 struct S { foo: u32, bar: usize }
179 check_snippet(test_code, expect![[r#""#]]);
183 fn test_record_pattern_field() {
186 struct S { foo: u32 }
201 fn test_record_pattern_enum_variant() {
204 enum E { S { foo: u32, bar: () } }
220 fn test_record_pattern_field_in_simple_macro() {
223 macro_rules! m { ($e:expr) => { $e } }
224 struct S { foo: u32 }
239 fn only_missing_fields_are_completed_in_destruct_pats() {
243 foo1: u32, foo2: u32,
252 if let S { foo1, foo2: a, $0 } = s {}
263 fn test_record_literal_field() {
266 struct A { the_field: u32 }
278 fn test_record_literal_enum_variant() {
281 enum E { A { a: u32 } }
293 fn test_record_literal_two_structs() {
310 fn test_record_literal_generic_struct() {
316 let _: A<u32> = A { $0 }
326 fn test_record_literal_field_in_simple_macro() {
329 macro_rules! m { ($e:expr) => { $e } }
330 struct A { the_field: u32 }
342 fn only_missing_fields_are_completed() {
346 foo1: u32, foo2: u32,
352 let s = S { foo1, foo2: 5, $0 }
363 fn completes_functional_update() {
366 struct S { foo1: u32, foo2: u32 }
370 let s = S { foo1, $0 .. loop {} }