diff options
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r-- | crates/ra_hir/src/resolve.rs | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs index 36daed65b..30cf9c69e 100644 --- a/crates/ra_hir/src/resolve.rs +++ b/crates/ra_hir/src/resolve.rs | |||
@@ -89,8 +89,20 @@ impl Resolver { | |||
89 | } | 89 | } |
90 | } | 90 | } |
91 | 91 | ||
92 | pub fn all_names(&self) -> FxHashMap<Name, Resolution> { | 92 | pub fn all_names(&self) -> FxHashMap<Name, PerNs<Resolution>> { |
93 | unimplemented!() | 93 | let mut names = FxHashMap::default(); |
94 | for scope in &self.scopes { | ||
95 | scope.collect_names(&mut |name, res| { | ||
96 | let current: &mut PerNs<Resolution> = names.entry(name).or_default(); | ||
97 | if current.types.is_none() { | ||
98 | current.types = res.types; | ||
99 | } | ||
100 | if current.values.is_none() { | ||
101 | current.values = res.values; | ||
102 | } | ||
103 | }); | ||
104 | } | ||
105 | names | ||
94 | } | 106 | } |
95 | 107 | ||
96 | fn module(&self) -> Option<(&ItemMap, Module)> { | 108 | fn module(&self) -> Option<(&ItemMap, Module)> { |
@@ -175,4 +187,45 @@ impl Scope { | |||
175 | } | 187 | } |
176 | } | 188 | } |
177 | } | 189 | } |
190 | |||
191 | fn collect_names(&self, f: &mut FnMut(Name, PerNs<Resolution>)) { | ||
192 | match self { | ||
193 | Scope::ModuleScope(m) => { | ||
194 | m.item_map[m.module.module_id] | ||
195 | .entries() | ||
196 | .for_each(|(name, res)| { | ||
197 | f(name.clone(), res.def.map(|def| Resolution::Def { def })); | ||
198 | }) | ||
199 | } | ||
200 | Scope::ModuleScopeRef(m) => { | ||
201 | m.item_map[m.module.module_id] | ||
202 | .entries() | ||
203 | .for_each(|(name, res)| { | ||
204 | f(name.clone(), res.def.map(|def| Resolution::Def { def })); | ||
205 | }) | ||
206 | } | ||
207 | Scope::GenericParams(gp) => { | ||
208 | for param in &gp.params { | ||
209 | f( | ||
210 | param.name.clone(), | ||
211 | PerNs::types(Resolution::GenericParam { idx: param.idx }), | ||
212 | ) | ||
213 | } | ||
214 | } | ||
215 | Scope::ImplBlockScope(i) => { | ||
216 | f( | ||
217 | Name::self_type(), | ||
218 | PerNs::types(Resolution::SelfType(i.clone())), | ||
219 | ); | ||
220 | } | ||
221 | Scope::ExprScope(e) => { | ||
222 | e.expr_scopes.entries(e.scope_id).iter().for_each(|e| { | ||
223 | f( | ||
224 | e.name().clone(), | ||
225 | PerNs::values(Resolution::LocalBinding { pat: e.pat() }), | ||
226 | ); | ||
227 | }); | ||
228 | } | ||
229 | } | ||
230 | } | ||
178 | } | 231 | } |