Repository: rust
Issue: When `.into` used, but it doesn't exist but `.try_into()` is available, suggest using `try_into()`
Labels: C-enhancement,A-diagnostics,T-compiler,D-papercut

<!--
Thank you for filing a bug report! 🐛 Please provide a short summary of the bug,
along with any information you feel relevant to replicating the bug.

If you cannot produce a minimal reproduction case (something that would work in
isolation), please provide the steps or even link to a repository that causes
the problematic output to occur.
-->

Given the following code: <!-- Please provide a link to play.rust-lang.org -->
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=f625bf004abe28d4c42c3c256d8f2aa2

```rust
struct Foo {
    bar: u32,
}

#[derive(Debug, Clone)]
struct Error;

impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.write_str("Number must be positive")
    }
}

impl TryFrom<i32> for Foo {
    type Error = Error;

    fn try_from(value: i32) -> Result<Self, Self::Error> {
        if value < 0 {
            Err(Error)
        } else {
            Ok(Self { bar: value as u32 })
        }
    }
}

fn main() {
    let foobar: Foo = 4.into();
}
```

The current output is:

```
error[[E0277]](https://doc.rust-lang.org/stable/error-index.html#E0277): the trait bound `Foo: From<{integer}>` is not satisfied
  --> src/main.rs:27:25
   |
27 |     let foobar: Foo = 4.into();
   |                         ^^^^ the trait `From<{integer}>` is not implemented for `Foo`
   |
   = note: required because of the requirements on the impl of `Into<Foo>` for `{integer}`

For more information about this error, try `rustc --explain E0277`.
```

<!-- The following is not always necessary. -->
Ideally the output should look like:

```
error[[E0277]](https://doc.rust-lang.org/stable/error-index.html#E0277): the trait bound `Foo: From<{integer}>` is not satisfied
  --> src/main.rs:27:25
   |
27 |     let foobar: Foo = 4.into();
   |                         ^^^^ the trait `From<{integer}>` is not implemented for `Foo`
   |
   = note: required because of the requirements on the impl of `Into<Foo>` for `{integer}`
   = note: `TryFrom<{integer}>` is implemented. Try using `4.try_into()` instead

For more information about this error, try `rustc --explain E0277`.
```

<!--
If the problem is not self-explanatory, please provide a rationale for the
change.
-->
When an users uses `.into()` and it doesnt work, they might do an complicated workaround while not realising the libray devs implemented `TryFrom<T>` instead. So it would be cool if the compiler could check if  the struct implements TryFrom instead and suggest try_into() (So it can be automatically fixed by lsp)

It should work the other way around (`.try_into()` used but `.into()` avaiable) and `Foo::from()`/`Foo::try_from()`
<!--
If dramatically different output is caused by small changes, consider also
adding them here.

If you're using the stable version of the compiler, you should also check if the
bug also exists in the beta or nightly versions. The output might also be
different depending on the Edition.
-->


<!-- TRIAGEBOT_START -->

<!-- TRIAGEBOT_ASSIGN_START -->

<!-- TRIAGEBOT_ASSIGN_DATA_START$${"user":"Absobel"}$$TRIAGEBOT_ASSIGN_DATA_END -->

<!-- TRIAGEBOT_ASSIGN_END -->
<!-- TRIAGEBOT_END -->