about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/ide-completion/src/completions/record.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/crates/ide-completion/src/completions/record.rs b/crates/ide-completion/src/completions/record.rs
index 6057c0e0043..05fbe8513e7 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
@@ -134,6 +140,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(
             "submod::Struct {…}",