Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir_def/src/generics.rs')
-rw-r--r--crates/hir_def/src/generics.rs54
1 files changed, 31 insertions, 23 deletions
diff --git a/crates/hir_def/src/generics.rs b/crates/hir_def/src/generics.rs
index 6d7b98f3b1..04b77894ae 100644
--- a/crates/hir_def/src/generics.rs
+++ b/crates/hir_def/src/generics.rs
@@ -24,8 +24,8 @@ use crate::{
keys,
src::{HasChildSource, HasSource},
type_ref::{LifetimeRef, TypeBound, TypeRef},
- AdtId, GenericDefId, HasModule, LifetimeParamId, LocalLifetimeParamId, LocalTypeOrConstParamId,
- Lookup, TypeOrConstParamId,
+ AdtId, ConstParamId, GenericDefId, HasModule, LifetimeParamId, LocalLifetimeParamId,
+ LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId,
};
/// Data about a generic type parameter (to a function, struct, impl, ...).
@@ -99,7 +99,7 @@ impl_from!(TypeParamData, ConstParamData for TypeOrConstParamData);
/// Data about the generic parameters of a function, struct, impl, etc.
#[derive(Clone, PartialEq, Eq, Debug, Default, Hash)]
pub struct GenericParams {
- pub tocs: Arena<TypeOrConstParamData>,
+ pub type_or_consts: Arena<TypeOrConstParamData>,
pub lifetimes: Arena<LifetimeParamData>,
pub where_predicates: Vec<WherePredicate>,
}
@@ -138,13 +138,14 @@ impl GenericParams {
pub fn type_iter<'a>(
&'a self,
) -> impl Iterator<Item = (Idx<TypeOrConstParamData>, &TypeParamData)> {
- self.tocs.iter().filter_map(|x| x.1.type_param().map(|y| (x.0, y)))
+ self.type_or_consts.iter().filter_map(|x| x.1.type_param().map(|y| (x.0, y)))
}
- pub fn toc_iter<'a>(
+ /// Iterator of type_or_consts field
+ pub fn iter<'a>(
&'a self,
- ) -> impl Iterator<Item = (Idx<TypeOrConstParamData>, &TypeOrConstParamData)> {
- self.tocs.iter()
+ ) -> impl DoubleEndedIterator<Item = (Idx<TypeOrConstParamData>, &TypeOrConstParamData)> {
+ self.type_or_consts.iter()
}
pub(crate) fn generic_params_query(
@@ -251,7 +252,7 @@ impl GenericParams {
default,
provenance: TypeParamProvenance::TypeParamList,
};
- self.tocs.alloc(param.into());
+ self.type_or_consts.alloc(param.into());
let type_ref = TypeRef::Path(name.into());
self.fill_bounds(lower_ctx, &type_param, Either::Left(type_ref));
}
@@ -261,7 +262,7 @@ impl GenericParams {
.ty()
.map_or(TypeRef::Error, |it| TypeRef::from_ast(lower_ctx, it));
let param = ConstParamData { name, ty: Interned::new(ty) };
- self.tocs.alloc(param.into());
+ self.type_or_consts.alloc(param.into());
}
}
}
@@ -348,7 +349,7 @@ impl GenericParams {
default: None,
provenance: TypeParamProvenance::ArgumentImplTrait,
};
- let param_id = self.tocs.alloc(param.into());
+ let param_id = self.type_or_consts.alloc(param.into());
for bound in bounds {
self.where_predicates.push(WherePredicate::TypeBound {
target: WherePredicateTypeTarget::TypeOrConstParam(param_id),
@@ -372,27 +373,34 @@ impl GenericParams {
}
pub(crate) fn shrink_to_fit(&mut self) {
- let Self { lifetimes, tocs: types, where_predicates } = self;
+ let Self { lifetimes, type_or_consts: types, where_predicates } = self;
lifetimes.shrink_to_fit();
types.shrink_to_fit();
where_predicates.shrink_to_fit();
}
- pub fn find_type_by_name(&self, name: &Name) -> Option<LocalTypeOrConstParamId> {
- self.tocs
- .iter()
- .filter(|x| matches!(x.1, TypeOrConstParamData::TypeParamData(_)))
- .find_map(|(id, p)| if p.name().as_ref() == Some(&name) { Some(id) } else { None })
+ pub fn find_type_by_name(&self, name: &Name, parent: GenericDefId) -> Option<TypeParamId> {
+ self.type_or_consts.iter().find_map(|(id, p)| {
+ if p.name().as_ref() == Some(&name) && p.type_param().is_some() {
+ Some(TypeParamId::from_unchecked(TypeOrConstParamId { local_id: id, parent }))
+ } else {
+ None
+ }
+ })
}
- pub fn find_type_or_const_by_name(&self, name: &Name) -> Option<LocalTypeOrConstParamId> {
- self.tocs
- .iter()
- .find_map(|(id, p)| if p.name().as_ref() == Some(&name) { Some(id) } else { None })
+ pub fn find_const_by_name(&self, name: &Name, parent: GenericDefId) -> Option<ConstParamId> {
+ self.type_or_consts.iter().find_map(|(id, p)| {
+ if p.name().as_ref() == Some(&name) && p.const_param().is_some() {
+ Some(ConstParamId::from_unchecked(TypeOrConstParamId { local_id: id, parent }))
+ } else {
+ None
+ }
+ })
}
pub fn find_trait_self_param(&self) -> Option<LocalTypeOrConstParamId> {
- self.tocs.iter().find_map(|(id, p)| {
+ self.type_or_consts.iter().find_map(|(id, p)| {
if let TypeOrConstParamData::TypeParamData(p) = p {
if p.provenance == TypeParamProvenance::TraitSelf {
Some(id)
@@ -451,7 +459,7 @@ impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId {
db: &dyn DefDatabase,
) -> InFile<ArenaMap<LocalTypeOrConstParamId, Self::Value>> {
let generic_params = db.generic_params(*self);
- let mut idx_iter = generic_params.tocs.iter().map(|(idx, _)| idx);
+ let mut idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
let (file_id, generic_params_list) = file_id_and_params_of(*self, db);
@@ -505,7 +513,7 @@ impl ChildBySource for GenericDefId {
}
let generic_params = db.generic_params(*self);
- let mut toc_idx_iter = generic_params.tocs.iter().map(|(idx, _)| idx);
+ let mut toc_idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
// For traits the first type index is `Self`, skip it.