diff options
Diffstat (limited to 'crates/ra_hir/src/ids.rs')
-rw-r--r-- | crates/ra_hir/src/ids.rs | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 7ed5dbec7..262047849 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs | |||
@@ -1,8 +1,11 @@ | |||
1 | use std::marker::PhantomData; | 1 | use std::{ |
2 | marker::PhantomData, | ||
3 | hash::Hash, | ||
4 | }; | ||
2 | 5 | ||
3 | use ra_db::{LocationIntener, FileId}; | 6 | use ra_db::{LocationIntener, FileId}; |
4 | use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, ast}; | 7 | use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, ast}; |
5 | use ra_arena::{Arena, RawId, impl_arena_id}; | 8 | use ra_arena::{Arena, RawId, ArenaId, impl_arena_id}; |
6 | 9 | ||
7 | use crate::{ | 10 | use crate::{ |
8 | HirDatabase, Def, | 11 | HirDatabase, Def, |
@@ -179,43 +182,53 @@ impl<N: AstNode> Clone for ItemLoc<N> { | |||
179 | } | 182 | } |
180 | } | 183 | } |
181 | 184 | ||
185 | pub(crate) trait AstItemDef<N: AstNode + Eq + Hash>: ArenaId + Clone { | ||
186 | fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<N>, Self>; | ||
187 | fn source(self, db: &impl HirDatabase) -> (HirFileId, TreeArc<N>) { | ||
188 | let int = Self::interner(db.as_ref()); | ||
189 | let loc = int.id2loc(self); | ||
190 | loc.source(db) | ||
191 | } | ||
192 | fn module(self, db: &impl HirDatabase) -> Module { | ||
193 | let int = Self::interner(db.as_ref()); | ||
194 | let loc = int.id2loc(self); | ||
195 | loc.module | ||
196 | } | ||
197 | } | ||
198 | |||
182 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 199 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
183 | pub struct FunctionId(RawId); | 200 | pub struct FunctionId(RawId); |
184 | impl_arena_id!(FunctionId); | 201 | impl_arena_id!(FunctionId); |
185 | 202 | impl AstItemDef<ast::FnDef> for FunctionId { | |
186 | impl FunctionId { | 203 | fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::FnDef>, Self> { |
187 | pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::FnDef> { | 204 | &interner.fns |
188 | db.as_ref().fns.id2loc(self) | ||
189 | } | 205 | } |
190 | } | 206 | } |
191 | 207 | ||
192 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 208 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
193 | pub struct StructId(RawId); | 209 | pub struct StructId(RawId); |
194 | impl_arena_id!(StructId); | 210 | impl_arena_id!(StructId); |
195 | 211 | impl AstItemDef<ast::StructDef> for StructId { | |
196 | impl StructId { | 212 | fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::StructDef>, Self> { |
197 | pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::StructDef> { | 213 | &interner.structs |
198 | db.as_ref().structs.id2loc(self) | ||
199 | } | 214 | } |
200 | } | 215 | } |
201 | 216 | ||
202 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 217 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
203 | pub struct EnumId(RawId); | 218 | pub struct EnumId(RawId); |
204 | impl_arena_id!(EnumId); | 219 | impl_arena_id!(EnumId); |
205 | 220 | impl AstItemDef<ast::EnumDef> for EnumId { | |
206 | impl EnumId { | 221 | fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::EnumDef>, Self> { |
207 | pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::EnumDef> { | 222 | &interner.enums |
208 | db.as_ref().enums.id2loc(self) | ||
209 | } | 223 | } |
210 | } | 224 | } |
211 | 225 | ||
212 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 226 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
213 | pub struct EnumVariantId(RawId); | 227 | pub struct EnumVariantId(RawId); |
214 | impl_arena_id!(EnumVariantId); | 228 | impl_arena_id!(EnumVariantId); |
215 | 229 | impl AstItemDef<ast::EnumVariant> for EnumVariantId { | |
216 | impl EnumVariantId { | 230 | fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::EnumVariant>, Self> { |
217 | pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> ItemLoc<ast::EnumVariant> { | 231 | &interner.enum_variants |
218 | db.as_ref().enum_variants.id2loc(self) | ||
219 | } | 232 | } |
220 | } | 233 | } |
221 | 234 | ||