From 76b50f14f74dac4d26969517709b5837505bc1d7 Mon Sep 17 00:00:00 2001 From: patrick-gu <55641350+patrick-gu@users.noreply.github.com> Date: Sun, 19 Dec 2021 17:27:24 -0800 Subject: [PATCH] Don't say "a reference to" for Copy types 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. --- .../src/handlers/generate_getter.rs | 23 ++++++++++++++----- crates/ide_assists/src/utils.rs | 4 ++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/ide_assists/src/handlers/generate_getter.rs b/crates/ide_assists/src/handlers/generate_getter.rs index 81cf72dd71..653e448cbb 100644 --- a/crates/ide_assists/src/handlers/generate_getter.rs +++ b/crates/ide_assists/src/handlers/generate_getter.rs @@ -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 } diff --git a/crates/ide_assists/src/utils.rs b/crates/ide_assists/src/utils.rs index 03433fc42a..fd248ad021 100644 --- a/crates/ide_assists/src/utils.rs +++ b/crates/ide_assists/src/utils.rs @@ -572,6 +572,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