@@ -141,15 +141,35 @@ fn find_definition_for_known_blanket_dual_impls(
141
141
let method_call = ast:: MethodCallExpr :: cast ( original_token. parent ( ) ?. parent ( ) ?) ?;
142
142
let callable = sema. resolve_method_call_as_callable ( & method_call) ?;
143
143
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 ) ?;
145
145
146
146
let return_type = callable. return_type ( ) ;
147
147
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
+
148
168
let fn_name = f. name ( sema. db ) ;
149
169
let f = if fn_name == sym:: into && fd. core_convert_Into ( ) == Some ( t) {
150
170
let dual = fd. core_convert_From ( ) ?;
151
171
let dual_f = dual. function ( sema. db , & sym:: from) ?;
152
- sema. resolve_impl_method (
172
+ sema. resolve_trait_impl_method (
153
173
return_type. clone ( ) ,
154
174
dual,
155
175
dual_f,
@@ -158,7 +178,7 @@ fn find_definition_for_known_blanket_dual_impls(
158
178
} else if fn_name == sym:: try_into && fd. core_convert_TryInto ( ) == Some ( t) {
159
179
let dual = fd. core_convert_TryFrom ( ) ?;
160
180
let dual_f = dual. function ( sema. db , & sym:: try_from) ?;
161
- sema. resolve_impl_method (
181
+ sema. resolve_trait_impl_method (
162
182
return_type. clone ( ) ,
163
183
dual,
164
184
dual_f,
@@ -3191,6 +3211,26 @@ impl TryInto<B> for A {
3191
3211
fn f() {
3192
3212
let a = A;
3193
3213
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();
3194
3234
}
3195
3235
"# ,
3196
3236
) ;
0 commit comments