@@ -140,7 +140,7 @@ pub use {
140
140
display:: { ClosureStyle , HirDisplay , HirDisplayError , HirWrite } ,
141
141
layout:: LayoutError ,
142
142
mir:: { MirEvalError , MirLowerError } ,
143
- PointerCast , Safety ,
143
+ FnAbi , PointerCast , Safety ,
144
144
} ,
145
145
// FIXME: Properly encapsulate mir
146
146
hir_ty:: { mir, Interner as ChalkTyInterner } ,
@@ -2227,7 +2227,7 @@ impl Param {
2227
2227
let InFile { file_id, value } = Function { id : func } . source ( db) ?;
2228
2228
let params = value. param_list ( ) ?;
2229
2229
if let Some ( self_param) = params. self_param ( ) {
2230
- if let Some ( idx) = self . idx . checked_sub ( 1 as usize ) {
2230
+ if let Some ( idx) = self . idx . checked_sub ( 1 ) {
2231
2231
params. params ( ) . nth ( idx) . map ( Either :: Right )
2232
2232
} else {
2233
2233
Some ( Either :: Left ( self_param) )
@@ -4321,23 +4321,26 @@ impl Type {
4321
4321
TyKind :: Function ( _) => Callee :: FnPtr ,
4322
4322
TyKind :: FnDef ( ..) => Callee :: Def ( self . ty . callable_def ( db) ?) ,
4323
4323
kind => {
4324
- // This branch shouldn't be necessary?
4325
- if let TyKind :: Ref ( _, _, ty) = kind {
4326
- if let TyKind :: Closure ( closure, subst) = ty. kind ( Interner ) {
4327
- let sig = ty. callable_sig ( db) ?;
4328
- return Some ( Callable {
4329
- ty : self . clone ( ) ,
4330
- sig,
4331
- callee : Callee :: Closure ( * closure, subst. clone ( ) ) ,
4332
- is_bound_method : false ,
4333
- } ) ;
4334
- }
4324
+ // This will happen when it implements fn or fn mut, since we add an autoborrow adjustment
4325
+ let ( ty, kind) = if let TyKind :: Ref ( _, _, ty) = kind {
4326
+ ( ty, ty. kind ( Interner ) )
4327
+ } else {
4328
+ ( & self . ty , kind)
4329
+ } ;
4330
+ if let TyKind :: Closure ( closure, subst) = kind {
4331
+ let sig = ty. callable_sig ( db) ?;
4332
+ return Some ( Callable {
4333
+ ty : self . clone ( ) ,
4334
+ sig,
4335
+ callee : Callee :: Closure ( * closure, subst. clone ( ) ) ,
4336
+ is_bound_method : false ,
4337
+ } ) ;
4335
4338
}
4336
- let sig = hir_ty:: callable_sig_from_fnonce ( & self . ty , self . env . clone ( ) , db) ?;
4339
+ let ( fn_trait , sig) = hir_ty:: callable_sig_from_fn_trait ( ty, self . env . clone ( ) , db) ?;
4337
4340
return Some ( Callable {
4338
4341
ty : self . clone ( ) ,
4339
4342
sig,
4340
- callee : Callee :: Other ,
4343
+ callee : Callee :: FnImpl ( fn_trait ) ,
4341
4344
is_bound_method : false ,
4342
4345
} ) ;
4343
4346
}
@@ -4968,7 +4971,7 @@ enum Callee {
4968
4971
Def ( CallableDefId ) ,
4969
4972
Closure ( ClosureId , Substitution ) ,
4970
4973
FnPtr ,
4971
- Other ,
4974
+ FnImpl ( FnTrait ) ,
4972
4975
}
4973
4976
4974
4977
pub enum CallableKind {
@@ -4977,8 +4980,7 @@ pub enum CallableKind {
4977
4980
TupleEnumVariant ( Variant ) ,
4978
4981
Closure ( Closure ) ,
4979
4982
FnPtr ,
4980
- /// Some other type that implements `FnOnce`.
4981
- Other ,
4983
+ FnImpl ( FnTrait ) ,
4982
4984
}
4983
4985
4984
4986
impl Callable {
@@ -4993,7 +4995,7 @@ impl Callable {
4993
4995
CallableKind :: Closure ( Closure { id, subst : subst. clone ( ) } )
4994
4996
}
4995
4997
Callee :: FnPtr => CallableKind :: FnPtr ,
4996
- Callee :: Other => CallableKind :: Other ,
4998
+ Callee :: FnImpl ( fn_ ) => CallableKind :: FnImpl ( fn_ ) ,
4997
4999
}
4998
5000
}
4999
5001
pub fn receiver_param ( & self , db : & dyn HirDatabase ) -> Option < ( SelfParam , Type ) > {
@@ -5023,6 +5025,10 @@ impl Callable {
5023
5025
pub fn sig ( & self ) -> & CallableSig {
5024
5026
& self . sig
5025
5027
}
5028
+
5029
+ pub fn ty ( & self ) -> & Type {
5030
+ & self . ty
5031
+ }
5026
5032
}
5027
5033
5028
5034
#[ derive( Clone , Debug , Eq , PartialEq ) ]
0 commit comments