aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/resolve.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r--crates/ra_hir/src/resolve.rs57
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}