aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/ra_hir_def/src/item_tree.rs152
1 files changed, 76 insertions, 76 deletions
diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs
index 31f3c4bd8..d7bc64e6c 100644
--- a/crates/ra_hir_def/src/item_tree.rs
+++ b/crates/ra_hir_def/src/item_tree.rs
@@ -23,6 +23,7 @@ use hir_expand::{
23use ra_arena::{Arena, Idx, RawId}; 23use ra_arena::{Arena, Idx, RawId};
24use ra_syntax::{ast, match_ast}; 24use ra_syntax::{ast, match_ast};
25use rustc_hash::FxHashMap; 25use rustc_hash::FxHashMap;
26use smallvec::SmallVec;
26use test_utils::mark; 27use test_utils::mark;
27 28
28use crate::{ 29use crate::{
@@ -33,26 +34,6 @@ use crate::{
33 type_ref::{Mutability, TypeBound, TypeRef}, 34 type_ref::{Mutability, TypeBound, TypeRef},
34 visibility::RawVisibility, 35 visibility::RawVisibility,
35}; 36};
36use smallvec::SmallVec;
37
38#[derive(Default, Debug, Eq, PartialEq)]
39struct ItemVisibilities {
40 arena: Arena<RawVisibility>,
41}
42
43impl ItemVisibilities {
44 fn alloc(&mut self, vis: RawVisibility) -> RawVisibilityId {
45 match &vis {
46 RawVisibility::Public => RawVisibilityId::PUB,
47 RawVisibility::Module(path) if path.segments.is_empty() => match &path.kind {
48 PathKind::Super(0) => RawVisibilityId::PRIV,
49 PathKind::Crate => RawVisibilityId::PUB_CRATE,
50 _ => RawVisibilityId(self.arena.alloc(vis).into_raw().into()),
51 },
52 _ => RawVisibilityId(self.arena.alloc(vis).into_raw().into()),
53 }
54 }
55}
56 37
57#[derive(Copy, Clone, Eq, PartialEq)] 38#[derive(Copy, Clone, Eq, PartialEq)]
58pub struct RawVisibilityId(u32); 39pub struct RawVisibilityId(u32);
@@ -76,21 +57,6 @@ impl fmt::Debug for RawVisibilityId {
76 } 57 }
77} 58}
78 59
79#[derive(Default, Debug, Eq, PartialEq)]
80struct GenericParamsStorage {
81 arena: Arena<GenericParams>,
82}
83
84impl GenericParamsStorage {
85 fn alloc(&mut self, params: GenericParams) -> GenericParamsId {
86 if params.types.is_empty() && params.where_predicates.is_empty() {
87 return GenericParamsId::EMPTY;
88 }
89
90 GenericParamsId(self.arena.alloc(params).into_raw().into())
91 }
92}
93
94#[derive(Debug, Copy, Clone, Eq, PartialEq)] 60#[derive(Debug, Copy, Clone, Eq, PartialEq)]
95pub struct GenericParamsId(u32); 61pub struct GenericParamsId(u32);
96 62
@@ -98,47 +64,6 @@ impl GenericParamsId {
98 pub const EMPTY: Self = GenericParamsId(u32::max_value()); 64 pub const EMPTY: Self = GenericParamsId(u32::max_value());
99} 65}
100 66
101static VIS_PUB: RawVisibility = RawVisibility::Public;
102static VIS_PRIV: RawVisibility =
103 RawVisibility::Module(ModPath { kind: PathKind::Super(0), segments: Vec::new() });
104static VIS_PUB_CRATE: RawVisibility =
105 RawVisibility::Module(ModPath { kind: PathKind::Crate, segments: Vec::new() });
106
107static EMPTY_GENERICS: GenericParams =
108 GenericParams { types: Arena::new(), where_predicates: Vec::new() };
109
110#[derive(Default, Debug, Eq, PartialEq)]
111struct ItemTreeData {
112 imports: Arena<Import>,
113 extern_crates: Arena<ExternCrate>,
114 functions: Arena<Function>,
115 structs: Arena<Struct>,
116 fields: Arena<Field>,
117 unions: Arena<Union>,
118 enums: Arena<Enum>,
119 variants: Arena<Variant>,
120 consts: Arena<Const>,
121 statics: Arena<Static>,
122 traits: Arena<Trait>,
123 impls: Arena<Impl>,
124 type_aliases: Arena<TypeAlias>,
125 mods: Arena<Mod>,
126 macro_calls: Arena<MacroCall>,
127 exprs: Arena<Expr>,
128
129 vis: ItemVisibilities,
130 generics: GenericParamsStorage,
131}
132
133#[derive(Debug, Eq, PartialEq, Hash)]
134enum AttrOwner {
135 /// Attributes on an item.
136 ModItem(ModItem),
137 /// Inner attributes of the source file.
138 TopLevel,
139 // FIXME: Store variant and field attrs, and stop reparsing them in `attrs_query`.
140}
141
142/// The item tree of a source file. 67/// The item tree of a source file.
143#[derive(Debug, Eq, PartialEq)] 68#[derive(Debug, Eq, PartialEq)]
144pub struct ItemTree { 69pub struct ItemTree {
@@ -290,6 +215,81 @@ impl ItemTree {
290 } 215 }
291} 216}
292 217
218#[derive(Default, Debug, Eq, PartialEq)]
219struct ItemVisibilities {
220 arena: Arena<RawVisibility>,
221}
222
223impl ItemVisibilities {
224 fn alloc(&mut self, vis: RawVisibility) -> RawVisibilityId {
225 match &vis {
226 RawVisibility::Public => RawVisibilityId::PUB,
227 RawVisibility::Module(path) if path.segments.is_empty() => match &path.kind {
228 PathKind::Super(0) => RawVisibilityId::PRIV,
229 PathKind::Crate => RawVisibilityId::PUB_CRATE,
230 _ => RawVisibilityId(self.arena.alloc(vis).into_raw().into()),
231 },
232 _ => RawVisibilityId(self.arena.alloc(vis).into_raw().into()),
233 }
234 }
235}
236
237static VIS_PUB: RawVisibility = RawVisibility::Public;
238static VIS_PRIV: RawVisibility =
239 RawVisibility::Module(ModPath { kind: PathKind::Super(0), segments: Vec::new() });
240static VIS_PUB_CRATE: RawVisibility =
241 RawVisibility::Module(ModPath { kind: PathKind::Crate, segments: Vec::new() });
242
243#[derive(Default, Debug, Eq, PartialEq)]
244struct GenericParamsStorage {
245 arena: Arena<GenericParams>,
246}
247
248impl GenericParamsStorage {
249 fn alloc(&mut self, params: GenericParams) -> GenericParamsId {
250 if params.types.is_empty() && params.where_predicates.is_empty() {
251 return GenericParamsId::EMPTY;
252 }
253
254 GenericParamsId(self.arena.alloc(params).into_raw().into())
255 }
256}
257
258static EMPTY_GENERICS: GenericParams =
259 GenericParams { types: Arena::new(), where_predicates: Vec::new() };
260
261#[derive(Default, Debug, Eq, PartialEq)]
262struct ItemTreeData {
263 imports: Arena<Import>,
264 extern_crates: Arena<ExternCrate>,
265 functions: Arena<Function>,
266 structs: Arena<Struct>,
267 fields: Arena<Field>,
268 unions: Arena<Union>,
269 enums: Arena<Enum>,
270 variants: Arena<Variant>,
271 consts: Arena<Const>,
272 statics: Arena<Static>,
273 traits: Arena<Trait>,
274 impls: Arena<Impl>,
275 type_aliases: Arena<TypeAlias>,
276 mods: Arena<Mod>,
277 macro_calls: Arena<MacroCall>,
278 exprs: Arena<Expr>,
279
280 vis: ItemVisibilities,
281 generics: GenericParamsStorage,
282}
283
284#[derive(Debug, Eq, PartialEq, Hash)]
285enum AttrOwner {
286 /// Attributes on an item.
287 ModItem(ModItem),
288 /// Inner attributes of the source file.
289 TopLevel,
290 // FIXME: Store variant and field attrs, and stop reparsing them in `attrs_query`.
291}
292
293/// Trait implemented by all nodes in the item tree. 293/// Trait implemented by all nodes in the item tree.
294pub trait ItemTreeNode: Clone { 294pub trait ItemTreeNode: Clone {
295 type Source: AstNode + Into<ast::ModuleItem>; 295 type Source: AstNode + Into<ast::ModuleItem>;