Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/unresolved_method.rs')
-rw-r--r--crates/ide-diagnostics/src/handlers/unresolved_method.rs30
1 files changed, 11 insertions, 19 deletions
diff --git a/crates/ide-diagnostics/src/handlers/unresolved_method.rs b/crates/ide-diagnostics/src/handlers/unresolved_method.rs
index 93caf281f0..01929a5144 100644
--- a/crates/ide-diagnostics/src/handlers/unresolved_method.rs
+++ b/crates/ide-diagnostics/src/handlers/unresolved_method.rs
@@ -129,25 +129,17 @@ fn assoc_func_fix(
let receiver_type = &ctx.sema.type_of_expr(&receiver)?.original;
let assoc_fn_params = f.assoc_fn_params(db);
- let need_to_take_receiver_as_first_arg = if assoc_fn_params.is_empty() {
- false
- } else {
- assoc_fn_params
- .first()
- .map(|first_arg| {
- // For generic type, say `Box`, take `Box::into_raw(b: Self)` as example,
- // type of `b` is `Self`, which is `Box<T, A>`, containing unspecified generics.
- // However, type of `receiver` is specified, it could be `Box<i32, Global>` or something like that,
- // so `first_arg.ty() == receiver_type` evaluate to `false` here.
- // Here add `first_arg.ty().as_adt() == receiver_type.as_adt()` as guard,
- // apply `.as_adt()` over `Box<T, A>` or `Box<i32, Global>` gets `Box`, so we get `true` here.
-
- // FIXME: it fails when type of `b` is `Box` with other generic param different from `receiver`
- first_arg.ty() == receiver_type
- || first_arg.ty().as_adt() == receiver_type.as_adt()
- })
- .unwrap_or(false)
- };
+ let need_to_take_receiver_as_first_arg = assoc_fn_params.first().is_some_and(|first_arg| {
+ // For generic type, say `Box`, take `Box::into_raw(b: Self)` as example,
+ // type of `b` is `Self`, which is `Box<T, A>`, containing unspecified generics.
+ // However, type of `receiver` is specified, it could be `Box<i32, Global>` or something like that,
+ // so `first_arg.ty() == receiver_type` evaluate to `false` here.
+ // Here add `first_arg.ty().as_adt() == receiver_type.as_adt()` as guard,
+ // apply `.as_adt()` over `Box<T, A>` or `Box<i32, Global>` gets `Box`, so we get `true` here.
+
+ // FIXME: it fails when type of `b` is `Box` with other generic param different from `receiver`
+ first_arg.ty() == receiver_type || first_arg.ty().as_adt() == receiver_type.as_adt()
+ });
let mut receiver_type_adt_name =
receiver_type.as_adt()?.name(db).display_no_db(ctx.edition).to_smolstr();