From f3e3abfb98ea1252f7d042393540be5da40ee58c Mon Sep 17 00:00:00 2001 From: rainy-me Date: Sun, 1 May 2022 00:46:12 +0900 Subject: [PATCH] feat: provide self in record literal completion --- .../ide-completion/src/completions/record.rs | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/crates/ide-completion/src/completions/record.rs b/crates/ide-completion/src/completions/record.rs index 6057c0e004..05fbe8513e 100644 --- a/crates/ide-completion/src/completions/record.rs +++ b/crates/ide-completion/src/completions/record.rs @@ -89,6 +89,12 @@ pub(crate) fn complete_record_literal( .filter(|it| it.len() > 1); acc.add_struct_literal(ctx, strukt, path, None); + + let impl_ = ctx.impl_def.as_ref()?; + let impl_adt = ctx.sema.to_def(impl_)?.self_ty(ctx.db).as_adt()?; + if hir::Adt::Struct(strukt) == impl_adt { + acc.add_struct_literal(ctx, strukt, None, Some(hir::known::SELF_TYPE)); + } } hir::Adt::Union(un) if ctx.path_qual().is_none() => { let path = ctx @@ -133,6 +139,61 @@ fn baz() { ) } + #[test] + fn literal_struct_impl_self_completion() { + check_edit( + "Self {…}", + r#" +struct Foo { + bar: u64, +} + +impl Foo { + fn new() -> Foo { + Self$0 + } +} + "#, + r#" +struct Foo { + bar: u64, +} + +impl Foo { + fn new() -> Foo { + Self { bar: ${1:()} }$0 + } +} + "#, + ); + + check_edit( + "Self(…)", + r#" +mod submod { + pub struct Foo(pub u64); +} + +impl submod::Foo { + fn new() -> submod::Foo { + Self$0 + } +} + "#, + r#" +mod submod { + pub struct Foo(pub u64); +} + +impl submod::Foo { + fn new() -> submod::Foo { + Self(${1:()})$0 + } +} + "#, + ) + } + #[test] fn literal_struct_completion_from_sub_modules() { check_edit(