Unnamed repository; edit this file 'description' to name the repository.
Make it work with `Self { .. }`
Jonas Schievink 2023-01-28
parent e993072 · commit cad4cb3
-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 d249bc4728..a666562f10 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 }
+ ^^^^^
+ "#]],
+ );
+ }
}