aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src/code_model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir/src/code_model.rs')
-rw-r--r--crates/hir/src/code_model.rs47
1 files changed, 42 insertions, 5 deletions
diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs
index 9a1e9ba49..fcc42c6bb 100644
--- a/crates/hir/src/code_model.rs
+++ b/crates/hir/src/code_model.rs
@@ -19,8 +19,9 @@ use hir_def::{
19 src::HasSource as _, 19 src::HasSource as _,
20 type_ref::{Mutability, TypeRef}, 20 type_ref::{Mutability, TypeRef},
21 AdtId, AssocContainerId, AssocItemId, AssocItemLoc, AttrDefId, ConstId, DefWithBodyId, EnumId, 21 AdtId, AssocContainerId, AssocItemId, AssocItemLoc, AttrDefId, ConstId, DefWithBodyId, EnumId,
22 FunctionId, GenericDefId, HasModule, ImplId, LocalEnumVariantId, LocalFieldId, LocalModuleId, 22 FunctionId, GenericDefId, HasModule, ImplId, LifetimeParamId, LocalEnumVariantId, LocalFieldId,
23 Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, 23 LocalModuleId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, TypeParamId,
24 UnionId,
24}; 25};
25use hir_def::{find_path::PrefixKind, item_scope::ItemInNs, visibility::Visibility}; 26use hir_def::{find_path::PrefixKind, item_scope::ItemInNs, visibility::Visibility};
26use hir_expand::{ 27use hir_expand::{
@@ -831,7 +832,7 @@ impl SelfParam {
831 .params 832 .params
832 .first() 833 .first()
833 .map(|param| match *param { 834 .map(|param| match *param {
834 TypeRef::Reference(_, mutability) => mutability.into(), 835 TypeRef::Reference(.., mutability) => mutability.into(),
835 _ => Access::Owned, 836 _ => Access::Owned,
836 }) 837 })
837 .unwrap_or(Access::Owned) 838 .unwrap_or(Access::Owned)
@@ -1098,8 +1099,25 @@ impl_from!(
1098); 1099);
1099 1100
1100impl GenericDef { 1101impl GenericDef {
1101 pub fn params(self, db: &dyn HirDatabase) -> Vec<TypeParam> { 1102 pub fn params(self, db: &dyn HirDatabase) -> Vec<GenericParam> {
1102 let generics: Arc<hir_def::generics::GenericParams> = db.generic_params(self.into()); 1103 let generics = db.generic_params(self.into());
1104 let ty_params = generics
1105 .types
1106 .iter()
1107 .map(|(local_id, _)| TypeParam { id: TypeParamId { parent: self.into(), local_id } })
1108 .map(GenericParam::TypeParam);
1109 let lt_params = generics
1110 .lifetimes
1111 .iter()
1112 .map(|(local_id, _)| LifetimeParam {
1113 id: LifetimeParamId { parent: self.into(), local_id },
1114 })
1115 .map(GenericParam::LifetimeParam);
1116 ty_params.chain(lt_params).collect()
1117 }
1118
1119 pub fn type_params(self, db: &dyn HirDatabase) -> Vec<TypeParam> {
1120 let generics = db.generic_params(self.into());
1103 generics 1121 generics
1104 .types 1122 .types
1105 .iter() 1123 .iter()
@@ -1176,6 +1194,13 @@ impl Local {
1176} 1194}
1177 1195
1178#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] 1196#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
1197pub enum GenericParam {
1198 TypeParam(TypeParam),
1199 LifetimeParam(LifetimeParam),
1200}
1201impl_from!(TypeParam, LifetimeParam for GenericParam);
1202
1203#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
1179pub struct TypeParam { 1204pub struct TypeParam {
1180 pub(crate) id: TypeParamId, 1205 pub(crate) id: TypeParamId,
1181} 1206}
@@ -1215,6 +1240,18 @@ impl TypeParam {
1215 } 1240 }
1216} 1241}
1217 1242
1243#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
1244pub struct LifetimeParam {
1245 pub(crate) id: LifetimeParamId,
1246}
1247
1248impl LifetimeParam {
1249 pub fn name(self, db: &dyn HirDatabase) -> Name {
1250 let params = db.generic_params(self.id.parent);
1251 params.lifetimes[self.id.local_id].name.clone()
1252 }
1253}
1254
1218// FIXME: rename from `ImplDef` to `Impl` 1255// FIXME: rename from `ImplDef` to `Impl`
1219#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 1256#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
1220pub struct ImplDef { 1257pub struct ImplDef {