aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/nameres/raw.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/nameres/raw.rs')
-rw-r--r--crates/ra_hir_def/src/nameres/raw.rs70
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
8use std::{ops::Index, sync::Arc}; 8use std::{ops::Index, sync::Arc};
9 9
10use either::Either;
11use hir_expand::{ 10use 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};
17use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; 16use ra_arena::{impl_arena_id, Arena, RawId};
18use ra_syntax::{ 17use ra_syntax::{
19 ast::{self, AttrsOwner, NameOwner}, 18 ast::{self, AttrsOwner, NameOwner},
20 AstNode, AstPtr, 19 AstNode,
21}; 20};
22use test_utils::tested_by; 21use test_utils::tested_by;
23 22
24use crate::{ 23use 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)]
34pub struct RawItems { 30pub 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)]
45pub struct ImportSourceMap {
46 map: ArenaMap<LocalImportId, ImportSourcePtr>,
47}
48
49type ImportSourcePtr = Either<AstPtr<ast::UseTree>, AstPtr<ast::ExternCrateItem>>;
50
51impl RawItems { 40impl 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
96impl Index<LocalImportId> for RawItems { 74impl 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)]
131pub(super) enum RawItemKind { 109pub(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)]
128pub(crate) struct Import(RawId);
129impl_arena_id!(Import);
130
149#[derive(Debug, Clone, PartialEq, Eq)] 131#[derive(Debug, Clone, PartialEq, Eq)]
150pub struct ImportData { 132pub struct ImportData {
151 pub(super) path: ModPath, 133 pub(super) path: ModPath,
@@ -217,7 +199,6 @@ pub(super) struct ImplData {
217 199
218struct RawItemsCollector { 200struct 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