Make ReferenceConversion methods return ast types

This commit is contained in:
DropDemBits 2023-12-14 19:10:02 -05:00
parent 039b3d0abb
commit 0519414c19
No known key found for this signature in database
GPG key ID: 7FE02A6C1EDFA075
3 changed files with 14 additions and 10 deletions

View file

@ -1033,7 +1033,7 @@ fn fn_arg_type(
if ty.is_reference() || ty.is_mutable_reference() { if ty.is_reference() || ty.is_mutable_reference() {
let famous_defs = &FamousDefs(&ctx.sema, ctx.sema.scope(fn_arg.syntax())?.krate()); let famous_defs = &FamousDefs(&ctx.sema, ctx.sema.scope(fn_arg.syntax())?.krate());
convert_reference_type(ty.strip_references(), ctx.db(), famous_defs) 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()) .or_else(|| ty.display_source_code(ctx.db(), target_module.into(), true).ok())
} else { } else {
ty.display_source_code(ctx.db(), target_module.into(), true).ok() ty.display_source_code(ctx.db(), target_module.into(), true).ok()

View file

@ -233,8 +233,8 @@ fn generate_getter_from_info(
.map(|conversion| { .map(|conversion| {
cov_mark::hit!(convert_reference_type); cov_mark::hit!(convert_reference_type);
( (
conversion.convert_type(ctx.db()), conversion.convert_type(ctx.db()).to_string(),
conversion.getter(record_field_info.field_name.to_string()), conversion.getter(record_field_info.field_name.to_string()).to_string(),
) )
}) })
})() })()

View file

@ -718,8 +718,8 @@ enum ReferenceConversionType {
} }
impl ReferenceConversion { impl ReferenceConversion {
pub(crate) fn convert_type(&self, db: &dyn HirDatabase) -> String { pub(crate) fn convert_type(&self, db: &dyn HirDatabase) -> ast::Type {
match self.conversion { let ty = match self.conversion {
ReferenceConversionType::Copy => self.ty.display(db).to_string(), ReferenceConversionType::Copy => self.ty.display(db).to_string(),
ReferenceConversionType::AsRefStr => "&str".to_string(), ReferenceConversionType::AsRefStr => "&str".to_string(),
ReferenceConversionType::AsRefSlice => { ReferenceConversionType::AsRefSlice => {
@ -745,21 +745,25 @@ impl ReferenceConversion {
type_arguments.next().unwrap().display(db).to_string(); type_arguments.next().unwrap().display(db).to_string();
format!("Result<&{first_type_argument_name}, &{second_type_argument_name}>") 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 { match self.conversion {
ReferenceConversionType::Copy => format!("self.{field_name}"), ReferenceConversionType::Copy => expr,
ReferenceConversionType::AsRefStr ReferenceConversionType::AsRefStr
| ReferenceConversionType::AsRefSlice | ReferenceConversionType::AsRefSlice
| ReferenceConversionType::Dereferenced | ReferenceConversionType::Dereferenced
| ReferenceConversionType::Option | ReferenceConversionType::Option
| ReferenceConversionType::Result => { | ReferenceConversionType::Result => {
if self.impls_deref { if self.impls_deref {
format!("&self.{field_name}") make::expr_ref(expr, false)
} else { } else {
format!("self.{field_name}.as_ref()") make::expr_method_call(expr, make::name_ref("as_ref"), make::arg_list([]))
} }
} }
} }