diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-01-04 13:58:41 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-01-04 13:58:41 +0000 |
commit | a0d483011d5f84747fcc5d5fe9c82f4405d24db9 (patch) | |
tree | 25bc6aab1e4328e73446876b274e7dcaff7aa915 /crates/ra_hir | |
parent | 821fa7a50ab8c4886adc60a2093aa8e06cc3a9d6 (diff) | |
parent | 3fe6f422f9ef13b9171dbeab0c5c427f729f9983 (diff) |
Merge #425
425: remove id arena r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir')
-rw-r--r-- | crates/ra_hir/Cargo.toml | 2 | ||||
-rw-r--r-- | crates/ra_hir/src/arena.rs | 66 | ||||
-rw-r--r-- | crates/ra_hir/src/function/scope.rs | 12 | ||||
-rw-r--r-- | crates/ra_hir/src/ids.rs | 12 | ||||
-rw-r--r-- | crates/ra_hir/src/lib.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir/src/module.rs | 17 |
6 files changed, 24 insertions, 86 deletions
diff --git a/crates/ra_hir/Cargo.toml b/crates/ra_hir/Cargo.toml index c3fbd327d..8c0cf4b86 100644 --- a/crates/ra_hir/Cargo.toml +++ b/crates/ra_hir/Cargo.toml | |||
@@ -11,9 +11,9 @@ relative-path = "0.4.0" | |||
11 | salsa = "0.9.0" | 11 | salsa = "0.9.0" |
12 | rustc-hash = "1.0" | 12 | rustc-hash = "1.0" |
13 | parking_lot = "0.7.0" | 13 | parking_lot = "0.7.0" |
14 | id-arena = "2.0" | ||
15 | ena = "0.11" | 14 | ena = "0.11" |
16 | ra_syntax = { path = "../ra_syntax" } | 15 | ra_syntax = { path = "../ra_syntax" } |
16 | ra_arena = { path = "../ra_arena" } | ||
17 | ra_editor = { path = "../ra_editor" } | 17 | ra_editor = { path = "../ra_editor" } |
18 | ra_db = { path = "../ra_db" } | 18 | ra_db = { path = "../ra_db" } |
19 | test_utils = { path = "../test_utils" } | 19 | test_utils = { path = "../test_utils" } |
diff --git a/crates/ra_hir/src/arena.rs b/crates/ra_hir/src/arena.rs deleted file mode 100644 index d4f9d9cb9..000000000 --- a/crates/ra_hir/src/arena.rs +++ /dev/null | |||
@@ -1,66 +0,0 @@ | |||
1 | //! A simple id-based arena, similar to https://github.com/fitzgen/id-arena. | ||
2 | //! We use our own version for more compact id's and to allow inherent impls | ||
3 | //! on Ids. | ||
4 | |||
5 | use std::{ | ||
6 | fmt, | ||
7 | hash::{Hash, Hasher}, | ||
8 | marker::PhantomData, | ||
9 | }; | ||
10 | |||
11 | pub struct Id<T> { | ||
12 | idx: u32, | ||
13 | _ty: PhantomData<fn() -> T>, | ||
14 | } | ||
15 | |||
16 | impl<T> fmt::Debug for Id<T> { | ||
17 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | ||
18 | f.debug_tuple("Id").field(&self.idx).finish() | ||
19 | } | ||
20 | } | ||
21 | impl<T> Copy for Id<T> {} | ||
22 | impl<T> Clone for Id<T> { | ||
23 | fn clone(&self) -> Id<T> { | ||
24 | *self | ||
25 | } | ||
26 | } | ||
27 | |||
28 | impl<T> PartialEq for Id<T> { | ||
29 | fn eq(&self, other: &Id<T>) -> bool { | ||
30 | self.idx == other.idx | ||
31 | } | ||
32 | } | ||
33 | |||
34 | impl<T> Eq for Id<T> {} | ||
35 | |||
36 | impl<T> Hash for Id<T> { | ||
37 | fn hash<H: Hasher>(&self, h: &mut H) { | ||
38 | self.idx.hash(h); | ||
39 | } | ||
40 | } | ||
41 | |||
42 | #[derive(Debug, PartialEq, Eq)] | ||
43 | pub(crate) struct ArenaBehavior<T> { | ||
44 | _ty: PhantomData<T>, | ||
45 | } | ||
46 | |||
47 | impl<T> id_arena::ArenaBehavior for ArenaBehavior<T> { | ||
48 | type Id = Id<T>; | ||
49 | fn new_arena_id() -> u32 { | ||
50 | 0 | ||
51 | } | ||
52 | fn new_id(_arena_id: u32, index: usize) -> Id<T> { | ||
53 | Id { | ||
54 | idx: index as u32, | ||
55 | _ty: PhantomData, | ||
56 | } | ||
57 | } | ||
58 | fn index(id: Id<T>) -> usize { | ||
59 | id.idx as usize | ||
60 | } | ||
61 | fn arena_id(_id: Id<T>) -> u32 { | ||
62 | 0 | ||
63 | } | ||
64 | } | ||
65 | |||
66 | pub(crate) type Arena<T> = id_arena::Arena<T, ArenaBehavior<T>>; | ||
diff --git a/crates/ra_hir/src/function/scope.rs b/crates/ra_hir/src/function/scope.rs index 3e4cfad0c..42bfe4f32 100644 --- a/crates/ra_hir/src/function/scope.rs +++ b/crates/ra_hir/src/function/scope.rs | |||
@@ -5,19 +5,19 @@ use ra_syntax::{ | |||
5 | algo::generate, | 5 | algo::generate, |
6 | ast::{self, ArgListOwner, LoopBodyOwner, NameOwner}, | 6 | ast::{self, ArgListOwner, LoopBodyOwner, NameOwner}, |
7 | }; | 7 | }; |
8 | use ra_arena::{Arena, RawId, impl_arena_id}; | ||
8 | use ra_db::LocalSyntaxPtr; | 9 | use ra_db::LocalSyntaxPtr; |
9 | 10 | ||
10 | use crate::{ | 11 | use crate::{Name, AsName}; |
11 | arena::{Arena, Id}, | ||
12 | Name, AsName, | ||
13 | }; | ||
14 | 12 | ||
15 | pub(crate) type ScopeId = Id<ScopeData>; | 13 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
14 | pub struct ScopeId(RawId); | ||
15 | impl_arena_id!(ScopeId); | ||
16 | 16 | ||
17 | #[derive(Debug, PartialEq, Eq)] | 17 | #[derive(Debug, PartialEq, Eq)] |
18 | pub struct FnScopes { | 18 | pub struct FnScopes { |
19 | pub self_param: Option<LocalSyntaxPtr>, | 19 | pub self_param: Option<LocalSyntaxPtr>, |
20 | scopes: Arena<ScopeData>, | 20 | scopes: Arena<ScopeId, ScopeData>, |
21 | scope_for: FxHashMap<LocalSyntaxPtr, ScopeId>, | 21 | scope_for: FxHashMap<LocalSyntaxPtr, ScopeId>, |
22 | } | 22 | } |
23 | 23 | ||
diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 4c7ebe3ea..66adacc7d 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs | |||
@@ -1,10 +1,8 @@ | |||
1 | use ra_db::{SourceRootId, LocationIntener, Cancelable, FileId}; | 1 | use ra_db::{SourceRootId, LocationIntener, Cancelable, FileId}; |
2 | use ra_syntax::{SourceFileNode, SyntaxKind, SyntaxNode, SyntaxNodeRef, SourceFile, AstNode, ast}; | 2 | use ra_syntax::{SourceFileNode, SyntaxKind, SyntaxNode, SyntaxNodeRef, SourceFile, AstNode, ast}; |
3 | use ra_arena::{Arena, RawId, impl_arena_id}; | ||
3 | 4 | ||
4 | use crate::{ | 5 | use crate::{HirDatabase, PerNs, ModuleId, Module, Def, Function, Struct, Enum}; |
5 | HirDatabase, PerNs, ModuleId, Module, Def, Function, Struct, Enum, | ||
6 | arena::{Arena, Id}, | ||
7 | }; | ||
8 | 6 | ||
9 | /// hir makes a heavy use of ids: integer (u32) handlers to various things. You | 7 | /// hir makes a heavy use of ids: integer (u32) handlers to various things. You |
10 | /// can think of id as a pointer (but without a lifetime) or a file descriptor | 8 | /// can think of id as a pointer (but without a lifetime) or a file descriptor |
@@ -206,7 +204,9 @@ impl DefKind { | |||
206 | 204 | ||
207 | /// Identifier of item within a specific file. This is stable over reparses, so | 205 | /// Identifier of item within a specific file. This is stable over reparses, so |
208 | /// it's OK to use it as a salsa key/value. | 206 | /// it's OK to use it as a salsa key/value. |
209 | pub(crate) type SourceFileItemId = Id<SyntaxNode>; | 207 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
208 | pub struct SourceFileItemId(RawId); | ||
209 | impl_arena_id!(SourceFileItemId); | ||
210 | 210 | ||
211 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 211 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
212 | pub struct SourceItemId { | 212 | pub struct SourceItemId { |
@@ -219,7 +219,7 @@ pub struct SourceItemId { | |||
219 | #[derive(Debug, PartialEq, Eq)] | 219 | #[derive(Debug, PartialEq, Eq)] |
220 | pub struct SourceFileItems { | 220 | pub struct SourceFileItems { |
221 | file_id: HirFileId, | 221 | file_id: HirFileId, |
222 | arena: Arena<SyntaxNode>, | 222 | arena: Arena<SourceFileItemId, SyntaxNode>, |
223 | } | 223 | } |
224 | 224 | ||
225 | impl SourceFileItems { | 225 | impl SourceFileItems { |
diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 8ee52a466..344b543b6 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs | |||
@@ -19,7 +19,6 @@ pub mod db; | |||
19 | mod mock; | 19 | mod mock; |
20 | mod query_definitions; | 20 | mod query_definitions; |
21 | mod path; | 21 | mod path; |
22 | mod arena; | ||
23 | pub mod source_binder; | 22 | pub mod source_binder; |
24 | 23 | ||
25 | mod ids; | 24 | mod ids; |
diff --git a/crates/ra_hir/src/module.rs b/crates/ra_hir/src/module.rs index a53b69d20..c70dc54dd 100644 --- a/crates/ra_hir/src/module.rs +++ b/crates/ra_hir/src/module.rs | |||
@@ -9,6 +9,7 @@ use ra_syntax::{ | |||
9 | ast::{self, AstNode, NameOwner}, | 9 | ast::{self, AstNode, NameOwner}, |
10 | SyntaxNode, | 10 | SyntaxNode, |
11 | }; | 11 | }; |
12 | use ra_arena::{Arena, RawId, impl_arena_id}; | ||
12 | use ra_db::{SourceRootId, FileId, Cancelable}; | 13 | use ra_db::{SourceRootId, FileId, Cancelable}; |
13 | use relative_path::RelativePathBuf; | 14 | use relative_path::RelativePathBuf; |
14 | 15 | ||
@@ -16,7 +17,6 @@ use crate::{ | |||
16 | Def, DefKind, DefLoc, DefId, | 17 | Def, DefKind, DefLoc, DefId, |
17 | Name, Path, PathKind, HirDatabase, SourceItemId, SourceFileItemId, Crate, | 18 | Name, Path, PathKind, HirDatabase, SourceItemId, SourceFileItemId, Crate, |
18 | HirFileId, | 19 | HirFileId, |
19 | arena::{Arena, Id}, | ||
20 | }; | 20 | }; |
21 | 21 | ||
22 | pub use self::nameres::{ModuleScope, Resolution, Namespace, PerNs}; | 22 | pub use self::nameres::{ModuleScope, Resolution, Namespace, PerNs}; |
@@ -173,6 +173,14 @@ impl Module { | |||
173 | } | 173 | } |
174 | } | 174 | } |
175 | 175 | ||
176 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | ||
177 | pub struct ModuleId(RawId); | ||
178 | impl_arena_id!(ModuleId); | ||
179 | |||
180 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | ||
181 | pub struct LinkId(RawId); | ||
182 | impl_arena_id!(LinkId); | ||
183 | |||
176 | /// Physically, rust source is organized as a set of files, but logically it is | 184 | /// Physically, rust source is organized as a set of files, but logically it is |
177 | /// organized as a tree of modules. Usually, a single file corresponds to a | 185 | /// organized as a tree of modules. Usually, a single file corresponds to a |
178 | /// single module, but it is not nessary the case. | 186 | /// single module, but it is not nessary the case. |
@@ -182,8 +190,8 @@ impl Module { | |||
182 | /// always have one parent). | 190 | /// always have one parent). |
183 | #[derive(Default, Debug, PartialEq, Eq)] | 191 | #[derive(Default, Debug, PartialEq, Eq)] |
184 | pub struct ModuleTree { | 192 | pub struct ModuleTree { |
185 | mods: Arena<ModuleData>, | 193 | mods: Arena<ModuleId, ModuleData>, |
186 | links: Arena<LinkData>, | 194 | links: Arena<LinkId, LinkData>, |
187 | } | 195 | } |
188 | 196 | ||
189 | impl ModuleTree { | 197 | impl ModuleTree { |
@@ -210,9 +218,6 @@ pub(crate) enum ModuleSourceNode { | |||
210 | Module(ast::ModuleNode), | 218 | Module(ast::ModuleNode), |
211 | } | 219 | } |
212 | 220 | ||
213 | pub type ModuleId = Id<ModuleData>; | ||
214 | type LinkId = Id<LinkData>; | ||
215 | |||
216 | #[derive(Clone, Debug, Hash, PartialEq, Eq)] | 221 | #[derive(Clone, Debug, Hash, PartialEq, Eq)] |
217 | pub enum Problem { | 222 | pub enum Problem { |
218 | UnresolvedModule { | 223 | UnresolvedModule { |