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.rs35
1 files changed, 24 insertions, 11 deletions
diff --git a/crates/hir_def/src/generics.rs b/crates/hir_def/src/generics.rs
index b5a11a1ba5..60d79f1473 100644
--- a/crates/hir_def/src/generics.rs
+++ b/crates/hir_def/src/generics.rs
@@ -77,6 +77,13 @@ impl TypeOrConstParamData {
}
}
+ pub fn const_param(&self) -> Option<&ConstParamData> {
+ match self {
+ TypeOrConstParamData::TypeParamData(_) => None,
+ TypeOrConstParamData::ConstParamData(x) => Some(x),
+ }
+ }
+
pub fn is_trait_self(&self) -> bool {
match self {
TypeOrConstParamData::TypeParamData(x) => {
@@ -92,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 types: Arena<TypeOrConstParamData>,
+ pub tocs: Arena<TypeOrConstParamData>,
pub lifetimes: Arena<LifetimeParamData>,
pub where_predicates: Vec<WherePredicate>,
}
@@ -131,7 +138,13 @@ impl GenericParams {
pub fn type_iter<'a>(
&'a self,
) -> impl Iterator<Item = (Idx<TypeOrConstParamData>, &TypeParamData)> {
- self.types.iter().filter_map(|x| x.1.type_param().map(|y| (x.0, y)))
+ self.tocs.iter().filter_map(|x| x.1.type_param().map(|y| (x.0, y)))
+ }
+
+ pub fn toc_iter<'a>(
+ &'a self,
+ ) -> impl Iterator<Item = (Idx<TypeOrConstParamData>, &TypeOrConstParamData)> {
+ self.tocs.iter()
}
pub(crate) fn generic_params_query(
@@ -238,7 +251,7 @@ impl GenericParams {
default,
provenance: TypeParamProvenance::TypeParamList,
};
- self.types.alloc(param.into());
+ self.tocs.alloc(param.into());
let type_ref = TypeRef::Path(name.into());
self.fill_bounds(lower_ctx, &type_param, Either::Left(type_ref));
}
@@ -248,7 +261,7 @@ impl GenericParams {
.ty()
.map_or(TypeRef::Error, |it| TypeRef::from_ast(lower_ctx, it));
let param = ConstParamData { name, ty: Interned::new(ty) };
- self.types.alloc(param.into());
+ self.tocs.alloc(param.into());
}
}
}
@@ -335,7 +348,7 @@ impl GenericParams {
default: None,
provenance: TypeParamProvenance::ArgumentImplTrait,
};
- let param_id = self.types.alloc(param.into());
+ let param_id = self.tocs.alloc(param.into());
for bound in bounds {
self.where_predicates.push(WherePredicate::TypeBound {
target: WherePredicateTypeTarget::TypeOrConstParam(param_id),
@@ -359,27 +372,27 @@ impl GenericParams {
}
pub(crate) fn shrink_to_fit(&mut self) {
- let Self { lifetimes, types, where_predicates } = self;
+ let Self { lifetimes, tocs: 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.types
+ 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_or_const_by_name(&self, name: &Name) -> Option<LocalTypeOrConstParamId> {
- self.types
+ self.tocs
.iter()
.find_map(|(id, p)| if p.name().as_ref() == Some(&name) { Some(id) } else { None })
}
pub fn find_trait_self_param(&self) -> Option<LocalTypeOrConstParamId> {
- self.types.iter().find_map(|(id, p)| {
+ self.tocs.iter().find_map(|(id, p)| {
if let TypeOrConstParamData::TypeParamData(p) = p {
if p.provenance == TypeParamProvenance::TraitSelf {
Some(id)
@@ -438,7 +451,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.types.iter().map(|(idx, _)| idx);
+ let mut idx_iter = generic_params.tocs.iter().map(|(idx, _)| idx);
let (file_id, generic_params_list) = file_id_and_params_of(*self, db);
@@ -492,7 +505,7 @@ impl ChildBySource for GenericDefId {
}
let generic_params = db.generic_params(*self);
- let mut toc_idx_iter = generic_params.types.iter().map(|(idx, _)| idx);
+ let mut toc_idx_iter = generic_params.tocs.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.