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 } + ^^^^^ + "#]], + ); + } }