@@ -383,25 +383,54 @@ fn emit_function(
383383 assert_eq ! ( sig. binders. len( Interner ) , parameters. len( ) ) ;
384384 let sig = sig. skip_binders ( ) ;
385385 let ty_vars = & [ parameters] ;
386+ let function_data = db. function_data ( function) ;
387+ let mut self_param = None ;
386388 let params = sig
387389 . params ( )
388390 . iter ( )
389- . map ( |p| {
391+ . enumerate ( )
392+ . filter_map ( |( idx, p) | {
390393 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+ }
397425 } )
398426 . collect ( ) ;
399427
400428 let ret_type = emit_hir_ty ( trap, db, ty_vars, sig. ret ( ) ) ;
429+
401430 let param_list = trap. emit ( generated:: ParamList {
402431 id : trap:: TrapId :: Star ,
403432 params,
404- self_param : None ,
433+ self_param,
405434 } ) ;
406435 let ret_type = ret_type. map ( |ret_type| {
407436 trap. emit ( generated:: RetTypeRepr {
0 commit comments