From 90215eb5a026d446ae7e5d4e62c43d6d8c82edf1 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 25 Jan 2019 00:02:18 +0300 Subject: generalize boilerplate --- crates/ra_hir/src/code_model_api.rs | 37 ++++++++++---------- crates/ra_hir/src/code_model_impl/function.rs | 4 --- crates/ra_hir/src/ids.rs | 49 +++++++++++++++++---------- 3 files changed, 51 insertions(+), 39 deletions(-) diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index e16013956..1fa591ea4 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -16,7 +16,7 @@ use crate::{ code_model_impl::def_id_to_ast, docs::{Documentation, Docs, docs_from_ast}, module_tree::ModuleId, - ids::{FunctionId, StructId, EnumId, EnumVariantId}, + ids::{FunctionId, StructId, EnumId, EnumVariantId, AstItemDef}, }; /// hir::Crate describes a single crate. It's the main interface with which @@ -197,8 +197,12 @@ pub struct Struct { } impl Struct { + pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { + self.id.source(db) + } + pub fn module(&self, db: &impl HirDatabase) -> Module { - self.id.loc(db).module + self.id.module(db) } pub fn name(&self, db: &impl HirDatabase) -> Option { @@ -217,10 +221,6 @@ impl Struct { .collect() } - pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { - self.id.loc(db).source(db) - } - pub fn generic_params(&self, db: &impl HirDatabase) -> Arc { db.generic_params((*self).into()) } @@ -238,8 +238,12 @@ pub struct Enum { } impl Enum { + pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { + self.id.source(db) + } + pub fn module(&self, db: &impl HirDatabase) -> Module { - self.id.loc(db).module + self.id.module(db) } pub fn name(&self, db: &impl HirDatabase) -> Option { @@ -250,10 +254,6 @@ impl Enum { db.enum_data(*self).variants.clone() } - pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { - self.id.loc(db).source(db) - } - pub fn generic_params(&self, db: &impl HirDatabase) -> Arc { db.generic_params((*self).into()) } @@ -271,8 +271,11 @@ pub struct EnumVariant { } impl EnumVariant { + pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { + self.id.source(db) + } pub fn module(&self, db: &impl HirDatabase) -> Module { - self.id.loc(db).module + self.id.module(db) } pub fn parent_enum(&self, db: &impl HirDatabase) -> Enum { db.enum_variant_data(*self).parent_enum.clone() @@ -296,10 +299,6 @@ impl EnumVariant { }) .collect() } - - pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { - self.id.loc(db).source(db) - } } impl Docs for EnumVariant { @@ -348,7 +347,11 @@ impl FnSignature { impl Function { pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { - self.id.loc(db).source(db) + self.id.source(db) + } + + pub fn module(&self, db: &impl HirDatabase) -> Module { + self.id.module(db) } pub fn body_syntax_mapping(&self, db: &impl HirDatabase) -> Arc { diff --git a/crates/ra_hir/src/code_model_impl/function.rs b/crates/ra_hir/src/code_model_impl/function.rs index 8a2ab5714..6ce5c77b1 100644 --- a/crates/ra_hir/src/code_model_impl/function.rs +++ b/crates/ra_hir/src/code_model_impl/function.rs @@ -30,10 +30,6 @@ impl Function { db.body_hir(*self) } - pub(crate) fn module(&self, db: &impl HirDatabase) -> Module { - self.id.loc(db).module - } - /// The containing impl block, if this is a method. pub(crate) fn impl_block(&self, db: &impl HirDatabase) -> Option { let module_impls = db.impls_in_module(self.module(db)); 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 @@ -use std::marker::PhantomData; +use std::{ + marker::PhantomData, + hash::Hash, +}; use ra_db::{LocationIntener, FileId}; use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, ast}; -use ra_arena::{Arena, RawId, impl_arena_id}; +use ra_arena::{Arena, RawId, ArenaId, impl_arena_id}; use crate::{ HirDatabase, Def, @@ -179,43 +182,53 @@ impl Clone for ItemLoc { } } +pub(crate) trait AstItemDef: ArenaId + Clone { + fn interner(interner: &HirInterner) -> &LocationIntener, Self>; + fn source(self, db: &impl HirDatabase) -> (HirFileId, TreeArc) { + let int = Self::interner(db.as_ref()); + let loc = int.id2loc(self); + loc.source(db) + } + fn module(self, db: &impl HirDatabase) -> Module { + let int = Self::interner(db.as_ref()); + let loc = int.id2loc(self); + loc.module + } +} + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct FunctionId(RawId); impl_arena_id!(FunctionId); - -impl FunctionId { - pub(crate) fn loc(self, db: &impl AsRef) -> ItemLoc { - db.as_ref().fns.id2loc(self) +impl AstItemDef for FunctionId { + fn interner(interner: &HirInterner) -> &LocationIntener, Self> { + &interner.fns } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct StructId(RawId); impl_arena_id!(StructId); - -impl StructId { - pub(crate) fn loc(self, db: &impl AsRef) -> ItemLoc { - db.as_ref().structs.id2loc(self) +impl AstItemDef for StructId { + fn interner(interner: &HirInterner) -> &LocationIntener, Self> { + &interner.structs } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct EnumId(RawId); impl_arena_id!(EnumId); - -impl EnumId { - pub(crate) fn loc(self, db: &impl AsRef) -> ItemLoc { - db.as_ref().enums.id2loc(self) +impl AstItemDef for EnumId { + fn interner(interner: &HirInterner) -> &LocationIntener, Self> { + &interner.enums } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct EnumVariantId(RawId); impl_arena_id!(EnumVariantId); - -impl EnumVariantId { - pub(crate) fn loc(self, db: &impl AsRef) -> ItemLoc { - db.as_ref().enum_variants.id2loc(self) +impl AstItemDef for EnumVariantId { + fn interner(interner: &HirInterner) -> &LocationIntener, Self> { + &interner.enum_variants } } -- cgit v1.2.3