Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/generics.rs')
-rw-r--r--crates/hir-ty/src/generics.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/crates/hir-ty/src/generics.rs b/crates/hir-ty/src/generics.rs
index a96c101a38..89ca707c2e 100644
--- a/crates/hir-ty/src/generics.rs
+++ b/crates/hir-ty/src/generics.rs
@@ -225,6 +225,23 @@ impl Generics {
}
}
+pub(crate) fn trait_self_param_idx(db: &dyn DefDatabase, def: GenericDefId) -> Option<usize> {
+ match def {
+ GenericDefId::TraitId(_) | GenericDefId::TraitAliasId(_) => {
+ let params = db.generic_params(def);
+ params.trait_self_param().map(|idx| idx.into_raw().into_u32() as usize)
+ }
+ GenericDefId::ImplId(_) => None,
+ _ => {
+ let parent_def = parent_generic_def(db, def)?;
+ let parent_params = db.generic_params(parent_def);
+ let parent_self_idx = parent_params.trait_self_param()?.into_raw().into_u32() as usize;
+ let self_params = db.generic_params(def);
+ Some(self_params.len() + parent_self_idx)
+ }
+ }
+}
+
fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option<GenericDefId> {
let container = match def {
GenericDefId::FunctionId(it) => it.lookup(db).container,