aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/resolver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_def/src/resolver.rs')
-rw-r--r--crates/ra_hir_def/src/resolver.rs103
1 files changed, 72 insertions, 31 deletions
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs
index e70049617..cf3c33d78 100644
--- a/crates/ra_hir_def/src/resolver.rs
+++ b/crates/ra_hir_def/src/resolver.rs
@@ -10,6 +10,7 @@ use rustc_hash::FxHashSet;
10 10
11use crate::{ 11use crate::{
12 body::scope::{ExprScopes, ScopeId}, 12 body::scope::{ExprScopes, ScopeId},
13 body::Body,
13 builtin_type::BuiltinType, 14 builtin_type::BuiltinType,
14 db::DefDatabase, 15 db::DefDatabase,
15 expr::{ExprId, PatId}, 16 expr::{ExprId, PatId},
@@ -55,6 +56,8 @@ enum Scope {
55 AdtScope(AdtId), 56 AdtScope(AdtId),
56 /// Local bindings 57 /// Local bindings
57 ExprScope(ExprScope), 58 ExprScope(ExprScope),
59 /// Temporary hack to support local items.
60 LocalItemsScope(Arc<Body>),
58} 61}
59 62
60#[derive(Debug, Clone, PartialEq, Eq, Hash)] 63#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -149,7 +152,13 @@ impl Resolver {
149 for scope in self.scopes.iter().rev() { 152 for scope in self.scopes.iter().rev() {
150 match scope { 153 match scope {
151 Scope::ExprScope(_) => continue, 154 Scope::ExprScope(_) => continue,
152 Scope::GenericParams { .. } | Scope::ImplBlockScope(_) if skip_to_mod => continue, 155 Scope::GenericParams { .. }
156 | Scope::ImplBlockScope(_)
157 | Scope::LocalItemsScope(_)
158 if skip_to_mod =>
159 {
160 continue
161 }
153 162
154 Scope::GenericParams { params, def } => { 163 Scope::GenericParams { params, def } => {
155 if let Some(local_id) = params.find_by_name(first_name) { 164 if let Some(local_id) = params.find_by_name(first_name) {
@@ -179,25 +188,35 @@ impl Resolver {
179 &path, 188 &path,
180 BuiltinShadowMode::Other, 189 BuiltinShadowMode::Other,
181 ); 190 );
182 let res = match module_def.take_types()? { 191 let res = to_type_ns(module_def)?;
183 ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
184 ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it),
185
186 ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
187 ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
188
189 ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
190
191 ModuleDefId::FunctionId(_)
192 | ModuleDefId::ConstId(_)
193 | ModuleDefId::StaticId(_)
194 | ModuleDefId::ModuleId(_) => return None,
195 };
196 return Some((res, idx)); 192 return Some((res, idx));
197 } 193 }
194 Scope::LocalItemsScope(body) => {
195 let def = body.item_scope.get(first_name, BuiltinShadowMode::Other);
196 if let Some(res) = to_type_ns(def) {
197 return Some((res, None));
198 }
199 }
198 } 200 }
199 } 201 }
200 None 202 return None;
203 fn to_type_ns(per_ns: PerNs) -> Option<TypeNs> {
204 let res = match per_ns.take_types()? {
205 ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
206 ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it),
207
208 ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
209 ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
210
211 ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
212
213 ModuleDefId::FunctionId(_)
214 | ModuleDefId::ConstId(_)
215 | ModuleDefId::StaticId(_)
216 | ModuleDefId::ModuleId(_) => return None,
217 };
218 Some(res)
219 }
201 } 220 }
202 221
203 pub fn resolve_path_in_type_ns_fully( 222 pub fn resolve_path_in_type_ns_fully(
@@ -227,6 +246,7 @@ impl Resolver {
227 | Scope::ExprScope(_) 246 | Scope::ExprScope(_)
228 | Scope::GenericParams { .. } 247 | Scope::GenericParams { .. }
229 | Scope::ImplBlockScope(_) 248 | Scope::ImplBlockScope(_)
249 | Scope::LocalItemsScope(_)
230 if skip_to_mod => 250 if skip_to_mod =>
231 { 251 {
232 continue 252 continue
@@ -276,20 +296,7 @@ impl Resolver {
276 ); 296 );
277 return match idx { 297 return match idx {
278 None => { 298 None => {
279 let value = match module_def.take_values()? { 299 let value = to_value_ns(module_def)?;
280 ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it),
281 ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it),
282 ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it),
283 ModuleDefId::ConstId(it) => ValueNs::ConstId(it),
284 ModuleDefId::StaticId(it) => ValueNs::StaticId(it),
285
286 ModuleDefId::AdtId(AdtId::EnumId(_))
287 | ModuleDefId::AdtId(AdtId::UnionId(_))
288 | ModuleDefId::TraitId(_)
289 | ModuleDefId::TypeAliasId(_)
290 | ModuleDefId::BuiltinType(_)
291 | ModuleDefId::ModuleId(_) => return None,
292 };
293 Some(ResolveValueResult::ValueNs(value)) 300 Some(ResolveValueResult::ValueNs(value))
294 } 301 }
295 Some(idx) => { 302 Some(idx) => {
@@ -309,9 +316,33 @@ impl Resolver {
309 } 316 }
310 }; 317 };
311 } 318 }
319 Scope::LocalItemsScope(body) => {
320 let def = body.item_scope.get(first_name, BuiltinShadowMode::Other);
321 if let Some(res) = to_value_ns(def) {
322 return Some(ResolveValueResult::ValueNs(res));
323 }
324 }
312 } 325 }
313 } 326 }
314 None 327 return None;
328
329 fn to_value_ns(per_ns: PerNs) -> Option<ValueNs> {
330 let res = match per_ns.take_values()? {
331 ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it),
332 ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it),
333 ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it),
334 ModuleDefId::ConstId(it) => ValueNs::ConstId(it),
335 ModuleDefId::StaticId(it) => ValueNs::StaticId(it),
336
337 ModuleDefId::AdtId(AdtId::EnumId(_))
338 | ModuleDefId::AdtId(AdtId::UnionId(_))
339 | ModuleDefId::TraitId(_)
340 | ModuleDefId::TypeAliasId(_)
341 | ModuleDefId::BuiltinType(_)
342 | ModuleDefId::ModuleId(_) => return None,
343 };
344 Some(res)
345 }
315 } 346 }
316 347
317 pub fn resolve_path_in_value_ns_fully( 348 pub fn resolve_path_in_value_ns_fully(
@@ -429,6 +460,11 @@ impl Scope {
429 }); 460 });
430 } 461 }
431 } 462 }
463 Scope::LocalItemsScope(body) => {
464 body.item_scope.entries_without_primitives().for_each(|(name, def)| {
465 f(name.clone(), ScopeDef::PerNs(def));
466 })
467 }
432 Scope::GenericParams { params, def } => { 468 Scope::GenericParams { params, def } => {
433 for (local_id, param) in params.types.iter() { 469 for (local_id, param) in params.types.iter() {
434 f( 470 f(
@@ -464,6 +500,7 @@ pub fn resolver_for_scope(
464 scope_id: Option<ScopeId>, 500 scope_id: Option<ScopeId>,
465) -> Resolver { 501) -> Resolver {
466 let mut r = owner.resolver(db); 502 let mut r = owner.resolver(db);
503 r = r.push_local_items_scope(db.body(owner));
467 let scopes = db.expr_scopes(owner); 504 let scopes = db.expr_scopes(owner);
468 let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); 505 let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
469 for scope in scope_chain.into_iter().rev() { 506 for scope in scope_chain.into_iter().rev() {
@@ -499,6 +536,10 @@ impl Resolver {
499 self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id })) 536 self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id }))
500 } 537 }
501 538
539 fn push_local_items_scope(self, body: Arc<Body>) -> Resolver {
540 self.push_scope(Scope::LocalItemsScope(body))
541 }
542
502 fn push_expr_scope( 543 fn push_expr_scope(
503 self, 544 self,
504 owner: DefWithBodyId, 545 owner: DefWithBodyId,