aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/impl_block.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-01-24 12:28:50 +0000
committerAleksey Kladov <[email protected]>2019-01-24 12:28:50 +0000
commitec7ed054e06cb2e23fd3911932766b32014c8fa1 (patch)
treec06ed85f44afc261c483ff7b87e1a7aa33c198a1 /crates/ra_hir/src/impl_block.rs
parentf1959bbae0cf2f99e63d074278cec165c274b4e5 (diff)
Functions use new id scheme
Diffstat (limited to 'crates/ra_hir/src/impl_block.rs')
-rw-r--r--crates/ra_hir/src/impl_block.rs31
1 files changed, 15 insertions, 16 deletions
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs
index ba8b84da2..29becd317 100644
--- a/crates/ra_hir/src/impl_block.rs
+++ b/crates/ra_hir/src/impl_block.rs
@@ -6,7 +6,7 @@ use ra_syntax::ast::{self, AstNode};
6 6
7use crate::{ 7use crate::{
8 DefId, DefLoc, DefKind, SourceItemId, SourceFileItems, 8 DefId, DefLoc, DefKind, SourceItemId, SourceFileItems,
9 Function, HirFileId, HirInterner, 9 Function, HirFileId,
10 db::HirDatabase, 10 db::HirDatabase,
11 type_ref::TypeRef, 11 type_ref::TypeRef,
12}; 12};
@@ -22,9 +22,9 @@ pub struct ImplBlock {
22impl ImplBlock { 22impl ImplBlock {
23 pub(crate) fn containing( 23 pub(crate) fn containing(
24 module_impl_blocks: Arc<ModuleImplBlocks>, 24 module_impl_blocks: Arc<ModuleImplBlocks>,
25 def_id: DefId, 25 item: ImplItem,
26 ) -> Option<ImplBlock> { 26 ) -> Option<ImplBlock> {
27 let impl_id = *module_impl_blocks.impls_by_def.get(&def_id)?; 27 let impl_id = *module_impl_blocks.impls_by_def.get(&item)?;
28 Some(ImplBlock { 28 Some(ImplBlock {
29 module_impl_blocks, 29 module_impl_blocks,
30 impl_id, 30 impl_id,
@@ -64,7 +64,7 @@ pub struct ImplData {
64 64
65impl ImplData { 65impl ImplData {
66 pub(crate) fn from_ast( 66 pub(crate) fn from_ast(
67 db: &impl AsRef<HirInterner>, 67 db: &impl HirDatabase,
68 file_id: HirFileId, 68 file_id: HirFileId,
69 file_items: &SourceFileItems, 69 file_items: &SourceFileItems,
70 module: Module, 70 module: Module,
@@ -93,7 +93,9 @@ impl ImplData {
93 }; 93 };
94 let def_id = def_loc.id(db); 94 let def_id = def_loc.id(db);
95 match item_node.kind() { 95 match item_node.kind() {
96 ast::ImplItemKind::FnDef(..) => ImplItem::Method(Function::new(def_id)), 96 ast::ImplItemKind::FnDef(it) => {
97 ImplItem::Method(Function::from_ast(db, module, file_id, it))
98 }
97 ast::ImplItemKind::ConstDef(..) => ImplItem::Const(def_id), 99 ast::ImplItemKind::ConstDef(..) => ImplItem::Const(def_id),
98 ast::ImplItemKind::TypeDef(..) => ImplItem::Type(def_id), 100 ast::ImplItemKind::TypeDef(..) => ImplItem::Type(def_id),
99 } 101 }
@@ -122,7 +124,8 @@ impl ImplData {
122 } 124 }
123} 125}
124 126
125#[derive(Debug, Clone, PartialEq, Eq)] 127#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
128//TODO: rename to ImplDef?
126pub enum ImplItem { 129pub enum ImplItem {
127 Method(Function), 130 Method(Function),
128 // these don't have their own types yet 131 // these don't have their own types yet
@@ -131,13 +134,9 @@ pub enum ImplItem {
131 // Existential 134 // Existential
132} 135}
133 136
134impl ImplItem { 137impl From<Function> for ImplItem {
135 pub fn def_id(&self) -> DefId { 138 fn from(func: Function) -> ImplItem {
136 match self { 139 ImplItem::Method(func)
137 ImplItem::Method(f) => f.def_id(),
138 ImplItem::Const(def_id) => *def_id,
139 ImplItem::Type(def_id) => *def_id,
140 }
141 } 140 }
142} 141}
143 142
@@ -153,7 +152,7 @@ impl_arena_id!(ImplId);
153#[derive(Debug, PartialEq, Eq)] 152#[derive(Debug, PartialEq, Eq)]
154pub struct ModuleImplBlocks { 153pub struct ModuleImplBlocks {
155 pub(crate) impls: Arena<ImplId, ImplData>, 154 pub(crate) impls: Arena<ImplId, ImplData>,
156 impls_by_def: FxHashMap<DefId, ImplId>, 155 impls_by_def: FxHashMap<ImplItem, ImplId>,
157} 156}
158 157
159impl ModuleImplBlocks { 158impl ModuleImplBlocks {
@@ -181,8 +180,8 @@ impl ModuleImplBlocks {
181 let impl_block = 180 let impl_block =
182 ImplData::from_ast(db, file_id, &source_file_items, module, impl_block_ast); 181 ImplData::from_ast(db, file_id, &source_file_items, module, impl_block_ast);
183 let id = self.impls.alloc(impl_block); 182 let id = self.impls.alloc(impl_block);
184 for impl_item in &self.impls[id].items { 183 for &impl_item in &self.impls[id].items {
185 self.impls_by_def.insert(impl_item.def_id(), id); 184 self.impls_by_def.insert(impl_item, id);
186 } 185 }
187 } 186 }
188 } 187 }