11062: fix: Don't say "a reference to" for `Copy` types in the generate getter assist r=Veykril a=patrick-gu

This changes the generate getter assist to not say "a reference to" in the documentation stub if the type is `Copy`, as the getter does not return a reference.

To determine whether the type is `Copy`, I have added an `is_copy` method to `ReferenceConversion`.

Co-authored-by: patrick-gu <55641350+patrick-gu@users.noreply.github.com>
This commit is contained in:
bors[bot] 2021-12-20 09:14:38 +00:00 committed by GitHub
commit 2ca3834c9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 6 deletions

View File

@ -112,8 +112,12 @@ pub(crate) fn generate_getter_impl(
}
let vis = strukt.visibility().map_or(String::new(), |v| format!("{} ", v));
let (ty, body) = if mutable {
(format!("&mut {}", field_ty), format!("&mut self.{}", field_name))
let (ty, body, description) = if mutable {
(
format!("&mut {}", field_ty),
format!("&mut self.{}", field_name),
"a mutable reference to ",
)
} else {
let famous_defs = &FamousDefs(&ctx.sema, ctx.sema.scope(field_ty.syntax()).krate());
ctx.sema
@ -124,18 +128,25 @@ pub(crate) fn generate_getter_impl(
(
conversion.convert_type(ctx.db()),
conversion.getter(field_name.to_string()),
if conversion.is_copy() { "" } else { "a reference to " },
)
})
.unwrap_or_else(|| {
(
format!("&{}", field_ty),
format!("&self.{}", field_name),
"a reference to ",
)
})
.unwrap_or_else(|| (format!("&{}", field_ty), format!("&self.{}", field_name)))
};
format_to!(
buf,
" /// Get a {}reference to the {}'s {}.
" /// Get {}the {}'s {}.
{}fn {}(&{}self) -> {} {{
{}
}}",
mutable.then(|| "mutable ").unwrap_or_default(),
description,
to_lower_snake_case(&strukt_name.to_string()).replace('_', " "),
fn_name.trim_end_matches("_mut").replace('_', " "),
vis,
@ -349,7 +360,7 @@ struct S { foo: $0bool }
struct S { foo: bool }
impl S {
/// Get a reference to the s's foo.
/// Get the s's foo.
fn $0foo(&self) -> bool {
self.foo
}

View File

@ -571,6 +571,10 @@ impl ReferenceConversion {
| ReferenceConversionType::Result => format!("self.{}.as_ref()", field_name),
}
}
pub(crate) fn is_copy(&self) -> bool {
matches!(self.conversion, ReferenceConversionType::Copy)
}
}
// FIXME: It should return a new hir::Type, but currently constructing new types is too cumbersome