Skip to content

Commit 1d79e8e

Browse files
authored
Merge pull request #21578 from ChayimFriedman2/reparse-unknown
fix: Use `display_source_code()` in `ReferenceConversion`
2 parents 538a890 + d46ab4f commit 1d79e8e

3 files changed

Lines changed: 48 additions & 29 deletions

File tree

crates/ide-assists/src/handlers/generate_function.rs

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1147,14 +1147,7 @@ fn fn_arg_type(
11471147
if ty.is_reference() || ty.is_mutable_reference() {
11481148
let famous_defs = &FamousDefs(&ctx.sema, ctx.sema.scope(fn_arg.syntax())?.krate());
11491149
convert_reference_type(ty.strip_references(), ctx.db(), famous_defs)
1150-
.map(|conversion| {
1151-
conversion
1152-
.convert_type(
1153-
ctx.db(),
1154-
target_module.krate(ctx.db()).to_display_target(ctx.db()),
1155-
)
1156-
.to_string()
1157-
})
1150+
.map(|conversion| conversion.convert_type(ctx.db(), target_module).to_string())
11581151
.or_else(|| ty.display_source_code(ctx.db(), target_module.into(), true).ok())
11591152
} else {
11601153
ty.display_source_code(ctx.db(), target_module.into(), true).ok()
@@ -3187,6 +3180,28 @@ fn main() {
31873180
r#"
31883181
fn main() {
31893182
s.self$0();
3183+
}
3184+
"#,
3185+
);
3186+
}
3187+
3188+
#[test]
3189+
fn regression_21288() {
3190+
check_assist(
3191+
generate_function,
3192+
r#"
3193+
//- minicore: copy
3194+
fn foo() {
3195+
$0bar(&|x| true)
3196+
}
3197+
"#,
3198+
r#"
3199+
fn foo() {
3200+
bar(&|x| true)
3201+
}
3202+
3203+
fn bar(arg: impl Fn(_) -> bool) {
3204+
${0:todo!()}
31903205
}
31913206
"#,
31923207
);

crates/ide-assists/src/handlers/generate_getter_or_setter.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -226,15 +226,15 @@ fn generate_getter_from_info(
226226
)
227227
} else {
228228
(|| {
229-
let krate = ctx.sema.scope(record_field_info.field_ty.syntax())?.krate();
230-
let famous_defs = &FamousDefs(&ctx.sema, krate);
229+
let module = ctx.sema.scope(record_field_info.field_ty.syntax())?.module();
230+
let famous_defs = &FamousDefs(&ctx.sema, module.krate(ctx.db()));
231231
ctx.sema
232232
.resolve_type(&record_field_info.field_ty)
233233
.and_then(|ty| convert_reference_type(ty, ctx.db(), famous_defs))
234234
.map(|conversion| {
235235
cov_mark::hit!(convert_reference_type);
236236
(
237-
conversion.convert_type(ctx.db(), krate.to_display_target(ctx.db())),
237+
conversion.convert_type(ctx.db(), module),
238238
conversion.getter(record_field_info.field_name.to_string()),
239239
)
240240
})

crates/ide-assists/src/utils.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use std::slice;
44

55
pub(crate) use gen_trait_fn_body::gen_trait_fn_body;
66
use hir::{
7-
DisplayTarget, HasAttrs as HirHasAttrs, HirDisplay, InFile, ModuleDef, PathResolution,
8-
Semantics,
7+
HasAttrs as HirHasAttrs, HirDisplay, InFile, ModuleDef, PathResolution, Semantics,
98
db::{ExpandDatabase, HirDatabase},
109
};
1110
use ide_db::{
@@ -836,22 +835,21 @@ enum ReferenceConversionType {
836835
}
837836

838837
impl<'db> ReferenceConversion<'db> {
839-
pub(crate) fn convert_type(
840-
&self,
841-
db: &'db dyn HirDatabase,
842-
display_target: DisplayTarget,
843-
) -> ast::Type {
838+
pub(crate) fn convert_type(&self, db: &'db dyn HirDatabase, module: hir::Module) -> ast::Type {
844839
let ty = match self.conversion {
845-
ReferenceConversionType::Copy => self.ty.display(db, display_target).to_string(),
840+
ReferenceConversionType::Copy => self
841+
.ty
842+
.display_source_code(db, module.into(), true)
843+
.unwrap_or_else(|_| "_".to_owned()),
846844
ReferenceConversionType::AsRefStr => "&str".to_owned(),
847845
ReferenceConversionType::AsRefSlice => {
848846
let type_argument_name = self
849847
.ty
850848
.type_arguments()
851849
.next()
852850
.unwrap()
853-
.display(db, display_target)
854-
.to_string();
851+
.display_source_code(db, module.into(), true)
852+
.unwrap_or_else(|_| "_".to_owned());
855853
format!("&[{type_argument_name}]")
856854
}
857855
ReferenceConversionType::Dereferenced => {
@@ -860,8 +858,8 @@ impl<'db> ReferenceConversion<'db> {
860858
.type_arguments()
861859
.next()
862860
.unwrap()
863-
.display(db, display_target)
864-
.to_string();
861+
.display_source_code(db, module.into(), true)
862+
.unwrap_or_else(|_| "_".to_owned());
865863
format!("&{type_argument_name}")
866864
}
867865
ReferenceConversionType::Option => {
@@ -870,16 +868,22 @@ impl<'db> ReferenceConversion<'db> {
870868
.type_arguments()
871869
.next()
872870
.unwrap()
873-
.display(db, display_target)
874-
.to_string();
871+
.display_source_code(db, module.into(), true)
872+
.unwrap_or_else(|_| "_".to_owned());
875873
format!("Option<&{type_argument_name}>")
876874
}
877875
ReferenceConversionType::Result => {
878876
let mut type_arguments = self.ty.type_arguments();
879-
let first_type_argument_name =
880-
type_arguments.next().unwrap().display(db, display_target).to_string();
881-
let second_type_argument_name =
882-
type_arguments.next().unwrap().display(db, display_target).to_string();
877+
let first_type_argument_name = type_arguments
878+
.next()
879+
.unwrap()
880+
.display_source_code(db, module.into(), true)
881+
.unwrap_or_else(|_| "_".to_owned());
882+
let second_type_argument_name = type_arguments
883+
.next()
884+
.unwrap()
885+
.display_source_code(db, module.into(), true)
886+
.unwrap_or_else(|_| "_".to_owned());
883887
format!("Result<&{first_type_argument_name}, &{second_type_argument_name}>")
884888
}
885889
};

0 commit comments

Comments
 (0)