From 0519414c19da1a169b564e846df87895bc248674 Mon Sep 17 00:00:00 2001 From: DropDemBits Date: Thu, 14 Dec 2023 19:10:02 -0500 Subject: [PATCH] Make `ReferenceConversion` methods return ast types --- .../src/handlers/generate_function.rs | 2 +- .../src/handlers/generate_getter_or_setter.rs | 4 ++-- crates/ide-assists/src/utils.rs | 18 +++++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/crates/ide-assists/src/handlers/generate_function.rs b/crates/ide-assists/src/handlers/generate_function.rs index 50528e1caaa..63a62abc21c 100644 --- a/crates/ide-assists/src/handlers/generate_function.rs +++ b/crates/ide-assists/src/handlers/generate_function.rs @@ -1033,7 +1033,7 @@ fn fn_arg_type( if ty.is_reference() || ty.is_mutable_reference() { let famous_defs = &FamousDefs(&ctx.sema, ctx.sema.scope(fn_arg.syntax())?.krate()); convert_reference_type(ty.strip_references(), ctx.db(), famous_defs) - .map(|conversion| conversion.convert_type(ctx.db())) + .map(|conversion| conversion.convert_type(ctx.db()).to_string()) .or_else(|| ty.display_source_code(ctx.db(), target_module.into(), true).ok()) } else { ty.display_source_code(ctx.db(), target_module.into(), true).ok() diff --git a/crates/ide-assists/src/handlers/generate_getter_or_setter.rs b/crates/ide-assists/src/handlers/generate_getter_or_setter.rs index 4610b7af383..5d9dec13308 100644 --- a/crates/ide-assists/src/handlers/generate_getter_or_setter.rs +++ b/crates/ide-assists/src/handlers/generate_getter_or_setter.rs @@ -233,8 +233,8 @@ fn generate_getter_from_info( .map(|conversion| { cov_mark::hit!(convert_reference_type); ( - conversion.convert_type(ctx.db()), - conversion.getter(record_field_info.field_name.to_string()), + conversion.convert_type(ctx.db()).to_string(), + conversion.getter(record_field_info.field_name.to_string()).to_string(), ) }) })() diff --git a/crates/ide-assists/src/utils.rs b/crates/ide-assists/src/utils.rs index 0ec3f68c8ff..10d18ee67d8 100644 --- a/crates/ide-assists/src/utils.rs +++ b/crates/ide-assists/src/utils.rs @@ -718,8 +718,8 @@ enum ReferenceConversionType { } impl ReferenceConversion { - pub(crate) fn convert_type(&self, db: &dyn HirDatabase) -> String { - match self.conversion { + pub(crate) fn convert_type(&self, db: &dyn HirDatabase) -> ast::Type { + let ty = match self.conversion { ReferenceConversionType::Copy => self.ty.display(db).to_string(), ReferenceConversionType::AsRefStr => "&str".to_string(), ReferenceConversionType::AsRefSlice => { @@ -745,21 +745,25 @@ impl ReferenceConversion { type_arguments.next().unwrap().display(db).to_string(); format!("Result<&{first_type_argument_name}, &{second_type_argument_name}>") } - } + }; + + make::ty(&ty) } - pub(crate) fn getter(&self, field_name: String) -> String { + pub(crate) fn getter(&self, field_name: String) -> ast::Expr { + let expr = make::expr_field(make::ext::expr_self(), &field_name); + match self.conversion { - ReferenceConversionType::Copy => format!("self.{field_name}"), + ReferenceConversionType::Copy => expr, ReferenceConversionType::AsRefStr | ReferenceConversionType::AsRefSlice | ReferenceConversionType::Dereferenced | ReferenceConversionType::Option | ReferenceConversionType::Result => { if self.impls_deref { - format!("&self.{field_name}") + make::expr_ref(expr, false) } else { - format!("self.{field_name}.as_ref()") + make::expr_method_call(expr, make::name_ref("as_ref"), make::arg_list([])) } } }