From 11f86641829273e2b2b7023c2028bb475fce58ee Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 11 Dec 2020 13:49:32 +0100 Subject: Add Lifetimes to the HIR --- crates/hir/src/code_model.rs | 47 +++++++++++++++++++++++++++++++++++++++----- crates/hir/src/lib.rs | 9 +++++---- 2 files changed, 47 insertions(+), 9 deletions(-) (limited to 'crates/hir') 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::{ src::HasSource as _, type_ref::{Mutability, TypeRef}, AdtId, AssocContainerId, AssocItemId, AssocItemLoc, AttrDefId, ConstId, DefWithBodyId, EnumId, - FunctionId, GenericDefId, HasModule, ImplId, LocalEnumVariantId, LocalFieldId, LocalModuleId, - Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, TypeParamId, UnionId, + FunctionId, GenericDefId, HasModule, ImplId, LifetimeParamId, LocalEnumVariantId, LocalFieldId, + LocalModuleId, Lookup, ModuleId, StaticId, StructId, TraitId, TypeAliasId, TypeParamId, + UnionId, }; use hir_def::{find_path::PrefixKind, item_scope::ItemInNs, visibility::Visibility}; use hir_expand::{ @@ -831,7 +832,7 @@ impl SelfParam { .params .first() .map(|param| match *param { - TypeRef::Reference(_, mutability) => mutability.into(), + TypeRef::Reference(.., mutability) => mutability.into(), _ => Access::Owned, }) .unwrap_or(Access::Owned) @@ -1098,8 +1099,25 @@ impl_from!( ); impl GenericDef { - pub fn params(self, db: &dyn HirDatabase) -> Vec { - let generics: Arc = db.generic_params(self.into()); + pub fn params(self, db: &dyn HirDatabase) -> Vec { + let generics = db.generic_params(self.into()); + let ty_params = generics + .types + .iter() + .map(|(local_id, _)| TypeParam { id: TypeParamId { parent: self.into(), local_id } }) + .map(GenericParam::TypeParam); + let lt_params = generics + .lifetimes + .iter() + .map(|(local_id, _)| LifetimeParam { + id: LifetimeParamId { parent: self.into(), local_id }, + }) + .map(GenericParam::LifetimeParam); + ty_params.chain(lt_params).collect() + } + + pub fn type_params(self, db: &dyn HirDatabase) -> Vec { + let generics = db.generic_params(self.into()); generics .types .iter() @@ -1175,6 +1193,13 @@ impl Local { } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum GenericParam { + TypeParam(TypeParam), + LifetimeParam(LifetimeParam), +} +impl_from!(TypeParam, LifetimeParam for GenericParam); + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] pub struct TypeParam { pub(crate) id: TypeParamId, @@ -1215,6 +1240,18 @@ impl TypeParam { } } +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub struct LifetimeParam { + pub(crate) id: LifetimeParamId, +} + +impl LifetimeParam { + pub fn name(self, db: &dyn HirDatabase) -> Name { + let params = db.generic_params(self.id.parent); + params.lifetimes[self.id.local_id].name.clone() + } +} + // FIXME: rename from `ImplDef` to `Impl` #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 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::{ code_model::{ Access, Adt, AsAssocItem, AssocItem, AssocItemContainer, Callable, CallableKind, Const, Crate, CrateDependency, DefWithBody, Enum, EnumVariant, Field, FieldSource, Function, - GenericDef, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, ScopeDef, Static, - Struct, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, + GenericDef, HasVisibility, ImplDef, LifetimeParam, Local, MacroDef, Module, ModuleDef, + ScopeDef, Static, Struct, Trait, Type, TypeAlias, TypeParam, Union, VariantDef, }, has_source::HasSource, semantics::{PathResolution, Semantics, SemanticsScope}, @@ -56,8 +56,9 @@ pub use hir_def::{ visibility::Visibility, }; pub use hir_expand::{ - name::known, name::AsName, name::Name, ExpandResult, HirFileId, InFile, MacroCallId, - MacroCallLoc, /* FIXME */ MacroDefId, MacroFile, Origin, + name::{known, AsName, Name}, + ExpandResult, HirFileId, InFile, MacroCallId, MacroCallLoc, /* FIXME */ MacroDefId, + MacroFile, Origin, }; pub use hir_ty::display::HirDisplay; -- cgit v1.2.3