diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-03-19 17:47:43 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2020-03-19 17:47:43 +0000 |
commit | 1ba03c6995015b3143a417ed07437f0c9028a97d (patch) | |
tree | ce3eb047dd9fe9005750a3b1417d95b1aa8fe01e /crates/ra_hir_def | |
parent | 988f1dda6bde576ec2457dd97a7525014609c771 (diff) | |
parent | f840fcb2f525c13809d6a736e434155edf075a06 (diff) |
Merge #3656
3656: Simplify arenas r=matklad a=matklad
At the moment, Arena is paranetrized by two types: index and data. The original motivation was to allow index to be defined in the downstream crate, so that you can add inherent impls to the index.
However, it seems like we've never actually used that capability, so perhaps we should switch to a generic Index impl? This PR tries this out, switching only `raw.rs` and parts of `hir_def`.
wdyt?
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir_def')
-rw-r--r-- | crates/ra_hir_def/src/adt.rs | 18 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 6 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/scope.rs | 8 | ||||
-rw-r--r-- | crates/ra_hir_def/src/expr.rs | 17 | ||||
-rw-r--r-- | crates/ra_hir_def/src/generics.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_def/src/lib.rs | 18 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 88 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/mod_resolution.rs | 8 | ||||
-rw-r--r-- | crates/ra_hir_def/src/trace.rs | 22 |
12 files changed, 85 insertions, 112 deletions
diff --git a/crates/ra_hir_def/src/adt.rs b/crates/ra_hir_def/src/adt.rs index d55c49938..de07fc952 100644 --- a/crates/ra_hir_def/src/adt.rs +++ b/crates/ra_hir_def/src/adt.rs | |||
@@ -27,7 +27,7 @@ pub struct StructData { | |||
27 | #[derive(Debug, Clone, PartialEq, Eq)] | 27 | #[derive(Debug, Clone, PartialEq, Eq)] |
28 | pub struct EnumData { | 28 | pub struct EnumData { |
29 | pub name: Name, | 29 | pub name: Name, |
30 | pub variants: Arena<LocalEnumVariantId, EnumVariantData>, | 30 | pub variants: Arena<EnumVariantData>, |
31 | } | 31 | } |
32 | 32 | ||
33 | #[derive(Debug, Clone, PartialEq, Eq)] | 33 | #[derive(Debug, Clone, PartialEq, Eq)] |
@@ -38,8 +38,8 @@ pub struct EnumVariantData { | |||
38 | 38 | ||
39 | #[derive(Debug, Clone, PartialEq, Eq)] | 39 | #[derive(Debug, Clone, PartialEq, Eq)] |
40 | pub enum VariantData { | 40 | pub enum VariantData { |
41 | Record(Arena<LocalStructFieldId, StructFieldData>), | 41 | Record(Arena<StructFieldData>), |
42 | Tuple(Arena<LocalStructFieldId, StructFieldData>), | 42 | Tuple(Arena<StructFieldData>), |
43 | Unit, | 43 | Unit, |
44 | } | 44 | } |
45 | 45 | ||
@@ -104,7 +104,7 @@ impl HasChildSource for EnumId { | |||
104 | 104 | ||
105 | fn lower_enum( | 105 | fn lower_enum( |
106 | db: &dyn DefDatabase, | 106 | db: &dyn DefDatabase, |
107 | trace: &mut Trace<LocalEnumVariantId, EnumVariantData, ast::EnumVariant>, | 107 | trace: &mut Trace<EnumVariantData, ast::EnumVariant>, |
108 | ast: &InFile<ast::EnumDef>, | 108 | ast: &InFile<ast::EnumDef>, |
109 | ) { | 109 | ) { |
110 | for var in ast.value.variant_list().into_iter().flat_map(|it| it.variants()) { | 110 | for var in ast.value.variant_list().into_iter().flat_map(|it| it.variants()) { |
@@ -128,8 +128,8 @@ impl VariantData { | |||
128 | } | 128 | } |
129 | } | 129 | } |
130 | 130 | ||
131 | pub fn fields(&self) -> &Arena<LocalStructFieldId, StructFieldData> { | 131 | pub fn fields(&self) -> &Arena<StructFieldData> { |
132 | const EMPTY: &Arena<LocalStructFieldId, StructFieldData> = &Arena::new(); | 132 | const EMPTY: &Arena<StructFieldData> = &Arena::new(); |
133 | match &self { | 133 | match &self { |
134 | VariantData::Record(fields) | VariantData::Tuple(fields) => fields, | 134 | VariantData::Record(fields) | VariantData::Tuple(fields) => fields, |
135 | _ => EMPTY, | 135 | _ => EMPTY, |
@@ -183,11 +183,7 @@ pub enum StructKind { | |||
183 | 183 | ||
184 | fn lower_struct( | 184 | fn lower_struct( |
185 | db: &dyn DefDatabase, | 185 | db: &dyn DefDatabase, |
186 | trace: &mut Trace< | 186 | trace: &mut Trace<StructFieldData, Either<ast::TupleFieldDef, ast::RecordFieldDef>>, |
187 | LocalStructFieldId, | ||
188 | StructFieldData, | ||
189 | Either<ast::TupleFieldDef, ast::RecordFieldDef>, | ||
190 | >, | ||
191 | ast: &InFile<ast::StructKind>, | 187 | ast: &InFile<ast::StructKind>, |
192 | ) -> StructKind { | 188 | ) -> StructKind { |
193 | match &ast.value { | 189 | match &ast.value { |
diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 34561ee73..27a297e8b 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs | |||
@@ -121,8 +121,8 @@ pub(crate) struct Mark { | |||
121 | /// The body of an item (function, const etc.). | 121 | /// The body of an item (function, const etc.). |
122 | #[derive(Debug, Eq, PartialEq)] | 122 | #[derive(Debug, Eq, PartialEq)] |
123 | pub struct Body { | 123 | pub struct Body { |
124 | pub exprs: Arena<ExprId, Expr>, | 124 | pub exprs: Arena<Expr>, |
125 | pub pats: Arena<PatId, Pat>, | 125 | pub pats: Arena<Pat>, |
126 | /// The patterns for the function's parameters. While the parameter types are | 126 | /// The patterns for the function's parameters. While the parameter types are |
127 | /// part of the function signature, the patterns are not (they don't change | 127 | /// part of the function signature, the patterns are not (they don't change |
128 | /// the external type of the function). | 128 | /// the external type of the function). |
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index 6238de606..e8c58ed32 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -24,8 +24,8 @@ use crate::{ | |||
24 | builtin_type::{BuiltinFloat, BuiltinInt}, | 24 | builtin_type::{BuiltinFloat, BuiltinInt}, |
25 | db::DefDatabase, | 25 | db::DefDatabase, |
26 | expr::{ | 26 | expr::{ |
27 | ArithOp, Array, BinaryOp, BindingAnnotation, CmpOp, Expr, ExprId, Literal, LogicOp, | 27 | dummy_expr_id, ArithOp, Array, BinaryOp, BindingAnnotation, CmpOp, Expr, ExprId, Literal, |
28 | MatchArm, Ordering, Pat, PatId, RecordFieldPat, RecordLitField, Statement, | 28 | LogicOp, MatchArm, Ordering, Pat, PatId, RecordFieldPat, RecordLitField, Statement, |
29 | }, | 29 | }, |
30 | item_scope::BuiltinShadowMode, | 30 | item_scope::BuiltinShadowMode, |
31 | path::GenericArgs, | 31 | path::GenericArgs, |
@@ -51,7 +51,7 @@ pub(super) fn lower( | |||
51 | exprs: Arena::default(), | 51 | exprs: Arena::default(), |
52 | pats: Arena::default(), | 52 | pats: Arena::default(), |
53 | params: Vec::new(), | 53 | params: Vec::new(), |
54 | body_expr: ExprId::dummy(), | 54 | body_expr: dummy_expr_id(), |
55 | item_scope: Default::default(), | 55 | item_scope: Default::default(), |
56 | }, | 56 | }, |
57 | } | 57 | } |
diff --git a/crates/ra_hir_def/src/body/scope.rs b/crates/ra_hir_def/src/body/scope.rs index 7c3db8869..4d489f692 100644 --- a/crates/ra_hir_def/src/body/scope.rs +++ b/crates/ra_hir_def/src/body/scope.rs | |||
@@ -2,7 +2,7 @@ | |||
2 | use std::sync::Arc; | 2 | use std::sync::Arc; |
3 | 3 | ||
4 | use hir_expand::name::Name; | 4 | use hir_expand::name::Name; |
5 | use ra_arena::{impl_arena_id, Arena, RawId}; | 5 | use ra_arena::{Arena, Idx}; |
6 | use rustc_hash::FxHashMap; | 6 | use rustc_hash::FxHashMap; |
7 | 7 | ||
8 | use crate::{ | 8 | use crate::{ |
@@ -12,13 +12,11 @@ use crate::{ | |||
12 | DefWithBodyId, | 12 | DefWithBodyId, |
13 | }; | 13 | }; |
14 | 14 | ||
15 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 15 | pub type ScopeId = Idx<ScopeData>; |
16 | pub struct ScopeId(RawId); | ||
17 | impl_arena_id!(ScopeId); | ||
18 | 16 | ||
19 | #[derive(Debug, PartialEq, Eq)] | 17 | #[derive(Debug, PartialEq, Eq)] |
20 | pub struct ExprScopes { | 18 | pub struct ExprScopes { |
21 | scopes: Arena<ScopeId, ScopeData>, | 19 | scopes: Arena<ScopeData>, |
22 | scope_by_expr: FxHashMap<ExprId, ScopeId>, | 20 | scope_by_expr: FxHashMap<ExprId, ScopeId>, |
23 | } | 21 | } |
24 | 22 | ||
diff --git a/crates/ra_hir_def/src/expr.rs b/crates/ra_hir_def/src/expr.rs index 66d004717..197bbe9bd 100644 --- a/crates/ra_hir_def/src/expr.rs +++ b/crates/ra_hir_def/src/expr.rs | |||
@@ -13,7 +13,7 @@ | |||
13 | //! See also a neighboring `body` module. | 13 | //! See also a neighboring `body` module. |
14 | 14 | ||
15 | use hir_expand::name::Name; | 15 | use hir_expand::name::Name; |
16 | use ra_arena::{impl_arena_id, RawId}; | 16 | use ra_arena::{Idx, RawId}; |
17 | use ra_syntax::ast::RangeOp; | 17 | use ra_syntax::ast::RangeOp; |
18 | 18 | ||
19 | use crate::{ | 19 | use crate::{ |
@@ -22,19 +22,12 @@ use crate::{ | |||
22 | type_ref::{Mutability, TypeRef}, | 22 | type_ref::{Mutability, TypeRef}, |
23 | }; | 23 | }; |
24 | 24 | ||
25 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 25 | pub type ExprId = Idx<Expr>; |
26 | pub struct ExprId(RawId); | 26 | pub(crate) fn dummy_expr_id() -> ExprId { |
27 | impl_arena_id!(ExprId); | 27 | ExprId::from_raw(RawId::from(!0)) |
28 | |||
29 | impl ExprId { | ||
30 | pub fn dummy() -> ExprId { | ||
31 | ExprId((!0).into()) | ||
32 | } | ||
33 | } | 28 | } |
34 | 29 | ||
35 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 30 | pub type PatId = Idx<Pat>; |
36 | pub struct PatId(RawId); | ||
37 | impl_arena_id!(PatId); | ||
38 | 31 | ||
39 | #[derive(Debug, Clone, Eq, PartialEq)] | 32 | #[derive(Debug, Clone, Eq, PartialEq)] |
40 | pub enum Literal { | 33 | pub enum Literal { |
diff --git a/crates/ra_hir_def/src/generics.rs b/crates/ra_hir_def/src/generics.rs index 24adc8153..b687ce2b2 100644 --- a/crates/ra_hir_def/src/generics.rs +++ b/crates/ra_hir_def/src/generics.rs | |||
@@ -43,7 +43,7 @@ pub enum TypeParamProvenance { | |||
43 | /// Data about the generic parameters of a function, struct, impl, etc. | 43 | /// Data about the generic parameters of a function, struct, impl, etc. |
44 | #[derive(Clone, PartialEq, Eq, Debug)] | 44 | #[derive(Clone, PartialEq, Eq, Debug)] |
45 | pub struct GenericParams { | 45 | pub struct GenericParams { |
46 | pub types: Arena<LocalTypeParamId, TypeParamData>, | 46 | pub types: Arena<TypeParamData>, |
47 | // lifetimes: Arena<LocalLifetimeParamId, LifetimeParamData>, | 47 | // lifetimes: Arena<LocalLifetimeParamId, LifetimeParamData>, |
48 | pub where_predicates: Vec<WherePredicate>, | 48 | pub where_predicates: Vec<WherePredicate>, |
49 | } | 49 | } |
diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index d0f043ed0..516dd773e 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs | |||
@@ -50,7 +50,7 @@ use hir_expand::{ | |||
50 | ast_id_map::FileAstId, eager::expand_eager_macro, hygiene::Hygiene, AstId, HirFileId, InFile, | 50 | ast_id_map::FileAstId, eager::expand_eager_macro, hygiene::Hygiene, AstId, HirFileId, InFile, |
51 | MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, | 51 | MacroCallId, MacroCallKind, MacroDefId, MacroDefKind, |
52 | }; | 52 | }; |
53 | use ra_arena::{impl_arena_id, RawId}; | 53 | use ra_arena::Idx; |
54 | use ra_db::{impl_intern_key, salsa, CrateId}; | 54 | use ra_db::{impl_intern_key, salsa, CrateId}; |
55 | use ra_syntax::{ast, AstNode}; | 55 | use ra_syntax::{ast, AstNode}; |
56 | 56 | ||
@@ -64,9 +64,7 @@ pub struct ModuleId { | |||
64 | } | 64 | } |
65 | 65 | ||
66 | /// An ID of a module, **local** to a specific crate | 66 | /// An ID of a module, **local** to a specific crate |
67 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 67 | pub type LocalModuleId = Idx<nameres::ModuleData>; |
68 | pub struct LocalModuleId(RawId); | ||
69 | impl_arena_id!(LocalModuleId); | ||
70 | 68 | ||
71 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 69 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
72 | pub struct ItemLoc<N: AstNode> { | 70 | pub struct ItemLoc<N: AstNode> { |
@@ -127,9 +125,7 @@ pub struct EnumVariantId { | |||
127 | pub local_id: LocalEnumVariantId, | 125 | pub local_id: LocalEnumVariantId, |
128 | } | 126 | } |
129 | 127 | ||
130 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 128 | pub type LocalEnumVariantId = Idx<adt::EnumVariantData>; |
131 | pub struct LocalEnumVariantId(RawId); | ||
132 | impl_arena_id!(LocalEnumVariantId); | ||
133 | 129 | ||
134 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 130 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
135 | pub struct StructFieldId { | 131 | pub struct StructFieldId { |
@@ -137,9 +133,7 @@ pub struct StructFieldId { | |||
137 | pub local_id: LocalStructFieldId, | 133 | pub local_id: LocalStructFieldId, |
138 | } | 134 | } |
139 | 135 | ||
140 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 136 | pub type LocalStructFieldId = Idx<adt::StructFieldData>; |
141 | pub struct LocalStructFieldId(RawId); | ||
142 | impl_arena_id!(LocalStructFieldId); | ||
143 | 137 | ||
144 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 138 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
145 | pub struct ConstId(salsa::InternId); | 139 | pub struct ConstId(salsa::InternId); |
@@ -172,9 +166,7 @@ pub struct TypeParamId { | |||
172 | pub local_id: LocalTypeParamId, | 166 | pub local_id: LocalTypeParamId, |
173 | } | 167 | } |
174 | 168 | ||
175 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 169 | pub type LocalTypeParamId = Idx<generics::TypeParamData>; |
176 | pub struct LocalTypeParamId(RawId); | ||
177 | impl_arena_id!(LocalTypeParamId); | ||
178 | 170 | ||
179 | macro_rules! impl_froms { | 171 | macro_rules! impl_froms { |
180 | ($e:ident: $($v:ident $(($($sv:ident),*))?),*) => { | 172 | ($e:ident: $($v:ident $(($($sv:ident),*))?),*) => { |
diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index be53313ee..40bdc34f5 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs | |||
@@ -77,7 +77,7 @@ use crate::{ | |||
77 | #[derive(Debug, PartialEq, Eq)] | 77 | #[derive(Debug, PartialEq, Eq)] |
78 | pub struct CrateDefMap { | 78 | pub struct CrateDefMap { |
79 | pub root: LocalModuleId, | 79 | pub root: LocalModuleId, |
80 | pub modules: Arena<LocalModuleId, ModuleData>, | 80 | pub modules: Arena<ModuleData>, |
81 | pub(crate) krate: CrateId, | 81 | pub(crate) krate: CrateId, |
82 | /// The prelude module for this crate. This either comes from an import | 82 | /// The prelude module for this crate. This either comes from an import |
83 | /// marked with the `prelude_import` attribute, or (in the normal case) from | 83 | /// marked with the `prelude_import` attribute, or (in the normal case) from |
@@ -187,7 +187,7 @@ impl CrateDefMap { | |||
187 | }); | 187 | }); |
188 | let def_map = { | 188 | let def_map = { |
189 | let edition = db.crate_graph()[krate].edition; | 189 | let edition = db.crate_graph()[krate].edition; |
190 | let mut modules: Arena<LocalModuleId, ModuleData> = Arena::default(); | 190 | let mut modules: Arena<ModuleData> = Arena::default(); |
191 | let root = modules.alloc(ModuleData::default()); | 191 | let root = modules.alloc(ModuleData::default()); |
192 | CrateDefMap { | 192 | CrateDefMap { |
193 | krate, | 193 | krate, |
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 7a042e69f..5b292c250 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -966,7 +966,7 @@ mod tests { | |||
966 | 966 | ||
967 | let def_map = { | 967 | let def_map = { |
968 | let edition = db.crate_graph()[krate].edition; | 968 | let edition = db.crate_graph()[krate].edition; |
969 | let mut modules: Arena<LocalModuleId, ModuleData> = Arena::default(); | 969 | let mut modules: Arena<ModuleData> = Arena::default(); |
970 | let root = modules.alloc(ModuleData::default()); | 970 | let root = modules.alloc(ModuleData::default()); |
971 | CrateDefMap { | 971 | CrateDefMap { |
972 | krate, | 972 | krate, |
diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index 0e4931f58..1631e87b8 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs | |||
@@ -12,7 +12,7 @@ use hir_expand::{ | |||
12 | hygiene::Hygiene, | 12 | hygiene::Hygiene, |
13 | name::{AsName, Name}, | 13 | name::{AsName, Name}, |
14 | }; | 14 | }; |
15 | use ra_arena::{impl_arena_id, Arena, RawId}; | 15 | use ra_arena::{Arena, Idx}; |
16 | use ra_prof::profile; | 16 | use ra_prof::profile; |
17 | use ra_syntax::{ | 17 | use ra_syntax::{ |
18 | ast::{self, AttrsOwner, NameOwner, VisibilityOwner}, | 18 | ast::{self, AttrsOwner, NameOwner, VisibilityOwner}, |
@@ -34,11 +34,11 @@ use crate::{ | |||
34 | /// on most edits. | 34 | /// on most edits. |
35 | #[derive(Debug, Default, PartialEq, Eq)] | 35 | #[derive(Debug, Default, PartialEq, Eq)] |
36 | pub struct RawItems { | 36 | pub struct RawItems { |
37 | modules: Arena<Module, ModuleData>, | 37 | modules: Arena<ModuleData>, |
38 | imports: Arena<Import, ImportData>, | 38 | imports: Arena<ImportData>, |
39 | defs: Arena<Def, DefData>, | 39 | defs: Arena<DefData>, |
40 | macros: Arena<Macro, MacroData>, | 40 | macros: Arena<MacroData>, |
41 | impls: Arena<Impl, ImplData>, | 41 | impls: Arena<ImplData>, |
42 | /// items for top-level module | 42 | /// items for top-level module |
43 | items: Vec<RawItem>, | 43 | items: Vec<RawItem>, |
44 | } | 44 | } |
@@ -68,9 +68,9 @@ impl RawItems { | |||
68 | } | 68 | } |
69 | } | 69 | } |
70 | 70 | ||
71 | impl Index<Module> for RawItems { | 71 | impl Index<Idx<ModuleData>> for RawItems { |
72 | type Output = ModuleData; | 72 | type Output = ModuleData; |
73 | fn index(&self, idx: Module) -> &ModuleData { | 73 | fn index(&self, idx: Idx<ModuleData>) -> &ModuleData { |
74 | &self.modules[idx] | 74 | &self.modules[idx] |
75 | } | 75 | } |
76 | } | 76 | } |
@@ -82,23 +82,23 @@ impl Index<Import> for RawItems { | |||
82 | } | 82 | } |
83 | } | 83 | } |
84 | 84 | ||
85 | impl Index<Def> for RawItems { | 85 | impl Index<Idx<DefData>> for RawItems { |
86 | type Output = DefData; | 86 | type Output = DefData; |
87 | fn index(&self, idx: Def) -> &DefData { | 87 | fn index(&self, idx: Idx<DefData>) -> &DefData { |
88 | &self.defs[idx] | 88 | &self.defs[idx] |
89 | } | 89 | } |
90 | } | 90 | } |
91 | 91 | ||
92 | impl Index<Macro> for RawItems { | 92 | impl Index<Idx<MacroData>> for RawItems { |
93 | type Output = MacroData; | 93 | type Output = MacroData; |
94 | fn index(&self, idx: Macro) -> &MacroData { | 94 | fn index(&self, idx: Idx<MacroData>) -> &MacroData { |
95 | &self.macros[idx] | 95 | &self.macros[idx] |
96 | } | 96 | } |
97 | } | 97 | } |
98 | 98 | ||
99 | impl Index<Impl> for RawItems { | 99 | impl Index<Idx<ImplData>> for RawItems { |
100 | type Output = ImplData; | 100 | type Output = ImplData; |
101 | fn index(&self, idx: Impl) -> &ImplData { | 101 | fn index(&self, idx: Idx<ImplData>) -> &ImplData { |
102 | &self.impls[idx] | 102 | &self.impls[idx] |
103 | } | 103 | } |
104 | } | 104 | } |
@@ -111,17 +111,13 @@ pub(super) struct RawItem { | |||
111 | 111 | ||
112 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 112 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] |
113 | pub(super) enum RawItemKind { | 113 | pub(super) enum RawItemKind { |
114 | Module(Module), | 114 | Module(Idx<ModuleData>), |
115 | Import(Import), | 115 | Import(Import), |
116 | Def(Def), | 116 | Def(Idx<DefData>), |
117 | Macro(Macro), | 117 | Macro(Idx<MacroData>), |
118 | Impl(Impl), | 118 | Impl(Idx<ImplData>), |
119 | } | 119 | } |
120 | 120 | ||
121 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
122 | pub(super) struct Module(RawId); | ||
123 | impl_arena_id!(Module); | ||
124 | |||
125 | #[derive(Debug, PartialEq, Eq)] | 121 | #[derive(Debug, PartialEq, Eq)] |
126 | pub(super) enum ModuleData { | 122 | pub(super) enum ModuleData { |
127 | Declaration { | 123 | Declaration { |
@@ -137,9 +133,7 @@ pub(super) enum ModuleData { | |||
137 | }, | 133 | }, |
138 | } | 134 | } |
139 | 135 | ||
140 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 136 | pub(crate) type Import = Idx<ImportData>; |
141 | pub(crate) struct Import(RawId); | ||
142 | impl_arena_id!(Import); | ||
143 | 137 | ||
144 | #[derive(Debug, Clone, PartialEq, Eq)] | 138 | #[derive(Debug, Clone, PartialEq, Eq)] |
145 | pub struct ImportData { | 139 | pub struct ImportData { |
@@ -152,9 +146,7 @@ pub struct ImportData { | |||
152 | pub(super) visibility: RawVisibility, | 146 | pub(super) visibility: RawVisibility, |
153 | } | 147 | } |
154 | 148 | ||
155 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 149 | // type Def = Idx<DefData>; |
156 | pub(super) struct Def(RawId); | ||
157 | impl_arena_id!(Def); | ||
158 | 150 | ||
159 | #[derive(Debug, PartialEq, Eq)] | 151 | #[derive(Debug, PartialEq, Eq)] |
160 | pub(super) struct DefData { | 152 | pub(super) struct DefData { |
@@ -190,10 +182,6 @@ impl DefKind { | |||
190 | } | 182 | } |
191 | } | 183 | } |
192 | 184 | ||
193 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
194 | pub(super) struct Macro(RawId); | ||
195 | impl_arena_id!(Macro); | ||
196 | |||
197 | #[derive(Debug, PartialEq, Eq)] | 185 | #[derive(Debug, PartialEq, Eq)] |
198 | pub(super) struct MacroData { | 186 | pub(super) struct MacroData { |
199 | pub(super) ast_id: FileAstId<ast::MacroCall>, | 187 | pub(super) ast_id: FileAstId<ast::MacroCall>, |
@@ -203,10 +191,6 @@ pub(super) struct MacroData { | |||
203 | pub(super) builtin: bool, | 191 | pub(super) builtin: bool, |
204 | } | 192 | } |
205 | 193 | ||
206 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
207 | pub(super) struct Impl(RawId); | ||
208 | impl_arena_id!(Impl); | ||
209 | |||
210 | #[derive(Debug, PartialEq, Eq)] | 194 | #[derive(Debug, PartialEq, Eq)] |
211 | pub(super) struct ImplData { | 195 | pub(super) struct ImplData { |
212 | pub(super) ast_id: FileAstId<ast::ImplDef>, | 196 | pub(super) ast_id: FileAstId<ast::ImplDef>, |
@@ -220,7 +204,11 @@ struct RawItemsCollector { | |||
220 | } | 204 | } |
221 | 205 | ||
222 | impl RawItemsCollector { | 206 | impl RawItemsCollector { |
223 | fn process_module(&mut self, current_module: Option<Module>, body: impl ast::ModuleItemOwner) { | 207 | fn process_module( |
208 | &mut self, | ||
209 | current_module: Option<Idx<ModuleData>>, | ||
210 | body: impl ast::ModuleItemOwner, | ||
211 | ) { | ||
224 | for item_or_macro in body.items_with_macros() { | 212 | for item_or_macro in body.items_with_macros() { |
225 | match item_or_macro { | 213 | match item_or_macro { |
226 | ast::ItemOrMacro::Macro(m) => self.add_macro(current_module, m), | 214 | ast::ItemOrMacro::Macro(m) => self.add_macro(current_module, m), |
@@ -229,7 +217,7 @@ impl RawItemsCollector { | |||
229 | } | 217 | } |
230 | } | 218 | } |
231 | 219 | ||
232 | fn add_item(&mut self, current_module: Option<Module>, item: ast::ModuleItem) { | 220 | fn add_item(&mut self, current_module: Option<Idx<ModuleData>>, item: ast::ModuleItem) { |
233 | let attrs = self.parse_attrs(&item); | 221 | let attrs = self.parse_attrs(&item); |
234 | let visibility = RawVisibility::from_ast_with_hygiene(item.visibility(), &self.hygiene); | 222 | let visibility = RawVisibility::from_ast_with_hygiene(item.visibility(), &self.hygiene); |
235 | let (kind, name) = match item { | 223 | let (kind, name) = match item { |
@@ -285,7 +273,7 @@ impl RawItemsCollector { | |||
285 | } | 273 | } |
286 | } | 274 | } |
287 | 275 | ||
288 | fn add_module(&mut self, current_module: Option<Module>, module: ast::Module) { | 276 | fn add_module(&mut self, current_module: Option<Idx<ModuleData>>, module: ast::Module) { |
289 | let name = match module.name() { | 277 | let name = match module.name() { |
290 | Some(it) => it.as_name(), | 278 | Some(it) => it.as_name(), |
291 | None => return, | 279 | None => return, |
@@ -315,7 +303,7 @@ impl RawItemsCollector { | |||
315 | tested_by!(name_res_works_for_broken_modules); | 303 | tested_by!(name_res_works_for_broken_modules); |
316 | } | 304 | } |
317 | 305 | ||
318 | fn add_use_item(&mut self, current_module: Option<Module>, use_item: ast::UseItem) { | 306 | fn add_use_item(&mut self, current_module: Option<Idx<ModuleData>>, use_item: ast::UseItem) { |
319 | // FIXME: cfg_attr | 307 | // FIXME: cfg_attr |
320 | let is_prelude = use_item.has_atom_attr("prelude_import"); | 308 | let is_prelude = use_item.has_atom_attr("prelude_import"); |
321 | let attrs = self.parse_attrs(&use_item); | 309 | let attrs = self.parse_attrs(&use_item); |
@@ -345,7 +333,7 @@ impl RawItemsCollector { | |||
345 | 333 | ||
346 | fn add_extern_crate_item( | 334 | fn add_extern_crate_item( |
347 | &mut self, | 335 | &mut self, |
348 | current_module: Option<Module>, | 336 | current_module: Option<Idx<ModuleData>>, |
349 | extern_crate: ast::ExternCrateItem, | 337 | extern_crate: ast::ExternCrateItem, |
350 | ) { | 338 | ) { |
351 | if let Some(name_ref) = extern_crate.name_ref() { | 339 | if let Some(name_ref) = extern_crate.name_ref() { |
@@ -371,7 +359,7 @@ impl RawItemsCollector { | |||
371 | } | 359 | } |
372 | } | 360 | } |
373 | 361 | ||
374 | fn add_macro(&mut self, current_module: Option<Module>, m: ast::MacroCall) { | 362 | fn add_macro(&mut self, current_module: Option<Idx<ModuleData>>, m: ast::MacroCall) { |
375 | let attrs = self.parse_attrs(&m); | 363 | let attrs = self.parse_attrs(&m); |
376 | let path = match m.path().and_then(|path| ModPath::from_src(path, &self.hygiene)) { | 364 | let path = match m.path().and_then(|path| ModPath::from_src(path, &self.hygiene)) { |
377 | Some(it) => it, | 365 | Some(it) => it, |
@@ -391,19 +379,29 @@ impl RawItemsCollector { | |||
391 | self.push_item(current_module, attrs, RawItemKind::Macro(m)); | 379 | self.push_item(current_module, attrs, RawItemKind::Macro(m)); |
392 | } | 380 | } |
393 | 381 | ||
394 | fn add_impl(&mut self, current_module: Option<Module>, imp: ast::ImplDef) { | 382 | fn add_impl(&mut self, current_module: Option<Idx<ModuleData>>, imp: ast::ImplDef) { |
395 | let attrs = self.parse_attrs(&imp); | 383 | let attrs = self.parse_attrs(&imp); |
396 | let ast_id = self.source_ast_id_map.ast_id(&imp); | 384 | let ast_id = self.source_ast_id_map.ast_id(&imp); |
397 | let imp = self.raw_items.impls.alloc(ImplData { ast_id }); | 385 | let imp = self.raw_items.impls.alloc(ImplData { ast_id }); |
398 | self.push_item(current_module, attrs, RawItemKind::Impl(imp)) | 386 | self.push_item(current_module, attrs, RawItemKind::Impl(imp)) |
399 | } | 387 | } |
400 | 388 | ||
401 | fn push_import(&mut self, current_module: Option<Module>, attrs: Attrs, data: ImportData) { | 389 | fn push_import( |
390 | &mut self, | ||
391 | current_module: Option<Idx<ModuleData>>, | ||
392 | attrs: Attrs, | ||
393 | data: ImportData, | ||
394 | ) { | ||
402 | let import = self.raw_items.imports.alloc(data); | 395 | let import = self.raw_items.imports.alloc(data); |
403 | self.push_item(current_module, attrs, RawItemKind::Import(import)) | 396 | self.push_item(current_module, attrs, RawItemKind::Import(import)) |
404 | } | 397 | } |
405 | 398 | ||
406 | fn push_item(&mut self, current_module: Option<Module>, attrs: Attrs, kind: RawItemKind) { | 399 | fn push_item( |
400 | &mut self, | ||
401 | current_module: Option<Idx<ModuleData>>, | ||
402 | attrs: Attrs, | ||
403 | kind: RawItemKind, | ||
404 | ) { | ||
407 | match current_module { | 405 | match current_module { |
408 | Some(module) => match &mut self.raw_items.modules[module] { | 406 | Some(module) => match &mut self.raw_items.modules[module] { |
409 | ModuleData::Definition { items, .. } => items, | 407 | ModuleData::Definition { items, .. } => items, |
diff --git a/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs b/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs index b502a4079..37fcdfb8c 100644 --- a/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs +++ b/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs | |||
@@ -710,9 +710,7 @@ fn unresolved_module_diagnostics() { | |||
710 | @r###" | 710 | @r###" |
711 | [ | 711 | [ |
712 | UnresolvedModule { | 712 | UnresolvedModule { |
713 | module: LocalModuleId( | 713 | module: Idx::<ModuleData>(0), |
714 | 0, | ||
715 | ), | ||
716 | declaration: InFile { | 714 | declaration: InFile { |
717 | file_id: HirFileId( | 715 | file_id: HirFileId( |
718 | FileId( | 716 | FileId( |
@@ -722,9 +720,7 @@ fn unresolved_module_diagnostics() { | |||
722 | ), | 720 | ), |
723 | ), | 721 | ), |
724 | value: FileAstId { | 722 | value: FileAstId { |
725 | raw: ErasedFileAstId( | 723 | raw: Idx::<SyntaxNodePtr>(1), |
726 | 1, | ||
727 | ), | ||
728 | _ty: PhantomData, | 724 | _ty: PhantomData, |
729 | }, | 725 | }, |
730 | }, | 726 | }, |
diff --git a/crates/ra_hir_def/src/trace.rs b/crates/ra_hir_def/src/trace.rs index 9769e88df..ced07577d 100644 --- a/crates/ra_hir_def/src/trace.rs +++ b/crates/ra_hir_def/src/trace.rs | |||
@@ -9,28 +9,28 @@ | |||
9 | //! absolute offsets. The `Trace` structure (inspired, at least in name, by | 9 | //! absolute offsets. The `Trace` structure (inspired, at least in name, by |
10 | //! Kotlin's `BindingTrace`) allows use the same code to compute both | 10 | //! Kotlin's `BindingTrace`) allows use the same code to compute both |
11 | //! projections. | 11 | //! projections. |
12 | use ra_arena::{map::ArenaMap, Arena, ArenaId, RawId}; | 12 | use ra_arena::{map::ArenaMap, Arena, Idx, RawId}; |
13 | 13 | ||
14 | pub(crate) struct Trace<ID: ArenaId, T, V> { | 14 | pub(crate) struct Trace<T, V> { |
15 | arena: Option<Arena<ID, T>>, | 15 | arena: Option<Arena<T>>, |
16 | map: Option<ArenaMap<ID, V>>, | 16 | map: Option<ArenaMap<Idx<T>, V>>, |
17 | len: u32, | 17 | len: u32, |
18 | } | 18 | } |
19 | 19 | ||
20 | impl<ID: ra_arena::ArenaId + Copy, T, V> Trace<ID, T, V> { | 20 | impl<T, V> Trace<T, V> { |
21 | pub(crate) fn new_for_arena() -> Trace<ID, T, V> { | 21 | pub(crate) fn new_for_arena() -> Trace<T, V> { |
22 | Trace { arena: Some(Arena::default()), map: None, len: 0 } | 22 | Trace { arena: Some(Arena::default()), map: None, len: 0 } |
23 | } | 23 | } |
24 | 24 | ||
25 | pub(crate) fn new_for_map() -> Trace<ID, T, V> { | 25 | pub(crate) fn new_for_map() -> Trace<T, V> { |
26 | Trace { arena: None, map: Some(ArenaMap::default()), len: 0 } | 26 | Trace { arena: None, map: Some(ArenaMap::default()), len: 0 } |
27 | } | 27 | } |
28 | 28 | ||
29 | pub(crate) fn alloc(&mut self, value: impl FnOnce() -> V, data: impl FnOnce() -> T) -> ID { | 29 | pub(crate) fn alloc(&mut self, value: impl FnOnce() -> V, data: impl FnOnce() -> T) -> Idx<T> { |
30 | let id = if let Some(arena) = &mut self.arena { | 30 | let id = if let Some(arena) = &mut self.arena { |
31 | arena.alloc(data()) | 31 | arena.alloc(data()) |
32 | } else { | 32 | } else { |
33 | let id = ID::from_raw(RawId::from(self.len)); | 33 | let id = Idx::<T>::from_raw(RawId::from(self.len)); |
34 | self.len += 1; | 34 | self.len += 1; |
35 | id | 35 | id |
36 | }; | 36 | }; |
@@ -41,11 +41,11 @@ impl<ID: ra_arena::ArenaId + Copy, T, V> Trace<ID, T, V> { | |||
41 | id | 41 | id |
42 | } | 42 | } |
43 | 43 | ||
44 | pub(crate) fn into_arena(mut self) -> Arena<ID, T> { | 44 | pub(crate) fn into_arena(mut self) -> Arena<T> { |
45 | self.arena.take().unwrap() | 45 | self.arena.take().unwrap() |
46 | } | 46 | } |
47 | 47 | ||
48 | pub(crate) fn into_map(mut self) -> ArenaMap<ID, V> { | 48 | pub(crate) fn into_map(mut self) -> ArenaMap<Idx<T>, V> { |
49 | self.map.take().unwrap() | 49 | self.map.take().unwrap() |
50 | } | 50 | } |
51 | } | 51 | } |