Skip to content

Commit ffbe31b

Browse files
committed
Rust: Extract SelfParams from crate graph
1 parent c11ed6d commit ffbe31b

File tree

1 file changed

+37
-8
lines changed

1 file changed

+37
-8
lines changed

rust/extractor/src/crate_graph.rs

+37-8
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)