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);
27 CompletionKind::Snippet,
29 "..Default::default()",
31 .insert_text(completion_text)
32 .kind(SymbolKind::Field)
41 for (field, ty) in missing_fields {
42 acc.add_field(ctx, field, &ty);
50 use expect_test::{expect, Expect};
51 use ide_db::helpers::FamousDefs;
54 test_utils::{self, completion_list},
58 fn check(ra_fixture: &str, expect: Expect) {
59 let actual = completion_list(ra_fixture, CompletionKind::Reference);
60 expect.assert_eq(&actual);
63 fn check_snippet(ra_fixture: &str, expect: Expect) {
64 let actual = completion_list(
65 &format!("//- /main.rs crate:main deps:core\n{}\n{}", ra_fixture, FamousDefs::FIXTURE),
66 CompletionKind::Snippet,
68 expect.assert_eq(&actual);
71 fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) {
72 test_utils::check_edit(
75 "//- /main.rs crate:main deps:core{}\n{}",
79 &(ra_fixture_after.to_owned() + "\n"),
84 fn test_record_literal_field_default() {
86 struct S { foo: u32, bar: usize }
88 impl core::default::Default for S {
89 fn default() -> Self {
116 fd ..Default::default()
122 fn test_record_literal_field_default_completion() {
124 "..Default::default()",
126 struct S { foo: u32, bar: usize }
128 impl core::default::Default for S {
129 fn default() -> Self {
145 struct S { foo: u32, bar: usize }
147 impl core::default::Default for S {
148 fn default() -> Self {
167 fn test_record_literal_field_without_default() {
169 struct S { foo: u32, bar: usize }
195 fn test_record_pattern_field() {
198 struct S { foo: u32 }
213 fn test_record_pattern_enum_variant() {
216 enum E { S { foo: u32, bar: () } }
232 fn test_record_pattern_field_in_simple_macro() {
235 macro_rules! m { ($e:expr) => { $e } }
236 struct S { foo: u32 }
251 fn only_missing_fields_are_completed_in_destruct_pats() {
255 foo1: u32, foo2: u32,
264 if let S { foo1, foo2: a, $0 } = s {}
275 fn test_record_literal_field() {
278 struct A { the_field: u32 }
290 fn test_record_literal_enum_variant() {
293 enum E { A { a: u32 } }
305 fn test_record_literal_two_structs() {
322 fn test_record_literal_generic_struct() {
328 let _: A<u32> = A { $0 }
338 fn test_record_literal_field_in_simple_macro() {
341 macro_rules! m { ($e:expr) => { $e } }
342 struct A { the_field: u32 }
354 fn only_missing_fields_are_completed() {
358 foo1: u32, foo2: u32,
364 let s = S { foo1, foo2: 5, $0 }
375 fn completes_functional_update() {
378 struct S { foo1: u32, foo2: u32 }
382 let s = S { foo1, $0 .. loop {} }