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.rs | 35 |
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. |