aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/utils.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/utils.rs')
-rw-r--r--crates/ra_hir_ty/src/utils.rs14
1 files changed, 13 insertions, 1 deletions
diff --git a/crates/ra_hir_ty/src/utils.rs b/crates/ra_hir_ty/src/utils.rs
index 314a3241f..f116b95e7 100644
--- a/crates/ra_hir_ty/src/utils.rs
+++ b/crates/ra_hir_ty/src/utils.rs
@@ -5,7 +5,7 @@ use std::sync::Arc;
5use hir_def::{ 5use hir_def::{
6 adt::VariantData, 6 adt::VariantData,
7 db::DefDatabase, 7 db::DefDatabase,
8 generics::{GenericParams, TypeParamData}, 8 generics::{GenericParams, TypeParamData, TypeParamProvenance},
9 path::Path, 9 path::Path,
10 resolver::{HasResolver, TypeNs}, 10 resolver::{HasResolver, TypeNs},
11 type_ref::TypeRef, 11 type_ref::TypeRef,
@@ -117,19 +117,31 @@ impl Generics {
117 pub(crate) fn len(&self) -> usize { 117 pub(crate) fn len(&self) -> usize {
118 self.len_split().0 118 self.len_split().0
119 } 119 }
120
120 /// (total, parents, child) 121 /// (total, parents, child)
121 pub(crate) fn len_split(&self) -> (usize, usize, usize) { 122 pub(crate) fn len_split(&self) -> (usize, usize, usize) {
122 let parent = self.parent_generics.as_ref().map_or(0, |p| p.len()); 123 let parent = self.parent_generics.as_ref().map_or(0, |p| p.len());
123 let child = self.params.types.len(); 124 let child = self.params.types.len();
124 (parent + child, parent, child) 125 (parent + child, parent, child)
125 } 126 }
127
128 /// (self, type param list, impl trait)
129 pub(crate) fn provenance_split(&self) -> (usize, usize, usize) {
130 let self_params = self.params.types.iter().filter(|(_, p)| p.provenance == TypeParamProvenance::TraitSelf).count();
131 let list_params = self.params.types.iter().filter(|(_, p)| p.provenance == TypeParamProvenance::TypeParamList).count();
132 let impl_trait_params = self.params.types.iter().filter(|(_, p)| p.provenance == TypeParamProvenance::ArgumentImplTrait).count();
133 (self_params, list_params, impl_trait_params)
134 }
135
126 pub(crate) fn param_idx(&self, param: TypeParamId) -> u32 { 136 pub(crate) fn param_idx(&self, param: TypeParamId) -> u32 {
127 self.find_param(param).0 137 self.find_param(param).0
128 } 138 }
139
129 pub(crate) fn param_name(&self, param: TypeParamId) -> Name { 140 pub(crate) fn param_name(&self, param: TypeParamId) -> Name {
130 // FIXME make this return Option 141 // FIXME make this return Option
131 self.find_param(param).1.name.clone().unwrap_or_else(Name::missing) 142 self.find_param(param).1.name.clone().unwrap_or_else(Name::missing)
132 } 143 }
144
133 fn find_param(&self, param: TypeParamId) -> (u32, &TypeParamData) { 145 fn find_param(&self, param: TypeParamId) -> (u32, &TypeParamData) {
134 if param.parent == self.def { 146 if param.parent == self.def {
135 let (idx, (_local_id, data)) = self 147 let (idx, (_local_id, data)) = self