diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-12-19 17:22:40 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-12-19 17:22:40 +0000 |
commit | 0000c7753ead95d71cb95ccc4929d4845f218ab2 (patch) | |
tree | b25ab818073492ff8c80176043b68ffe7a40ab3c /crates/ra_hir_def | |
parent | 90f3b31efc1afe5de671fd6076fef3240f4151ab (diff) | |
parent | 9ccad60acca0d359f1fd9046c99952d0c1adc763 (diff) |
Merge #2600
2600: Plumbing for local items support r=matklad a=matklad
bors r+
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir_def')
-rw-r--r-- | crates/ra_hir_def/src/body.rs | 3 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir_def/src/child_by_source.rs | 97 | ||||
-rw-r--r-- | crates/ra_hir_def/src/lib.rs | 24 | ||||
-rw-r--r-- | crates/ra_hir_def/src/resolver.rs | 1 |
5 files changed, 71 insertions, 55 deletions
diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index d4cab0561..332c509e1 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs | |||
@@ -17,7 +17,7 @@ use crate::{ | |||
17 | nameres::{BuiltinShadowMode, CrateDefMap}, | 17 | nameres::{BuiltinShadowMode, CrateDefMap}, |
18 | path::{ModPath, Path}, | 18 | path::{ModPath, Path}, |
19 | src::HasSource, | 19 | src::HasSource, |
20 | DefWithBodyId, HasModule, Lookup, ModuleId, | 20 | DefWithBodyId, HasModule, Lookup, ModuleDefId, ModuleId, |
21 | }; | 21 | }; |
22 | 22 | ||
23 | struct Expander { | 23 | struct Expander { |
@@ -119,6 +119,7 @@ pub struct Body { | |||
119 | pub params: Vec<PatId>, | 119 | pub params: Vec<PatId>, |
120 | /// The `ExprId` of the actual body expression. | 120 | /// The `ExprId` of the actual body expression. |
121 | pub body_expr: ExprId, | 121 | pub body_expr: ExprId, |
122 | pub defs: Vec<ModuleDefId>, | ||
122 | } | 123 | } |
123 | 124 | ||
124 | pub type ExprPtr = Either<AstPtr<ast::Expr>, AstPtr<ast::RecordField>>; | 125 | pub type ExprPtr = Either<AstPtr<ast::Expr>, AstPtr<ast::RecordField>>; |
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index 61193b4d8..86960186f 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -41,6 +41,7 @@ pub(super) fn lower( | |||
41 | pats: Arena::default(), | 41 | pats: Arena::default(), |
42 | params: Vec::new(), | 42 | params: Vec::new(), |
43 | body_expr: ExprId::dummy(), | 43 | body_expr: ExprId::dummy(), |
44 | defs: Vec::new(), | ||
44 | }, | 45 | }, |
45 | } | 46 | } |
46 | .collect(params, body) | 47 | .collect(params, body) |
diff --git a/crates/ra_hir_def/src/child_by_source.rs b/crates/ra_hir_def/src/child_by_source.rs index 3c9379b15..f5a65ad40 100644 --- a/crates/ra_hir_def/src/child_by_source.rs +++ b/crates/ra_hir_def/src/child_by_source.rs | |||
@@ -11,8 +11,8 @@ use crate::{ | |||
11 | dyn_map::DynMap, | 11 | dyn_map::DynMap, |
12 | keys, | 12 | keys, |
13 | src::{HasChildSource, HasSource}, | 13 | src::{HasChildSource, HasSource}, |
14 | AdtId, AssocItemId, EnumId, EnumVariantId, ImplId, Lookup, ModuleDefId, ModuleId, | 14 | AdtId, AssocItemId, DefWithBodyId, EnumId, EnumVariantId, ImplId, Lookup, ModuleDefId, |
15 | StructFieldId, TraitId, VariantId, | 15 | ModuleId, StructFieldId, TraitId, VariantId, |
16 | }; | 16 | }; |
17 | 17 | ||
18 | pub trait ChildBySource { | 18 | pub trait ChildBySource { |
@@ -76,47 +76,11 @@ impl ChildBySource for ModuleId { | |||
76 | let mut res = DynMap::default(); | 76 | let mut res = DynMap::default(); |
77 | 77 | ||
78 | let crate_def_map = db.crate_def_map(self.krate); | 78 | let crate_def_map = db.crate_def_map(self.krate); |
79 | for item in crate_def_map[self.local_id].scope.declarations() { | 79 | let module_data = &crate_def_map[self.local_id]; |
80 | match item { | ||
81 | ModuleDefId::FunctionId(func) => { | ||
82 | let src = func.lookup(db).source(db); | ||
83 | res[keys::FUNCTION].insert(src, func) | ||
84 | } | ||
85 | ModuleDefId::ConstId(konst) => { | ||
86 | let src = konst.lookup(db).source(db); | ||
87 | res[keys::CONST].insert(src, konst) | ||
88 | } | ||
89 | ModuleDefId::StaticId(statik) => { | ||
90 | let src = statik.lookup(db).source(db); | ||
91 | res[keys::STATIC].insert(src, statik) | ||
92 | } | ||
93 | ModuleDefId::TypeAliasId(ty) => { | ||
94 | let src = ty.lookup(db).source(db); | ||
95 | res[keys::TYPE_ALIAS].insert(src, ty) | ||
96 | } | ||
97 | ModuleDefId::TraitId(trait_) => { | ||
98 | let src = trait_.lookup(db).source(db); | ||
99 | res[keys::TRAIT].insert(src, trait_) | ||
100 | } | ||
101 | ModuleDefId::AdtId(adt) => match adt { | ||
102 | AdtId::StructId(strukt) => { | ||
103 | let src = strukt.lookup(db).source(db); | ||
104 | res[keys::STRUCT].insert(src, strukt) | ||
105 | } | ||
106 | AdtId::UnionId(union_) => { | ||
107 | let src = union_.lookup(db).source(db); | ||
108 | res[keys::UNION].insert(src, union_) | ||
109 | } | ||
110 | AdtId::EnumId(enum_) => { | ||
111 | let src = enum_.lookup(db).source(db); | ||
112 | res[keys::ENUM].insert(src, enum_) | ||
113 | } | ||
114 | }, | ||
115 | _ => (), | ||
116 | } | ||
117 | } | ||
118 | 80 | ||
119 | for &impl_ in crate_def_map[self.local_id].impls.iter() { | 81 | module_data.scope.declarations().for_each(|item| add_module_def(db, &mut res, item)); |
82 | |||
83 | for &impl_ in module_data.impls.iter() { | ||
120 | let src = impl_.lookup(db).source(db); | 84 | let src = impl_.lookup(db).source(db); |
121 | res[keys::IMPL].insert(src, impl_) | 85 | res[keys::IMPL].insert(src, impl_) |
122 | } | 86 | } |
@@ -125,6 +89,46 @@ impl ChildBySource for ModuleId { | |||
125 | } | 89 | } |
126 | } | 90 | } |
127 | 91 | ||
92 | fn add_module_def(db: &impl DefDatabase, map: &mut DynMap, item: ModuleDefId) { | ||
93 | match item { | ||
94 | ModuleDefId::FunctionId(func) => { | ||
95 | let src = func.lookup(db).source(db); | ||
96 | map[keys::FUNCTION].insert(src, func) | ||
97 | } | ||
98 | ModuleDefId::ConstId(konst) => { | ||
99 | let src = konst.lookup(db).source(db); | ||
100 | map[keys::CONST].insert(src, konst) | ||
101 | } | ||
102 | ModuleDefId::StaticId(statik) => { | ||
103 | let src = statik.lookup(db).source(db); | ||
104 | map[keys::STATIC].insert(src, statik) | ||
105 | } | ||
106 | ModuleDefId::TypeAliasId(ty) => { | ||
107 | let src = ty.lookup(db).source(db); | ||
108 | map[keys::TYPE_ALIAS].insert(src, ty) | ||
109 | } | ||
110 | ModuleDefId::TraitId(trait_) => { | ||
111 | let src = trait_.lookup(db).source(db); | ||
112 | map[keys::TRAIT].insert(src, trait_) | ||
113 | } | ||
114 | ModuleDefId::AdtId(adt) => match adt { | ||
115 | AdtId::StructId(strukt) => { | ||
116 | let src = strukt.lookup(db).source(db); | ||
117 | map[keys::STRUCT].insert(src, strukt) | ||
118 | } | ||
119 | AdtId::UnionId(union_) => { | ||
120 | let src = union_.lookup(db).source(db); | ||
121 | map[keys::UNION].insert(src, union_) | ||
122 | } | ||
123 | AdtId::EnumId(enum_) => { | ||
124 | let src = enum_.lookup(db).source(db); | ||
125 | map[keys::ENUM].insert(src, enum_) | ||
126 | } | ||
127 | }, | ||
128 | _ => (), | ||
129 | } | ||
130 | } | ||
131 | |||
128 | impl ChildBySource for VariantId { | 132 | impl ChildBySource for VariantId { |
129 | fn child_by_source(&self, db: &impl DefDatabase) -> DynMap { | 133 | fn child_by_source(&self, db: &impl DefDatabase) -> DynMap { |
130 | let mut res = DynMap::default(); | 134 | let mut res = DynMap::default(); |
@@ -160,3 +164,12 @@ impl ChildBySource for EnumId { | |||
160 | res | 164 | res |
161 | } | 165 | } |
162 | } | 166 | } |
167 | |||
168 | impl ChildBySource for DefWithBodyId { | ||
169 | fn child_by_source(&self, db: &impl DefDatabase) -> DynMap { | ||
170 | let mut res = DynMap::default(); | ||
171 | let body = db.body(*self); | ||
172 | body.defs.iter().copied().for_each(|item| add_module_def(db, &mut res, item)); | ||
173 | res | ||
174 | } | ||
175 | } | ||
diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index f085bbe87..4fc3127c4 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs | |||
@@ -335,6 +335,7 @@ pub enum ContainerId { | |||
335 | ModuleId(ModuleId), | 335 | ModuleId(ModuleId), |
336 | ImplId(ImplId), | 336 | ImplId(ImplId), |
337 | TraitId(TraitId), | 337 | TraitId(TraitId), |
338 | DefWithBodyId(DefWithBodyId), | ||
338 | } | 339 | } |
339 | 340 | ||
340 | /// A Data Type | 341 | /// A Data Type |
@@ -478,33 +479,32 @@ pub trait HasModule { | |||
478 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId; | 479 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId; |
479 | } | 480 | } |
480 | 481 | ||
481 | impl HasModule for FunctionLoc { | 482 | impl HasModule for ContainerId { |
482 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { | 483 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { |
483 | match self.container { | 484 | match *self { |
484 | ContainerId::ModuleId(it) => it, | 485 | ContainerId::ModuleId(it) => it, |
485 | ContainerId::ImplId(it) => it.lookup(db).container, | 486 | ContainerId::ImplId(it) => it.lookup(db).container, |
486 | ContainerId::TraitId(it) => it.lookup(db).container, | 487 | ContainerId::TraitId(it) => it.lookup(db).container, |
488 | ContainerId::DefWithBodyId(it) => it.module(db), | ||
487 | } | 489 | } |
488 | } | 490 | } |
489 | } | 491 | } |
490 | 492 | ||
493 | impl HasModule for FunctionLoc { | ||
494 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { | ||
495 | self.container.module(db) | ||
496 | } | ||
497 | } | ||
498 | |||
491 | impl HasModule for TypeAliasLoc { | 499 | impl HasModule for TypeAliasLoc { |
492 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { | 500 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { |
493 | match self.container { | 501 | self.container.module(db) |
494 | ContainerId::ModuleId(it) => it, | ||
495 | ContainerId::ImplId(it) => it.lookup(db).container, | ||
496 | ContainerId::TraitId(it) => it.lookup(db).container, | ||
497 | } | ||
498 | } | 502 | } |
499 | } | 503 | } |
500 | 504 | ||
501 | impl HasModule for ConstLoc { | 505 | impl HasModule for ConstLoc { |
502 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { | 506 | fn module(&self, db: &impl db::DefDatabase) -> ModuleId { |
503 | match self.container { | 507 | self.container.module(db) |
504 | ContainerId::ModuleId(it) => it, | ||
505 | ContainerId::ImplId(it) => it.lookup(db).container, | ||
506 | ContainerId::TraitId(it) => it.lookup(db).container, | ||
507 | } | ||
508 | } | 508 | } |
509 | } | 509 | } |
510 | 510 | ||
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs index 2694c0438..250329271 100644 --- a/crates/ra_hir_def/src/resolver.rs +++ b/crates/ra_hir_def/src/resolver.rs | |||
@@ -586,6 +586,7 @@ impl HasResolver for ContainerId { | |||
586 | ContainerId::TraitId(it) => it.resolver(db), | 586 | ContainerId::TraitId(it) => it.resolver(db), |
587 | ContainerId::ImplId(it) => it.resolver(db), | 587 | ContainerId::ImplId(it) => it.resolver(db), |
588 | ContainerId::ModuleId(it) => it.resolver(db), | 588 | ContainerId::ModuleId(it) => it.resolver(db), |
589 | ContainerId::DefWithBodyId(it) => it.resolver(db), | ||
589 | } | 590 | } |
590 | } | 591 | } |
591 | } | 592 | } |