@@ -141,15 +141,35 @@ fn find_definition_for_known_blanket_dual_impls(
141141 let method_call = ast:: MethodCallExpr :: cast ( original_token. parent ( ) ?. parent ( ) ?) ?;
142142 let callable = sema. resolve_method_call_as_callable ( & method_call) ?;
143143 let CallableKind :: Function ( f) = callable. kind ( ) else { return None } ;
144- let t = f. as_assoc_item ( sema . db ) ? . container_trait ( sema. db ) ?;
144+ let assoc = f. as_assoc_item ( sema. db ) ?;
145145
146146 let return_type = callable. return_type ( ) ;
147147 let fd = FamousDefs ( sema, return_type. krate ( sema. db ) ) ;
148+
149+ let t = match assoc. container ( sema. db ) {
150+ hir:: AssocItemContainer :: Trait ( t) => t,
151+ hir:: AssocItemContainer :: Impl ( impl_)
152+ if impl_. self_ty ( sema. db ) . is_str ( ) && f. name ( sema. db ) == sym:: parse =>
153+ {
154+ let t = fd. core_convert_FromStr ( ) ?;
155+ let t_f = t. function ( sema. db , & sym:: from_str) ?;
156+ return sema
157+ . resolve_trait_impl_method (
158+ return_type. clone ( ) ,
159+ t,
160+ t_f,
161+ [ return_type. type_arguments ( ) . next ( ) ?] ,
162+ )
163+ . map ( |f| def_to_nav ( sema. db , f. into ( ) ) ) ;
164+ }
165+ hir:: AssocItemContainer :: Impl ( _) => return None ,
166+ } ;
167+
148168 let fn_name = f. name ( sema. db ) ;
149169 let f = if fn_name == sym:: into && fd. core_convert_Into ( ) == Some ( t) {
150170 let dual = fd. core_convert_From ( ) ?;
151171 let dual_f = dual. function ( sema. db , & sym:: from) ?;
152- sema. resolve_impl_method (
172+ sema. resolve_trait_impl_method (
153173 return_type. clone ( ) ,
154174 dual,
155175 dual_f,
@@ -158,7 +178,7 @@ fn find_definition_for_known_blanket_dual_impls(
158178 } else if fn_name == sym:: try_into && fd. core_convert_TryInto ( ) == Some ( t) {
159179 let dual = fd. core_convert_TryFrom ( ) ?;
160180 let dual_f = dual. function ( sema. db , & sym:: try_from) ?;
161- sema. resolve_impl_method (
181+ sema. resolve_trait_impl_method (
162182 return_type. clone ( ) ,
163183 dual,
164184 dual_f,
@@ -3191,6 +3211,26 @@ impl TryInto<B> for A {
31913211fn f() {
31923212 let a = A;
31933213 let b: Result<B, _> = a.try_into$0();
3214+ }
3215+ "# ,
3216+ ) ;
3217+ }
3218+
3219+ #[ test]
3220+ fn parse_call_to_from_str_definition ( ) {
3221+ check (
3222+ r#"
3223+ //- minicore: from, str
3224+ struct A;
3225+ impl FromStr for A {
3226+ type Error = String;
3227+ fn from_str(value: &str) -> Result<Self, Self::Error> {
3228+ //^^^^^^^^
3229+ Ok(A)
3230+ }
3231+ }
3232+ fn f() {
3233+ let a: Result<A, _> = "aaaaaa".parse$0();
31943234}
31953235 "# ,
31963236 ) ;
0 commit comments