diff options
Diffstat (limited to 'crates/ra_hir_def/src/nameres/raw.rs')
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 70 |
1 files changed, 20 insertions, 50 deletions
diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index df5dac88a..1b83b2247 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs | |||
@@ -7,24 +7,20 @@ | |||
7 | 7 | ||
8 | use std::{ops::Index, sync::Arc}; | 8 | use std::{ops::Index, sync::Arc}; |
9 | 9 | ||
10 | use either::Either; | ||
11 | use hir_expand::{ | 10 | use hir_expand::{ |
12 | ast_id_map::AstIdMap, | 11 | ast_id_map::AstIdMap, |
13 | db::AstDatabase, | 12 | db::AstDatabase, |
14 | hygiene::Hygiene, | 13 | hygiene::Hygiene, |
15 | name::{AsName, Name}, | 14 | name::{AsName, Name}, |
16 | }; | 15 | }; |
17 | use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; | 16 | use ra_arena::{impl_arena_id, Arena, RawId}; |
18 | use ra_syntax::{ | 17 | use ra_syntax::{ |
19 | ast::{self, AttrsOwner, NameOwner}, | 18 | ast::{self, AttrsOwner, NameOwner}, |
20 | AstNode, AstPtr, | 19 | AstNode, |
21 | }; | 20 | }; |
22 | use test_utils::tested_by; | 21 | use test_utils::tested_by; |
23 | 22 | ||
24 | use crate::{ | 23 | use crate::{attr::Attrs, db::DefDatabase, path::ModPath, FileAstId, HirFileId, InFile}; |
25 | attr::Attrs, db::DefDatabase, path::ModPath, trace::Trace, FileAstId, HirFileId, InFile, | ||
26 | LocalImportId, | ||
27 | }; | ||
28 | 24 | ||
29 | /// `RawItems` is a set of top-level items in a file (except for impls). | 25 | /// `RawItems` is a set of top-level items in a file (except for impls). |
30 | /// | 26 | /// |
@@ -33,7 +29,7 @@ use crate::{ | |||
33 | #[derive(Debug, Default, PartialEq, Eq)] | 29 | #[derive(Debug, Default, PartialEq, Eq)] |
34 | pub struct RawItems { | 30 | pub struct RawItems { |
35 | modules: Arena<Module, ModuleData>, | 31 | modules: Arena<Module, ModuleData>, |
36 | imports: Arena<LocalImportId, ImportData>, | 32 | imports: Arena<Import, ImportData>, |
37 | defs: Arena<Def, DefData>, | 33 | defs: Arena<Def, DefData>, |
38 | macros: Arena<Macro, MacroData>, | 34 | macros: Arena<Macro, MacroData>, |
39 | impls: Arena<Impl, ImplData>, | 35 | impls: Arena<Impl, ImplData>, |
@@ -41,29 +37,14 @@ pub struct RawItems { | |||
41 | items: Vec<RawItem>, | 37 | items: Vec<RawItem>, |
42 | } | 38 | } |
43 | 39 | ||
44 | #[derive(Debug, Default, PartialEq, Eq)] | ||
45 | pub struct ImportSourceMap { | ||
46 | map: ArenaMap<LocalImportId, ImportSourcePtr>, | ||
47 | } | ||
48 | |||
49 | type ImportSourcePtr = Either<AstPtr<ast::UseTree>, AstPtr<ast::ExternCrateItem>>; | ||
50 | |||
51 | impl RawItems { | 40 | impl RawItems { |
52 | pub(crate) fn raw_items_query( | 41 | pub(crate) fn raw_items_query( |
53 | db: &(impl DefDatabase + AstDatabase), | 42 | db: &(impl DefDatabase + AstDatabase), |
54 | file_id: HirFileId, | 43 | file_id: HirFileId, |
55 | ) -> Arc<RawItems> { | 44 | ) -> Arc<RawItems> { |
56 | db.raw_items_with_source_map(file_id).0 | ||
57 | } | ||
58 | |||
59 | pub(crate) fn raw_items_with_source_map_query( | ||
60 | db: &(impl DefDatabase + AstDatabase), | ||
61 | file_id: HirFileId, | ||
62 | ) -> (Arc<RawItems>, Arc<ImportSourceMap>) { | ||
63 | let mut collector = RawItemsCollector { | 45 | let mut collector = RawItemsCollector { |
64 | raw_items: RawItems::default(), | 46 | raw_items: RawItems::default(), |
65 | source_ast_id_map: db.ast_id_map(file_id), | 47 | source_ast_id_map: db.ast_id_map(file_id), |
66 | imports: Trace::new(), | ||
67 | file_id, | 48 | file_id, |
68 | hygiene: Hygiene::new(db, file_id), | 49 | hygiene: Hygiene::new(db, file_id), |
69 | }; | 50 | }; |
@@ -74,11 +55,8 @@ impl RawItems { | |||
74 | collector.process_module(None, item_list); | 55 | collector.process_module(None, item_list); |
75 | } | 56 | } |
76 | } | 57 | } |
77 | let mut raw_items = collector.raw_items; | 58 | let raw_items = collector.raw_items; |
78 | let (arena, map) = collector.imports.into_arena_and_map(); | 59 | Arc::new(raw_items) |
79 | raw_items.imports = arena; | ||
80 | let source_map = ImportSourceMap { map }; | ||
81 | (Arc::new(raw_items), Arc::new(source_map)) | ||
82 | } | 60 | } |
83 | 61 | ||
84 | pub(super) fn items(&self) -> &[RawItem] { | 62 | pub(super) fn items(&self) -> &[RawItem] { |
@@ -93,9 +71,9 @@ impl Index<Module> for RawItems { | |||
93 | } | 71 | } |
94 | } | 72 | } |
95 | 73 | ||
96 | impl Index<LocalImportId> for RawItems { | 74 | impl Index<Import> for RawItems { |
97 | type Output = ImportData; | 75 | type Output = ImportData; |
98 | fn index(&self, idx: LocalImportId) -> &ImportData { | 76 | fn index(&self, idx: Import) -> &ImportData { |
99 | &self.imports[idx] | 77 | &self.imports[idx] |
100 | } | 78 | } |
101 | } | 79 | } |
@@ -130,7 +108,7 @@ pub(super) struct RawItem { | |||
130 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 108 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] |
131 | pub(super) enum RawItemKind { | 109 | pub(super) enum RawItemKind { |
132 | Module(Module), | 110 | Module(Module), |
133 | Import(LocalImportId), | 111 | Import(Import), |
134 | Def(Def), | 112 | Def(Def), |
135 | Macro(Macro), | 113 | Macro(Macro), |
136 | Impl(Impl), | 114 | Impl(Impl), |
@@ -146,6 +124,10 @@ pub(super) enum ModuleData { | |||
146 | Definition { name: Name, ast_id: FileAstId<ast::Module>, items: Vec<RawItem> }, | 124 | Definition { name: Name, ast_id: FileAstId<ast::Module>, items: Vec<RawItem> }, |
147 | } | 125 | } |
148 | 126 | ||
127 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
128 | pub(crate) struct Import(RawId); | ||
129 | impl_arena_id!(Import); | ||
130 | |||
149 | #[derive(Debug, Clone, PartialEq, Eq)] | 131 | #[derive(Debug, Clone, PartialEq, Eq)] |
150 | pub struct ImportData { | 132 | pub struct ImportData { |
151 | pub(super) path: ModPath, | 133 | pub(super) path: ModPath, |
@@ -217,7 +199,6 @@ pub(super) struct ImplData { | |||
217 | 199 | ||
218 | struct RawItemsCollector { | 200 | struct RawItemsCollector { |
219 | raw_items: RawItems, | 201 | raw_items: RawItems, |
220 | imports: Trace<LocalImportId, ImportData, ImportSourcePtr>, | ||
221 | source_ast_id_map: Arc<AstIdMap>, | 202 | source_ast_id_map: Arc<AstIdMap>, |
222 | file_id: HirFileId, | 203 | file_id: HirFileId, |
223 | hygiene: Hygiene, | 204 | hygiene: Hygiene, |
@@ -324,7 +305,7 @@ impl RawItemsCollector { | |||
324 | ModPath::expand_use_item( | 305 | ModPath::expand_use_item( |
325 | InFile { value: use_item, file_id: self.file_id }, | 306 | InFile { value: use_item, file_id: self.file_id }, |
326 | &self.hygiene, | 307 | &self.hygiene, |
327 | |path, use_tree, is_glob, alias| { | 308 | |path, _use_tree, is_glob, alias| { |
328 | let import_data = ImportData { | 309 | let import_data = ImportData { |
329 | path, | 310 | path, |
330 | alias, | 311 | alias, |
@@ -333,11 +314,11 @@ impl RawItemsCollector { | |||
333 | is_extern_crate: false, | 314 | is_extern_crate: false, |
334 | is_macro_use: false, | 315 | is_macro_use: false, |
335 | }; | 316 | }; |
336 | buf.push((import_data, Either::Left(AstPtr::new(use_tree)))); | 317 | buf.push(import_data); |
337 | }, | 318 | }, |
338 | ); | 319 | ); |
339 | for (import_data, ptr) in buf { | 320 | for import_data in buf { |
340 | self.push_import(current_module, attrs.clone(), import_data, ptr); | 321 | self.push_import(current_module, attrs.clone(), import_data); |
341 | } | 322 | } |
342 | } | 323 | } |
343 | 324 | ||
@@ -360,12 +341,7 @@ impl RawItemsCollector { | |||
360 | is_extern_crate: true, | 341 | is_extern_crate: true, |
361 | is_macro_use, | 342 | is_macro_use, |
362 | }; | 343 | }; |
363 | self.push_import( | 344 | self.push_import(current_module, attrs, import_data); |
364 | current_module, | ||
365 | attrs, | ||
366 | import_data, | ||
367 | Either::Right(AstPtr::new(&extern_crate)), | ||
368 | ); | ||
369 | } | 345 | } |
370 | } | 346 | } |
371 | 347 | ||
@@ -396,14 +372,8 @@ impl RawItemsCollector { | |||
396 | self.push_item(current_module, attrs, RawItemKind::Impl(imp)) | 372 | self.push_item(current_module, attrs, RawItemKind::Impl(imp)) |
397 | } | 373 | } |
398 | 374 | ||
399 | fn push_import( | 375 | fn push_import(&mut self, current_module: Option<Module>, attrs: Attrs, data: ImportData) { |
400 | &mut self, | 376 | let import = self.raw_items.imports.alloc(data); |
401 | current_module: Option<Module>, | ||
402 | attrs: Attrs, | ||
403 | data: ImportData, | ||
404 | source: ImportSourcePtr, | ||
405 | ) { | ||
406 | let import = self.imports.alloc(|| source, || data); | ||
407 | self.push_item(current_module, attrs, RawItemKind::Import(import)) | 377 | self.push_item(current_module, attrs, RawItemKind::Import(import)) |
408 | } | 378 | } |
409 | 379 | ||