Auto merge of #12123 - rainy-me:feat/impl-self-completion, r=Veykril

feat: provide Self in record literal completion

close #12106
This commit is contained in:
bors 2022-05-02 12:29:49 +00:00
commit f83dccf5b9

View file

@ -89,6 +89,12 @@ pub(crate) fn complete_record_literal(
.filter(|it| it.len() > 1); .filter(|it| it.len() > 1);
acc.add_struct_literal(ctx, strukt, path, None); 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() => { hir::Adt::Union(un) if ctx.path_qual().is_none() => {
let path = ctx 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] #[test]
fn literal_struct_completion_from_sub_modules() { fn literal_struct_completion_from_sub_modules() {
check_edit( check_edit(