aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/generics.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/generics.rs')
-rw-r--r--crates/hir_def/src/generics.rs38
1 files changed, 26 insertions, 12 deletions
diff --git a/crates/hir_def/src/generics.rs b/crates/hir_def/src/generics.rs
index 81912a454..924046435 100644
--- a/crates/hir_def/src/generics.rs
+++ b/crates/hir_def/src/generics.rs
@@ -19,7 +19,7 @@ use crate::{
19 db::DefDatabase, 19 db::DefDatabase,
20 dyn_map::DynMap, 20 dyn_map::DynMap,
21 keys, 21 keys,
22 src::HasSource, 22 src::{HasChildSource, HasSource},
23 type_ref::{LifetimeRef, TypeBound, TypeRef}, 23 type_ref::{LifetimeRef, TypeBound, TypeRef},
24 AdtId, GenericDefId, LifetimeParamId, LocalLifetimeParamId, LocalTypeParamId, Lookup, 24 AdtId, GenericDefId, LifetimeParamId, LocalLifetimeParamId, LocalTypeParamId, Lookup,
25 TypeParamId, 25 TypeParamId,
@@ -73,9 +73,9 @@ pub enum WherePredicateTypeTarget {
73} 73}
74 74
75#[derive(Default)] 75#[derive(Default)]
76pub struct SourceMaps { 76pub(crate) struct SourceMap {
77 pub type_params: ArenaMap<LocalTypeParamId, Either<ast::Trait, ast::TypeParam>>, 77 pub(crate) type_params: ArenaMap<LocalTypeParamId, Either<ast::Trait, ast::TypeParam>>,
78 pub lifetime_params: ArenaMap<LocalLifetimeParamId, ast::LifetimeParam>, 78 lifetime_params: ArenaMap<LocalLifetimeParamId, ast::LifetimeParam>,
79} 79}
80 80
81impl GenericParams { 81impl GenericParams {
@@ -133,9 +133,9 @@ impl GenericParams {
133 Arc::new(generics) 133 Arc::new(generics)
134 } 134 }
135 135
136 fn new(db: &dyn DefDatabase, def: GenericDefId) -> (GenericParams, InFile<SourceMaps>) { 136 fn new(db: &dyn DefDatabase, def: GenericDefId) -> (GenericParams, InFile<SourceMap>) {
137 let mut generics = GenericParams::default(); 137 let mut generics = GenericParams::default();
138 let mut sm = SourceMaps::default(); 138 let mut sm = SourceMap::default();
139 139
140 // FIXME: add `: Sized` bound for everything except for `Self` in traits 140 // FIXME: add `: Sized` bound for everything except for `Self` in traits
141 let file_id = match def { 141 let file_id = match def {
@@ -214,7 +214,7 @@ impl GenericParams {
214 pub(crate) fn fill( 214 pub(crate) fn fill(
215 &mut self, 215 &mut self,
216 lower_ctx: &LowerCtx, 216 lower_ctx: &LowerCtx,
217 sm: &mut SourceMaps, 217 sm: &mut SourceMap,
218 node: &dyn GenericParamsOwner, 218 node: &dyn GenericParamsOwner,
219 ) { 219 ) {
220 if let Some(params) = node.generic_param_list() { 220 if let Some(params) = node.generic_param_list() {
@@ -241,7 +241,7 @@ impl GenericParams {
241 fn fill_params( 241 fn fill_params(
242 &mut self, 242 &mut self,
243 lower_ctx: &LowerCtx, 243 lower_ctx: &LowerCtx,
244 sm: &mut SourceMaps, 244 sm: &mut SourceMap,
245 params: ast::GenericParamList, 245 params: ast::GenericParamList,
246 ) { 246 ) {
247 for type_param in params.type_params() { 247 for type_param in params.type_params() {
@@ -345,10 +345,24 @@ impl GenericParams {
345 }) 345 })
346 } 346 }
347} 347}
348impl GenericDefId { 348
349 // FIXME: Change HasChildSource's ChildId AssocItem to be a generic parameter instead 349impl HasChildSource<LocalTypeParamId> for GenericDefId {
350 pub fn child_source(&self, db: &dyn DefDatabase) -> InFile<SourceMaps> { 350 type Value = Either<ast::Trait, ast::TypeParam>;
351 GenericParams::new(db, *self).1 351 fn child_source(
352 &self,
353 db: &dyn DefDatabase,
354 ) -> InFile<ArenaMap<LocalTypeParamId, Self::Value>> {
355 GenericParams::new(db, *self).1.map(|source_maps| source_maps.type_params)
356 }
357}
358
359impl HasChildSource<LocalLifetimeParamId> for GenericDefId {
360 type Value = ast::LifetimeParam;
361 fn child_source(
362 &self,
363 db: &dyn DefDatabase,
364 ) -> InFile<ArenaMap<LocalLifetimeParamId, Self::Value>> {
365 GenericParams::new(db, *self).1.map(|source_maps| source_maps.lifetime_params)
352 } 366 }
353} 367}
354 368