@@ -1325,7 +1325,7 @@ impl Function {
1325
1325
/// Get this function's return type
1326
1326
pub fn ret_type ( self , db : & dyn HirDatabase ) -> Type {
1327
1327
let resolver = self . id . resolver ( db. upcast ( ) ) ;
1328
- let krate = self . id . lookup ( db. upcast ( ) ) . container . module ( db . upcast ( ) ) . krate ( ) ;
1328
+ let krate = self . krate_id ( db) ;
1329
1329
let ret_type = & db. function_data ( self . id ) . ret_type ;
1330
1330
let ctx = hir_ty:: TyLoweringContext :: new ( db, & resolver) ;
1331
1331
let ty = ctx. lower_ty ( ret_type) ;
@@ -1341,7 +1341,7 @@ impl Function {
1341
1341
1342
1342
pub fn assoc_fn_params ( self , db : & dyn HirDatabase ) -> Vec < Param > {
1343
1343
let resolver = self . id . resolver ( db. upcast ( ) ) ;
1344
- let krate = self . id . lookup ( db. upcast ( ) ) . container . module ( db . upcast ( ) ) . krate ( ) ;
1344
+ let krate = self . krate_id ( db) ;
1345
1345
let ctx = hir_ty:: TyLoweringContext :: new ( db, & resolver) ;
1346
1346
let environment = db. trait_environment ( self . id . into ( ) ) ;
1347
1347
db. function_data ( self . id )
@@ -1359,9 +1359,25 @@ impl Function {
1359
1359
if self . self_param ( db) . is_none ( ) {
1360
1360
return None ;
1361
1361
}
1362
- let mut res = self . assoc_fn_params ( db) ;
1363
- res. remove ( 0 ) ;
1364
- Some ( res)
1362
+ Some ( self . params_without_self ( db) )
1363
+ }
1364
+
1365
+ pub fn params_without_self ( self , db : & dyn HirDatabase ) -> Vec < Param > {
1366
+ let resolver = self . id . resolver ( db. upcast ( ) ) ;
1367
+ let krate = self . krate_id ( db) ;
1368
+ let ctx = hir_ty:: TyLoweringContext :: new ( db, & resolver) ;
1369
+ let environment = db. trait_environment ( self . id . into ( ) ) ;
1370
+ let skip = if db. function_data ( self . id ) . has_self_param ( ) { 1 } else { 0 } ;
1371
+ db. function_data ( self . id )
1372
+ . params
1373
+ . iter ( )
1374
+ . enumerate ( )
1375
+ . skip ( skip)
1376
+ . map ( |( idx, ( _, type_ref) ) | {
1377
+ let ty = Type { krate, env : environment. clone ( ) , ty : ctx. lower_ty ( type_ref) } ;
1378
+ Param { func : self , ty, idx }
1379
+ } )
1380
+ . collect ( )
1365
1381
}
1366
1382
1367
1383
pub fn is_unsafe ( self , db : & dyn HirDatabase ) -> bool {
@@ -1410,6 +1426,10 @@ impl Function {
1410
1426
1411
1427
result
1412
1428
}
1429
+
1430
+ fn krate_id ( self , db : & dyn HirDatabase ) -> CrateId {
1431
+ self . id . lookup ( db. upcast ( ) ) . module ( db. upcast ( ) ) . krate ( )
1432
+ }
1413
1433
}
1414
1434
1415
1435
// Note: logically, this belongs to `hir_ty`, but we are not using it there yet.
0 commit comments