about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--crates/ide/src/signature_help.rs43
1 files changed, 33 insertions, 10 deletions
diff --git a/crates/ide/src/signature_help.rs b/crates/ide/src/signature_help.rs
index d249bc4728e..a666562f101 100644
--- a/crates/ide/src/signature_help.rs
+++ b/crates/ide/src/signature_help.rs
@@ -410,8 +410,21 @@ fn signature_help_for_record_lit(
     let fields;
 
     let db = sema.db;
-    match sema.resolve_path(&record.path()?)? {
-        PathResolution::Def(ModuleDef::Adt(adt)) => match adt {
+    let path_res = sema.resolve_path(&record.path()?)?;
+    if let PathResolution::Def(ModuleDef::Variant(variant)) = path_res {
+        fields = variant.fields(db);
+        let en = variant.parent_enum(db);
+
+        res.doc = en.docs(db).map(|it| it.into());
+        format_to!(res.signature, "enum {}::{} {{ ", en.name(db), variant.name(db));
+    } else {
+        let adt = match path_res {
+            PathResolution::SelfType(imp) => imp.self_ty(db).as_adt()?,
+            PathResolution::Def(ModuleDef::Adt(adt)) => adt,
+            _ => return None,
+        };
+
+        match adt {
             hir::Adt::Struct(it) => {
                 fields = it.fields(db);
                 res.doc = it.docs(db).map(|it| it.into());
@@ -423,15 +436,7 @@ fn signature_help_for_record_lit(
                 format_to!(res.signature, "union {} {{ ", it.name(db));
             }
             _ => return None,
-        },
-        PathResolution::Def(ModuleDef::Variant(variant)) => {
-            fields = variant.fields(db);
-            let en = variant.parent_enum(db);
-
-            res.doc = en.docs(db).map(|it| it.into());
-            format_to!(res.signature, "enum {}::{} {{ ", en.name(db), variant.name(db));
         }
-        _ => return None,
     }
 
     let mut fields =
@@ -1571,4 +1576,22 @@ fn f() {
             "#]],
         );
     }
+
+    #[test]
+    fn record_literal_self() {
+        check(
+            r#"
+struct S { t: u8 }
+impl S {
+    fn new() -> Self {
+        Self { $0 }
+    }
+}
+        "#,
+            expect![[r#"
+                struct S { t: u8 }
+                           ^^^^^
+            "#]],
+        );
+    }
 }