diff options
-rw-r--r-- | crates/ra_analysis/src/hir/db.rs | 3 | ||||
-rw-r--r-- | crates/ra_analysis/src/hir/mod.rs | 38 | ||||
-rw-r--r-- | crates/ra_analysis/src/hir/module/nameres.rs | 36 | ||||
-rw-r--r-- | crates/ra_analysis/src/hir/query_definitions.rs | 3 |
4 files changed, 43 insertions, 37 deletions
diff --git a/crates/ra_analysis/src/hir/db.rs b/crates/ra_analysis/src/hir/db.rs index c6dbde79b..a226e8205 100644 --- a/crates/ra_analysis/src/hir/db.rs +++ b/crates/ra_analysis/src/hir/db.rs | |||
@@ -8,11 +8,12 @@ use ra_syntax::{ | |||
8 | use crate::{ | 8 | use crate::{ |
9 | FileId, | 9 | FileId, |
10 | db::SyntaxDatabase, | 10 | db::SyntaxDatabase, |
11 | hir::{FileItems, FileItemId}, | ||
11 | hir::query_definitions, | 12 | hir::query_definitions, |
12 | hir::function::{FnId, FnScopes}, | 13 | hir::function::{FnId, FnScopes}, |
13 | hir::module::{ | 14 | hir::module::{ |
14 | ModuleId, ModuleTree, ModuleSource, | 15 | ModuleId, ModuleTree, ModuleSource, |
15 | nameres::{ItemMap, InputModuleItems, FileItems, FileItemId} | 16 | nameres::{ItemMap, InputModuleItems} |
16 | }, | 17 | }, |
17 | input::SourceRootId, | 18 | input::SourceRootId, |
18 | Cancelable, | 19 | Cancelable, |
diff --git a/crates/ra_analysis/src/hir/mod.rs b/crates/ra_analysis/src/hir/mod.rs index 863ffd919..3d4a55ca4 100644 --- a/crates/ra_analysis/src/hir/mod.rs +++ b/crates/ra_analysis/src/hir/mod.rs | |||
@@ -11,15 +11,20 @@ mod function; | |||
11 | mod module; | 11 | mod module; |
12 | mod path; | 12 | mod path; |
13 | 13 | ||
14 | use std::ops::Index; | ||
15 | |||
16 | use ra_syntax::{SyntaxNodeRef, SyntaxNode}; | ||
17 | |||
14 | use crate::{ | 18 | use crate::{ |
15 | hir::db::HirDatabase, | 19 | hir::db::HirDatabase, |
16 | loc2id::{DefId, DefLoc}, | 20 | loc2id::{DefId, DefLoc}, |
17 | Cancelable, | 21 | Cancelable, |
22 | arena::{Arena, Id}, | ||
18 | }; | 23 | }; |
19 | 24 | ||
20 | pub(crate) use self::{ | 25 | pub(crate) use self::{ |
21 | path::{Path, PathKind}, | 26 | path::{Path, PathKind}, |
22 | module::{Module, ModuleId, Problem, nameres::FileItemId}, | 27 | module::{Module, ModuleId, Problem}, |
23 | function::{Function, FnScopes}, | 28 | function::{Function, FnScopes}, |
24 | }; | 29 | }; |
25 | 30 | ||
@@ -43,3 +48,34 @@ impl DefId { | |||
43 | Ok(res) | 48 | Ok(res) |
44 | } | 49 | } |
45 | } | 50 | } |
51 | |||
52 | /// Identifier of item within a specific file. This is stable over reparses, so | ||
53 | /// it's OK to use it as a salsa key/value. | ||
54 | pub(crate) type FileItemId = Id<SyntaxNode>; | ||
55 | |||
56 | /// Maps item's `SyntaxNode`s to `FileItemId` and back. | ||
57 | #[derive(Debug, PartialEq, Eq, Default)] | ||
58 | pub(crate) struct FileItems { | ||
59 | arena: Arena<SyntaxNode>, | ||
60 | } | ||
61 | |||
62 | impl FileItems { | ||
63 | fn alloc(&mut self, item: SyntaxNode) -> FileItemId { | ||
64 | self.arena.alloc(item) | ||
65 | } | ||
66 | fn id_of(&self, item: SyntaxNodeRef) -> FileItemId { | ||
67 | let (id, _item) = self | ||
68 | .arena | ||
69 | .iter() | ||
70 | .find(|(_id, i)| i.borrowed() == item) | ||
71 | .unwrap(); | ||
72 | id | ||
73 | } | ||
74 | } | ||
75 | |||
76 | impl Index<FileItemId> for FileItems { | ||
77 | type Output = SyntaxNode; | ||
78 | fn index(&self, idx: FileItemId) -> &SyntaxNode { | ||
79 | &self.arena[idx] | ||
80 | } | ||
81 | } | ||
diff --git a/crates/ra_analysis/src/hir/module/nameres.rs b/crates/ra_analysis/src/hir/module/nameres.rs index d38940085..f7d8c8e8c 100644 --- a/crates/ra_analysis/src/hir/module/nameres.rs +++ b/crates/ra_analysis/src/hir/module/nameres.rs | |||
@@ -16,13 +16,12 @@ | |||
16 | //! structure itself is modified. | 16 | //! structure itself is modified. |
17 | use std::{ | 17 | use std::{ |
18 | sync::Arc, | 18 | sync::Arc, |
19 | ops::Index, | ||
20 | }; | 19 | }; |
21 | 20 | ||
22 | use rustc_hash::FxHashMap; | 21 | use rustc_hash::FxHashMap; |
23 | 22 | ||
24 | use ra_syntax::{ | 23 | use ra_syntax::{ |
25 | SyntaxNode, SyntaxNodeRef, TextRange, | 24 | TextRange, |
26 | SmolStr, SyntaxKind::{self, *}, | 25 | SmolStr, SyntaxKind::{self, *}, |
27 | ast::{self, AstNode} | 26 | ast::{self, AstNode} |
28 | }; | 27 | }; |
@@ -31,45 +30,14 @@ use crate::{ | |||
31 | Cancelable, FileId, | 30 | Cancelable, FileId, |
32 | loc2id::{DefId, DefLoc}, | 31 | loc2id::{DefId, DefLoc}, |
33 | hir::{ | 32 | hir::{ |
33 | FileItemId, FileItems, | ||
34 | Path, PathKind, | 34 | Path, PathKind, |
35 | HirDatabase, | 35 | HirDatabase, |
36 | module::{ModuleId, ModuleTree}, | 36 | module::{ModuleId, ModuleTree}, |
37 | }, | 37 | }, |
38 | input::SourceRootId, | 38 | input::SourceRootId, |
39 | arena::{Arena, Id} | ||
40 | }; | 39 | }; |
41 | 40 | ||
42 | /// Identifier of item within a specific file. This is stable over reparses, so | ||
43 | /// it's OK to use it as a salsa key/value. | ||
44 | pub(crate) type FileItemId = Id<SyntaxNode>; | ||
45 | |||
46 | /// Maps item's `SyntaxNode`s to `FileItemId` and back. | ||
47 | #[derive(Debug, PartialEq, Eq, Default)] | ||
48 | pub(crate) struct FileItems { | ||
49 | arena: Arena<SyntaxNode>, | ||
50 | } | ||
51 | |||
52 | impl FileItems { | ||
53 | pub(crate) fn alloc(&mut self, item: SyntaxNode) -> FileItemId { | ||
54 | self.arena.alloc(item) | ||
55 | } | ||
56 | fn id_of(&self, item: SyntaxNodeRef) -> FileItemId { | ||
57 | let (id, _item) = self | ||
58 | .arena | ||
59 | .iter() | ||
60 | .find(|(_id, i)| i.borrowed() == item) | ||
61 | .unwrap(); | ||
62 | id | ||
63 | } | ||
64 | } | ||
65 | |||
66 | impl Index<FileItemId> for FileItems { | ||
67 | type Output = SyntaxNode; | ||
68 | fn index(&self, idx: FileItemId) -> &SyntaxNode { | ||
69 | &self.arena[idx] | ||
70 | } | ||
71 | } | ||
72 | |||
73 | /// Item map is the result of the name resolution. Item map contains, for each | 41 | /// Item map is the result of the name resolution. Item map contains, for each |
74 | /// module, the set of visible items. | 42 | /// module, the set of visible items. |
75 | #[derive(Default, Debug, PartialEq, Eq)] | 43 | #[derive(Default, Debug, PartialEq, Eq)] |
diff --git a/crates/ra_analysis/src/hir/query_definitions.rs b/crates/ra_analysis/src/hir/query_definitions.rs index 8584a8d64..e6bfbc6cf 100644 --- a/crates/ra_analysis/src/hir/query_definitions.rs +++ b/crates/ra_analysis/src/hir/query_definitions.rs | |||
@@ -12,12 +12,13 @@ use ra_syntax::{ | |||
12 | use crate::{ | 12 | use crate::{ |
13 | FileId, Cancelable, | 13 | FileId, Cancelable, |
14 | hir::{ | 14 | hir::{ |
15 | FileItems, FileItemId, | ||
15 | db::HirDatabase, | 16 | db::HirDatabase, |
16 | function::{FnId, FnScopes}, | 17 | function::{FnId, FnScopes}, |
17 | module::{ | 18 | module::{ |
18 | ModuleSource, ModuleSourceNode, ModuleId, | 19 | ModuleSource, ModuleSourceNode, ModuleId, |
19 | imp::Submodule, | 20 | imp::Submodule, |
20 | nameres::{FileItems, FileItemId, InputModuleItems, ItemMap, Resolver}, | 21 | nameres::{InputModuleItems, ItemMap, Resolver}, |
21 | }, | 22 | }, |
22 | }, | 23 | }, |
23 | input::SourceRootId, | 24 | input::SourceRootId, |