diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-12-12 14:35:38 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-12-12 14:35:38 +0000 |
commit | 479d1f7eec22c3564867223e2093f14774092528 (patch) | |
tree | 0b7b74f69d33ca5c86267ace1ac38c2c15248e50 /crates/hir/src | |
parent | 64a1c9810d5979cfd0fe6e7c385d9ca3caac2163 (diff) | |
parent | 11f86641829273e2b2b7023c2028bb475fce58ee (diff) |
Merge #6818
6818: Add Lifetimes to the HIR r=matklad a=Veykril
This doesn't handle resolve yet as I don't know yet how that will be used. I'll get to that once I start moving the lifetime reference PR to the hir.
This also adds a new `hir` name type for lifetimes and labels, `hir::LifetimeName`.
Co-authored-by: Lukas Wirth <[email protected]>
Diffstat (limited to 'crates/hir/src')
-rw-r--r-- | crates/hir/src/code_model.rs | 47 | ||||
-rw-r--r-- | crates/hir/src/lib.rs | 9 |
2 files changed, 47 insertions, 9 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 | }; |
25 | use hir_def::{find_path::PrefixKind, item_scope::ItemInNs, visibility::Visibility}; | 26 | use hir_def::{find_path::PrefixKind, item_scope::ItemInNs, visibility::Visibility}; |
26 | use hir_expand::{ | 27 | use 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 | ||
1100 | impl GenericDef { | 1101 | impl 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)] |
1197 | pub enum GenericParam { | ||
1198 | TypeParam(TypeParam), | ||
1199 | LifetimeParam(LifetimeParam), | ||
1200 | } | ||
1201 | impl_from!(TypeParam, LifetimeParam for GenericParam); | ||
1202 | |||
1203 | #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] | ||
1179 | pub struct TypeParam { | 1204 | pub 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)] | ||
1244 | pub struct LifetimeParam { | ||
1245 | pub(crate) id: LifetimeParamId, | ||
1246 | } | ||
1247 | |||
1248 | impl 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)] |
1220 | pub struct ImplDef { | 1257 | pub struct ImplDef { |
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 302a52491..0f399a2c6 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -35,8 +35,8 @@ pub use crate::{ | |||
35 | code_model::{ | 35 | code_model::{ |
36 | Access, Adt, AsAssocItem, AssocItem, AssocItemContainer, Callable, CallableKind, Const, | 36 | Access, Adt, AsAssocItem, AssocItem, AssocItemContainer, Callable, CallableKind, Const, |
37 | Crate, CrateDependency, DefWithBody, Enum, EnumVariant, Field, FieldSource, Function, | 37 | Crate, CrateDependency, DefWithBody, Enum, EnumVariant, Field, FieldSource, Function, |
38 | GenericDef, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, | 38 | GenericDef, HasVisibility, ImplDef, LifetimeParam, Local, MacroDef, Module, ModuleDef, |
39 | Struct, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, | 39 | ScopeDef, Static, Struct, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, |
40 | }, | 40 | }, |
41 | has_source::HasSource, | 41 | has_source::HasSource, |
42 | semantics::{PathResolution, Semantics, SemanticsScope}, | 42 | semantics::{PathResolution, Semantics, SemanticsScope}, |
@@ -56,8 +56,9 @@ pub use hir_def::{ | |||
56 | visibility::Visibility, | 56 | visibility::Visibility, |
57 | }; | 57 | }; |
58 | pub use hir_expand::{ | 58 | pub use hir_expand::{ |
59 | name::known, name::AsName, name::Name, ExpandResult, HirFileId, InFile, MacroCallId, | 59 | name::{known, AsName, Name}, |
60 | MacroCallLoc, /* FIXME */ MacroDefId, MacroFile, Origin, | 60 | ExpandResult, HirFileId, InFile, MacroCallId, MacroCallLoc, /* FIXME */ MacroDefId, |
61 | MacroFile, Origin, | ||
61 | }; | 62 | }; |
62 | pub use hir_ty::display::HirDisplay; | 63 | pub use hir_ty::display::HirDisplay; |
63 | 64 | ||