Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir_ty/src/utils.rs')
-rw-r--r--crates/hir_ty/src/utils.rs44
1 files changed, 31 insertions, 13 deletions
diff --git a/crates/hir_ty/src/utils.rs b/crates/hir_ty/src/utils.rs
index cf8e284c62..a6706aa81d 100644
--- a/crates/hir_ty/src/utils.rs
+++ b/crates/hir_ty/src/utils.rs
@@ -203,12 +203,30 @@ impl Generics {
)
}
+ pub(crate) fn toc_iter<'a>(
+ &'a self,
+ ) -> impl Iterator<Item = (TypeOrConstParamId, &'a TypeOrConstParamData)> + 'a {
+ self.parent_generics
+ .as_ref()
+ .into_iter()
+ .flat_map(|it| {
+ it.params
+ .toc_iter()
+ .map(move |(local_id, p)| (TypeOrConstParamId { parent: it.def, local_id }, p))
+ })
+ .chain(
+ self.params.toc_iter().map(move |(local_id, p)| {
+ (TypeOrConstParamId { parent: self.def, local_id }, p)
+ }),
+ )
+ }
+
pub(crate) fn iter_parent<'a>(
&'a self,
) -> impl Iterator<Item = (TypeOrConstParamId, &'a TypeOrConstParamData)> + 'a {
self.parent_generics.as_ref().into_iter().flat_map(|it| {
it.params
- .types
+ .tocs
.iter()
.map(move |(local_id, p)| (TypeOrConstParamId { parent: it.def, local_id }, p))
})
@@ -221,36 +239,36 @@ impl Generics {
/// (total, parents, child)
pub(crate) fn len_split(&self) -> (usize, usize, usize) {
let parent = self.parent_generics.as_ref().map_or(0, |p| p.len());
- // FIXME: we should not filter const generics here, but at now it breaks tests
- let child = self.params.types.iter().filter_map(|x| x.1.type_param()).count();
+ let child = self.params.tocs.len();
(parent + child, parent, child)
}
- /// (parent total, self param, type param list, impl trait)
- pub(crate) fn provenance_split(&self) -> (usize, usize, usize, usize) {
+ /// (parent total, self param, type param list, const param list, impl trait)
+ pub(crate) fn provenance_split(&self) -> (usize, usize, usize, usize, usize) {
let parent = self.parent_generics.as_ref().map_or(0, |p| p.len());
let self_params = self
.params
- .types
+ .tocs
.iter()
.filter_map(|x| x.1.type_param())
.filter(|p| p.provenance == TypeParamProvenance::TraitSelf)
.count();
- let list_params = self
+ let type_params = self
.params
- .types
+ .tocs
.iter()
.filter_map(|x| x.1.type_param())
.filter(|p| p.provenance == TypeParamProvenance::TypeParamList)
.count();
+ let const_params = self.params.tocs.iter().filter_map(|x| x.1.const_param()).count();
let impl_trait_params = self
.params
- .types
+ .tocs
.iter()
.filter_map(|x| x.1.type_param())
.filter(|p| p.provenance == TypeParamProvenance::ArgumentImplTrait)
.count();
- (parent, self_params, list_params, impl_trait_params)
+ (parent, self_params, type_params, const_params, impl_trait_params)
}
pub(crate) fn param_idx(&self, param: TypeOrConstParamId) -> Option<usize> {
@@ -261,7 +279,7 @@ impl Generics {
if param.parent == self.def {
let (idx, (_local_id, data)) = self
.params
- .types
+ .tocs
.iter()
.enumerate()
.find(|(_, (idx, _))| *idx == param.local_id)
@@ -277,7 +295,7 @@ impl Generics {
pub(crate) fn bound_vars_subst(&self, debruijn: DebruijnIndex) -> Substitution {
Substitution::from_iter(
Interner,
- self.type_iter()
+ self.toc_iter()
.enumerate()
.map(|(idx, _)| TyKind::BoundVar(BoundVar::new(debruijn, idx)).intern(Interner)),
)
@@ -287,7 +305,7 @@ impl Generics {
pub(crate) fn type_params_subst(&self, db: &dyn HirDatabase) -> Substitution {
Substitution::from_iter(
Interner,
- self.type_iter().map(|(id, _)| {
+ self.toc_iter().map(|(id, _)| {
TyKind::Placeholder(crate::to_placeholder_idx(db, id)).intern(Interner)
}),
)