@@ -383,25 +383,54 @@ fn emit_function(
383
383
assert_eq ! ( sig. binders. len( Interner ) , parameters. len( ) ) ;
384
384
let sig = sig. skip_binders ( ) ;
385
385
let ty_vars = & [ parameters] ;
386
+ let function_data = db. function_data ( function) ;
387
+ let mut self_param = None ;
386
388
let params = sig
387
389
. params ( )
388
390
. iter ( )
389
- . map ( |p| {
391
+ . enumerate ( )
392
+ . filter_map ( |( idx, p) | {
390
393
let type_repr = emit_hir_ty ( trap, db, ty_vars, p) ;
391
- trap. emit ( generated:: Param {
392
- id : trap:: TrapId :: Star ,
393
- attrs : vec ! [ ] ,
394
- type_repr,
395
- pat : None ,
396
- } )
394
+
395
+ if idx == 0 && function_data. has_self_param ( ) {
396
+ // Check if the self parameter is a reference
397
+ let ( is_ref, is_mut) = match p. kind ( Interner ) {
398
+ chalk_ir:: TyKind :: Ref ( mutability, _, _) => {
399
+ ( true , matches ! ( mutability, chalk_ir:: Mutability :: Mut ) )
400
+ }
401
+ chalk_ir:: TyKind :: Raw ( mutability, _) => {
402
+ ( false , matches ! ( mutability, chalk_ir:: Mutability :: Mut ) )
403
+ }
404
+ _ => ( false , false ) ,
405
+ } ;
406
+
407
+ self_param = Some ( trap. emit ( generated:: SelfParam {
408
+ id : trap:: TrapId :: Star ,
409
+ attrs : vec ! [ ] ,
410
+ type_repr,
411
+ is_ref,
412
+ is_mut,
413
+ lifetime : None ,
414
+ name : None ,
415
+ } ) ) ;
416
+ None
417
+ } else {
418
+ Some ( trap. emit ( generated:: Param {
419
+ id : trap:: TrapId :: Star ,
420
+ attrs : vec ! [ ] ,
421
+ type_repr,
422
+ pat : None ,
423
+ } ) )
424
+ }
397
425
} )
398
426
. collect ( ) ;
399
427
400
428
let ret_type = emit_hir_ty ( trap, db, ty_vars, sig. ret ( ) ) ;
429
+
401
430
let param_list = trap. emit ( generated:: ParamList {
402
431
id : trap:: TrapId :: Star ,
403
432
params,
404
- self_param : None ,
433
+ self_param,
405
434
} ) ;
406
435
let ret_type = ret_type. map ( |ret_type| {
407
436
trap. emit ( generated:: RetTypeRepr {
0 commit comments