diff options
author | Aleksey Kladov <[email protected]> | 2019-03-13 13:38:02 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-03-17 09:49:07 +0000 |
commit | 2195d1db6d70d64383bec82819fab02891d09744 (patch) | |
tree | 40174ca7cbb3625ea62ebc10dbd9b592c83a8081 /crates/ra_hir/src/nameres/crate_def_map/raw.rs | |
parent | 182c05a96c25321ac3ff262cea098e0c4d7ed6f8 (diff) |
Replace module_tree with CrateDefMap
Diffstat (limited to 'crates/ra_hir/src/nameres/crate_def_map/raw.rs')
-rw-r--r-- | crates/ra_hir/src/nameres/crate_def_map/raw.rs | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/crates/ra_hir/src/nameres/crate_def_map/raw.rs b/crates/ra_hir/src/nameres/crate_def_map/raw.rs index fe832b8da..f064f722c 100644 --- a/crates/ra_hir/src/nameres/crate_def_map/raw.rs +++ b/crates/ra_hir/src/nameres/crate_def_map/raw.rs | |||
@@ -3,6 +3,7 @@ use std::{ | |||
3 | ops::Index, | 3 | ops::Index, |
4 | }; | 4 | }; |
5 | 5 | ||
6 | use test_utils::tested_by; | ||
6 | use ra_db::FileId; | 7 | use ra_db::FileId; |
7 | use ra_arena::{Arena, impl_arena_id, RawId}; | 8 | use ra_arena::{Arena, impl_arena_id, RawId}; |
8 | use ra_syntax::{ | 9 | use ra_syntax::{ |
@@ -15,8 +16,8 @@ use crate::{ | |||
15 | ids::{SourceFileItemId, SourceFileItems}, | 16 | ids::{SourceFileItemId, SourceFileItems}, |
16 | }; | 17 | }; |
17 | 18 | ||
18 | #[derive(Default, PartialEq, Eq)] | 19 | #[derive(Debug, Default, PartialEq, Eq)] |
19 | pub(crate) struct RawItems { | 20 | pub struct RawItems { |
20 | modules: Arena<Module, ModuleData>, | 21 | modules: Arena<Module, ModuleData>, |
21 | imports: Arena<ImportId, ImportData>, | 22 | imports: Arena<ImportId, ImportData>, |
22 | defs: Arena<Def, DefData>, | 23 | defs: Arena<Def, DefData>, |
@@ -26,18 +27,21 @@ pub(crate) struct RawItems { | |||
26 | } | 27 | } |
27 | 28 | ||
28 | impl RawItems { | 29 | impl RawItems { |
29 | pub(crate) fn items(&self) -> &[RawItem] { | 30 | pub(crate) fn raw_items_query( |
30 | &self.items | 31 | db: &impl PersistentHirDatabase, |
31 | } | 32 | file_id: FileId, |
32 | 33 | ) -> Arc<RawItems> { | |
33 | pub(crate) fn raw_items_query(db: &impl PersistentHirDatabase, file_id: FileId) -> RawItems { | ||
34 | let mut collector = RawItemsCollector { | 34 | let mut collector = RawItemsCollector { |
35 | raw_items: RawItems::default(), | 35 | raw_items: RawItems::default(), |
36 | source_file_items: db.file_items(file_id.into()), | 36 | source_file_items: db.file_items(file_id.into()), |
37 | }; | 37 | }; |
38 | let source_file = db.parse(file_id); | 38 | let source_file = db.parse(file_id); |
39 | collector.process_module(None, &*source_file); | 39 | collector.process_module(None, &*source_file); |
40 | collector.raw_items | 40 | Arc::new(collector.raw_items) |
41 | } | ||
42 | |||
43 | pub(crate) fn items(&self) -> &[RawItem] { | ||
44 | &self.items | ||
41 | } | 45 | } |
42 | 46 | ||
43 | // We can't use queries during name resolution for fear of cycles, so this | 47 | // We can't use queries during name resolution for fear of cycles, so this |
@@ -81,7 +85,7 @@ impl Index<Macro> for RawItems { | |||
81 | } | 85 | } |
82 | } | 86 | } |
83 | 87 | ||
84 | #[derive(PartialEq, Eq, Clone, Copy)] | 88 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] |
85 | pub(crate) enum RawItem { | 89 | pub(crate) enum RawItem { |
86 | Module(Module), | 90 | Module(Module), |
87 | Import(ImportId), | 91 | Import(ImportId), |
@@ -89,24 +93,24 @@ pub(crate) enum RawItem { | |||
89 | Macro(Macro), | 93 | Macro(Macro), |
90 | } | 94 | } |
91 | 95 | ||
92 | #[derive(Clone, Copy, PartialEq, Eq, Hash)] | 96 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
93 | pub(crate) struct Module(RawId); | 97 | pub(crate) struct Module(RawId); |
94 | impl_arena_id!(Module); | 98 | impl_arena_id!(Module); |
95 | 99 | ||
96 | #[derive(PartialEq, Eq)] | 100 | #[derive(Debug, PartialEq, Eq)] |
97 | pub(crate) enum ModuleData { | 101 | pub(crate) enum ModuleData { |
98 | Declaration { name: Name }, | 102 | Declaration { name: Name, source_item_id: SourceFileItemId }, |
99 | Definition { name: Name, items: Vec<RawItem> }, | 103 | Definition { name: Name, source_item_id: SourceFileItemId, items: Vec<RawItem> }, |
100 | } | 104 | } |
101 | 105 | ||
102 | pub(crate) use crate::nameres::lower::ImportId; | 106 | pub(crate) use crate::nameres::lower::ImportId; |
103 | pub(super) use crate::nameres::lower::ImportData; | 107 | pub(super) use crate::nameres::lower::ImportData; |
104 | 108 | ||
105 | #[derive(Clone, Copy, PartialEq, Eq, Hash)] | 109 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
106 | pub(crate) struct Def(RawId); | 110 | pub(crate) struct Def(RawId); |
107 | impl_arena_id!(Def); | 111 | impl_arena_id!(Def); |
108 | 112 | ||
109 | #[derive(PartialEq, Eq)] | 113 | #[derive(Debug, PartialEq, Eq)] |
110 | pub(crate) struct DefData { | 114 | pub(crate) struct DefData { |
111 | pub(crate) source_item_id: SourceFileItemId, | 115 | pub(crate) source_item_id: SourceFileItemId, |
112 | pub(crate) name: Name, | 116 | pub(crate) name: Name, |
@@ -124,11 +128,11 @@ pub(crate) enum DefKind { | |||
124 | TypeAlias, | 128 | TypeAlias, |
125 | } | 129 | } |
126 | 130 | ||
127 | #[derive(Clone, Copy, PartialEq, Eq, Hash)] | 131 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
128 | pub(crate) struct Macro(RawId); | 132 | pub(crate) struct Macro(RawId); |
129 | impl_arena_id!(Macro); | 133 | impl_arena_id!(Macro); |
130 | 134 | ||
131 | #[derive(PartialEq, Eq)] | 135 | #[derive(Debug, PartialEq, Eq)] |
132 | pub(crate) struct MacroData { | 136 | pub(crate) struct MacroData { |
133 | pub(crate) source_item_id: SourceFileItemId, | 137 | pub(crate) source_item_id: SourceFileItemId, |
134 | pub(crate) path: Path, | 138 | pub(crate) path: Path, |
@@ -191,18 +195,25 @@ impl RawItemsCollector { | |||
191 | Some(it) => it.as_name(), | 195 | Some(it) => it.as_name(), |
192 | None => return, | 196 | None => return, |
193 | }; | 197 | }; |
198 | let source_item_id = self.source_file_items.id_of_unchecked(module.syntax()); | ||
194 | if module.has_semi() { | 199 | if module.has_semi() { |
195 | let item = self.raw_items.modules.alloc(ModuleData::Declaration { name }); | 200 | let item = |
201 | self.raw_items.modules.alloc(ModuleData::Declaration { name, source_item_id }); | ||
196 | self.push_item(current_module, RawItem::Module(item)); | 202 | self.push_item(current_module, RawItem::Module(item)); |
197 | return; | 203 | return; |
198 | } | 204 | } |
199 | 205 | ||
200 | if let Some(item_list) = module.item_list() { | 206 | if let Some(item_list) = module.item_list() { |
201 | let item = | 207 | let item = self.raw_items.modules.alloc(ModuleData::Definition { |
202 | self.raw_items.modules.alloc(ModuleData::Definition { name, items: Vec::new() }); | 208 | name, |
209 | source_item_id, | ||
210 | items: Vec::new(), | ||
211 | }); | ||
203 | self.process_module(Some(item), item_list); | 212 | self.process_module(Some(item), item_list); |
204 | self.push_item(current_module, RawItem::Module(item)); | 213 | self.push_item(current_module, RawItem::Module(item)); |
214 | return; | ||
205 | } | 215 | } |
216 | tested_by!(name_res_works_for_broken_modules); | ||
206 | } | 217 | } |
207 | 218 | ||
208 | fn add_use_item(&mut self, current_module: Option<Module>, use_item: &ast::UseItem) { | 219 | fn add_use_item(&mut self, current_module: Option<Module>, use_item: &ast::UseItem) { |