diff options
Diffstat (limited to 'crates/ra_hir/src/impl_block.rs')
-rw-r--r-- | crates/ra_hir/src/impl_block.rs | 31 |
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 | ||
7 | use crate::{ | 7 | use 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 { | |||
22 | impl ImplBlock { | 22 | impl 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 | ||
65 | impl ImplData { | 65 | impl 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? | ||
126 | pub enum ImplItem { | 129 | pub 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 | ||
134 | impl ImplItem { | 137 | impl 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)] |
154 | pub struct ModuleImplBlocks { | 153 | pub 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 | ||
159 | impl ModuleImplBlocks { | 158 | impl 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 | } |