feat: provide self in record literal completion

This commit is contained in:
rainy-me 2022-05-01 00:46:12 +09:00
parent 5c88d9344c
commit f3e3abfb98

View File

@ -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
@ -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]
fn literal_struct_completion_from_sub_modules() {
check_edit(