Skip to content

Commit

Permalink
Merge pull request #18986 from Veykril/push-zlwvwlowpzqm
Browse files Browse the repository at this point in the history
Goto `Display::fmt` when invoked on `to_string`
  • Loading branch information
Veykril authored Jan 21, 2025
2 parents 8db3331 + a3eee10 commit 2c040c0
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 0 deletions.
2 changes: 2 additions & 0 deletions crates/hir/src/semantics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1483,6 +1483,8 @@ impl<'db> SemanticsImpl<'db> {
self.analyze(try_expr.syntax())?.resolve_try_expr(self.db, try_expr)
}

// This does not resolve the method call to the correct trait impl!
// We should probably fix that.
pub fn resolve_method_call_as_callable(&self, call: &ast::MethodCallExpr) -> Option<Callable> {
self.analyze(call.syntax())?.resolve_method_call_as_callable(self.db, call)
}
Expand Down
7 changes: 7 additions & 0 deletions crates/ide-db/src/famous_defs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,13 @@ impl FamousDefs<'_, '_> {
self.find_macro("core:unimplemented")
}

pub fn core_fmt_Display(&self) -> Option<Trait> {
self.find_trait("core:fmt:Display")
}

pub fn alloc_string_ToString(&self) -> Option<Trait> {
self.find_trait("alloc:string:ToString")
}
pub fn builtin_crates(&self) -> impl Iterator<Item = Crate> {
IntoIterator::into_iter([
self.std(),
Expand Down
39 changes: 39 additions & 0 deletions crates/ide/src/goto_definition.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,15 @@ fn find_definition_for_known_blanket_dual_impls(
// Extract the `T` from `Result<T, ..>`
[return_type.type_arguments().next()?, callable.receiver_param(sema.db)?.1],
)?
} else if fn_name == sym::to_string && fd.alloc_string_ToString() == Some(t) {
let dual = fd.core_fmt_Display()?;
let dual_f = dual.function(sema.db, &sym::fmt)?;
sema.resolve_trait_impl_method(
return_type.clone(),
dual,
dual_f,
[callable.receiver_param(sema.db)?.1.strip_reference()],
)?
} else {
return None;
};
Expand Down Expand Up @@ -3231,6 +3240,36 @@ impl FromStr for A {
}
fn f() {
let a: Result<A, _> = "aaaaaa".parse$0();
}
"#,
);
}

#[test]
fn to_string_call_to_display_definition() {
check(
r#"
//- minicore:fmt
//- /alloc.rs crate:alloc
pub mod string {
pub struct String;
pub trait ToString {
fn to_string(&self) -> String;
}
impl<T: core::fmt::Display> ToString for T {
fn to_string(&self) -> String { String }
}
}
//- /lib.rs crate:lib deps:alloc
use alloc::string::ToString;
struct A;
impl core::fmt::Display for A {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {}
// ^^^
}
fn f() {
A.to_string$0();
}
"#,
);
Expand Down
1 change: 1 addition & 0 deletions crates/intern/src/symbol/symbols.rs
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ define_symbols! {
test,
then,
thiscall,
to_string,
trace_macros,
transmute_opts,
transmute_trait,
Expand Down

0 comments on commit 2c040c0

Please sign in to comment.