From 4cc3a6d4fe16e342fcb2f791dd0ceccc188fb8ad Mon Sep 17 00:00:00 2001 From: Nick Spain Date: Thu, 31 Dec 2020 16:22:59 +1100 Subject: Fix completion of Default struct update syntax Previously the inserted text was always `..Default::default()` which ends up as `...Default::default()` if `.` was typed. Now checks if the current token is `.` and inserts `.Default::default()` if it is, so `..Default::default()` is correctly completed. Fixes #6969 --- crates/completion/src/completions/record.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'crates') diff --git a/crates/completion/src/completions/record.rs b/crates/completion/src/completions/record.rs index 91bf4a8ad..8f904adfd 100644 --- a/crates/completion/src/completions/record.rs +++ b/crates/completion/src/completions/record.rs @@ -20,13 +20,18 @@ pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> let missing_fields = ctx.sema.record_literal_missing_fields(record_lit); if impl_default_trait && !missing_fields.is_empty() { + let completion_text = if ctx.token.to_string() == "." { + ".Default::default()" + } else { + "..Default::default()" + }; acc.add( CompletionItem::new( CompletionKind::Snippet, ctx.source_range(), "..Default::default()", ) - .insert_text("..Default::default()") + .insert_text(completion_text) .kind(CompletionItemKind::Field) .build(), ); -- cgit v1.2.3 From 49eeeb61ae309a245de2f9bf65ffb0ea9576ba6c Mon Sep 17 00:00:00 2001 From: Nick Spain Date: Fri, 1 Jan 2021 11:10:02 +1100 Subject: Add a test for correct completion of ..Default::default() --- crates/completion/src/completions/record.rs | 62 ++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) (limited to 'crates') diff --git a/crates/completion/src/completions/record.rs b/crates/completion/src/completions/record.rs index 8f904adfd..f55ae11e6 100644 --- a/crates/completion/src/completions/record.rs +++ b/crates/completion/src/completions/record.rs @@ -53,7 +53,10 @@ mod tests { use expect_test::{expect, Expect}; use ide_db::helpers::FamousDefs; - use crate::{test_utils::completion_list, CompletionKind}; + use crate::{ + test_utils::{self, completion_list}, + CompletionKind, + }; fn check(ra_fixture: &str, expect: Expect) { let actual = completion_list(ra_fixture, CompletionKind::Reference); @@ -68,6 +71,18 @@ mod tests { expect.assert_eq(&actual); } + fn check_edit(what: &str, ra_fixture_before: &str, ra_fixture_after: &str) { + test_utils::check_edit( + what, + &format!( + "//- /main.rs crate:main deps:core{}\n{}", + ra_fixture_before, + FamousDefs::FIXTURE, + ), + &(ra_fixture_after.to_owned() + "\n"), + ); + } + #[test] fn test_record_literal_field_default() { let test_code = r#" @@ -106,6 +121,51 @@ fn process(f: S) { ); } + #[test] + fn test_record_literal_field_default_completion() { + check_edit( + "..Default::default()", + r#" +struct S { foo: u32, bar: usize } + +impl core::default::Default for S { + fn default() -> Self { + S { + foo: 0, + bar: 0, + } + } +} + +fn process(f: S) { + let other = S { + foo: 5, + .<|> + }; +} +"#, + r#" +struct S { foo: u32, bar: usize } + +impl core::default::Default for S { + fn default() -> Self { + S { + foo: 0, + bar: 0, + } + } +} + +fn process(f: S) { + let other = S { + foo: 5, + ..Default::default() + }; +} +"#, + ); + } + #[test] fn test_record_literal_field_without_default() { let test_code = r#" -- cgit v1.2.3 From 3d95c665561709f4017f28b2fb00a0bfb4661887 Mon Sep 17 00:00:00 2001 From: Nick Spain Date: Fri, 1 Jan 2021 11:17:15 +1100 Subject: Strip completion prefix of what has already been typed Per Veykril's suggestion, this removes the need to repeat the completion text twice. It also handles the completion in a more general case. --- crates/completion/src/completions/record.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'crates') diff --git a/crates/completion/src/completions/record.rs b/crates/completion/src/completions/record.rs index f55ae11e6..e58b9a274 100644 --- a/crates/completion/src/completions/record.rs +++ b/crates/completion/src/completions/record.rs @@ -20,11 +20,10 @@ pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> let missing_fields = ctx.sema.record_literal_missing_fields(record_lit); if impl_default_trait && !missing_fields.is_empty() { - let completion_text = if ctx.token.to_string() == "." { - ".Default::default()" - } else { - "..Default::default()" - }; + let completion_text = "..Default::default()"; + let completion_text = completion_text + .strip_prefix(ctx.token.to_string().as_str()) + .unwrap_or(completion_text); acc.add( CompletionItem::new( CompletionKind::Snippet, -- cgit v1.2.3