aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ids.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-01-24 21:02:18 +0000
committerAleksey Kladov <[email protected]>2019-01-24 21:02:18 +0000
commit90215eb5a026d446ae7e5d4e62c43d6d8c82edf1 (patch)
tree75b35f218e07a8c6feba4e6204a9da762c2a9089 /crates/ra_hir/src/ids.rs
parent1a5f32fcb516c1647c7581f21be9b11c8f1f94ba (diff)
generalize boilerplate
Diffstat (limited to 'crates/ra_hir/src/ids.rs')
-rw-r--r--crates/ra_hir/src/ids.rs49
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 @@
1use std::marker::PhantomData; 1use std::{
2 marker::PhantomData,
3 hash::Hash,
4};
2 5
3use ra_db::{LocationIntener, FileId}; 6use ra_db::{LocationIntener, FileId};
4use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, ast}; 7use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, ast};
5use ra_arena::{Arena, RawId, impl_arena_id}; 8use ra_arena::{Arena, RawId, ArenaId, impl_arena_id};
6 9
7use crate::{ 10use crate::{
8 HirDatabase, Def, 11 HirDatabase, Def,
@@ -179,43 +182,53 @@ impl<N: AstNode> Clone for ItemLoc<N> {
179 } 182 }
180} 183}
181 184
185pub(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)]
183pub struct FunctionId(RawId); 200pub struct FunctionId(RawId);
184impl_arena_id!(FunctionId); 201impl_arena_id!(FunctionId);
185 202impl AstItemDef<ast::FnDef> for FunctionId {
186impl 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)]
193pub struct StructId(RawId); 209pub struct StructId(RawId);
194impl_arena_id!(StructId); 210impl_arena_id!(StructId);
195 211impl AstItemDef<ast::StructDef> for StructId {
196impl 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)]
203pub struct EnumId(RawId); 218pub struct EnumId(RawId);
204impl_arena_id!(EnumId); 219impl_arena_id!(EnumId);
205 220impl AstItemDef<ast::EnumDef> for EnumId {
206impl 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)]
213pub struct EnumVariantId(RawId); 227pub struct EnumVariantId(RawId);
214impl_arena_id!(EnumVariantId); 228impl_arena_id!(EnumVariantId);
215 229impl AstItemDef<ast::EnumVariant> for EnumVariantId {
216impl 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