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 | 69 |
1 files changed, 29 insertions, 40 deletions
diff --git a/crates/hir-def/src/generics.rs b/crates/hir-def/src/generics.rs index 8dce7fdb4d..d11c397091 100644 --- a/crates/hir-def/src/generics.rs +++ b/crates/hir-def/src/generics.rs @@ -21,13 +21,13 @@ use crate::{ db::DefDatabase, dyn_map::{keys, DynMap}, expander::Expander, - item_tree::ItemTree, + item_tree::{ItemTree, ItemTreeModItemNode}, lower::LowerCtx, nameres::{DefMap, MacroSubNs}, src::{HasChildSource, HasSource}, type_ref::{ConstRef, LifetimeRef, TypeBound, TypeRef}, - AdtId, ConstParamId, GenericDefId, HasModule, LifetimeParamId, LocalLifetimeParamId, - LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId, + AdtId, AssocItemLoc, ConstParamId, GenericDefId, HasModule, ItemLoc, LifetimeParamId, + LocalLifetimeParamId, LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId, }; /// Data about a generic type parameter (to a function, struct, impl, ...). @@ -509,47 +509,36 @@ impl GenericParams { } fn file_id_and_params_of( - def: GenericDefId, db: &dyn DefDatabase, + def: GenericDefId, ) -> (HirFileId, Option<ast::GenericParamList>) { match def { - GenericDefId::FunctionId(it) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::AdtId(AdtId::StructId(it)) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::AdtId(AdtId::UnionId(it)) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::AdtId(AdtId::EnumId(it)) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::TraitId(it) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::TraitAliasId(it) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::TypeAliasId(it) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } - GenericDefId::ImplId(it) => { - let src = it.lookup(db).source(db); - (src.file_id, src.value.generic_param_list()) - } + GenericDefId::FunctionId(it) => file_id_and_params_of_item_loc(db, it), + GenericDefId::TypeAliasId(it) => file_id_and_params_of_item_loc(db, it), + GenericDefId::ConstId(_) => (FileId::BOGUS.into(), None), + GenericDefId::AdtId(AdtId::StructId(it)) => file_id_and_params_of_item_loc(db, it), + GenericDefId::AdtId(AdtId::UnionId(it)) => file_id_and_params_of_item_loc(db, it), + GenericDefId::AdtId(AdtId::EnumId(it)) => file_id_and_params_of_item_loc(db, it), + GenericDefId::TraitId(it) => file_id_and_params_of_item_loc(db, it), + GenericDefId::TraitAliasId(it) => file_id_and_params_of_item_loc(db, it), + GenericDefId::ImplId(it) => file_id_and_params_of_item_loc(db, it), // We won't be using this ID anyway - GenericDefId::EnumVariantId(_) | GenericDefId::ConstId(_) => (FileId::BOGUS.into(), None), + GenericDefId::EnumVariantId(_) => (FileId::BOGUS.into(), None), } } +fn file_id_and_params_of_item_loc<Loc>( + db: &dyn DefDatabase, + def: impl for<'db> Lookup<Database<'db> = dyn DefDatabase + 'db, Data = Loc>, +) -> (HirFileId, Option<ast::GenericParamList>) +where + Loc: HasSource, + Loc::Value: HasGenericParams, +{ + let src = def.lookup(db).source(db); + (src.file_id, src.value.generic_param_list()) +} + impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId { type Value = Either<ast::TypeOrConstParam, ast::TraitOrAlias>; fn child_source( @@ -559,7 +548,7 @@ impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId { let generic_params = db.generic_params(*self); 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); + let (file_id, generic_params_list) = file_id_and_params_of(db, *self); let mut params = ArenaMap::default(); @@ -598,7 +587,7 @@ impl HasChildSource<LocalLifetimeParamId> for GenericDefId { let generic_params = db.generic_params(*self); let idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx); - let (file_id, generic_params_list) = file_id_and_params_of(*self, db); + let (file_id, generic_params_list) = file_id_and_params_of(db, *self); let mut params = ArenaMap::default(); @@ -614,7 +603,7 @@ impl HasChildSource<LocalLifetimeParamId> for GenericDefId { impl ChildBySource for GenericDefId { fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId) { - let (gfile_id, generic_params_list) = file_id_and_params_of(*self, db); + let (gfile_id, generic_params_list) = file_id_and_params_of(db, *self); if gfile_id != file_id { return; } |