aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/resolve.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-21 12:13:46 +0000
committerAleksey Kladov <[email protected]>2019-11-21 12:13:46 +0000
commiteb53aa37a336b6c9369ea931812f6c491e8f4a71 (patch)
tree30d6f3818af29182f2dc69d4add2ad27a6538514 /crates/ra_hir/src/resolve.rs
parentca1af86e7bb104533f9878f84a7a3a39e5107c30 (diff)
Split internal and user-visible ScopeDef
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r--crates/ra_hir/src/resolve.rs38
1 files changed, 23 insertions, 15 deletions
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs
index a029513b5..7ff0c43ae 100644
--- a/crates/ra_hir/src/resolve.rs
+++ b/crates/ra_hir/src/resolve.rs
@@ -19,7 +19,7 @@ use crate::{
19 code_model::Crate, 19 code_model::Crate,
20 db::HirDatabase, 20 db::HirDatabase,
21 expr::{ExprScopes, PatId, ScopeId}, 21 expr::{ExprScopes, PatId, ScopeId},
22 DefWithBody, GenericDef, GenericParam, Local, MacroDef, PerNs, ScopeDef, 22 DefWithBody, GenericDef, MacroDef, PerNs,
23}; 23};
24 24
25#[derive(Debug, Clone, Default)] 25#[derive(Debug, Clone, Default)]
@@ -377,6 +377,13 @@ impl Resolver {
377 _ => None, 377 _ => None,
378 }) 378 })
379 } 379 }
380
381 pub(crate) fn body_owner(&self) -> Option<DefWithBodyId> {
382 self.scopes.iter().find_map(|scope| match scope {
383 Scope::ExprScope(it) => Some(it.owner),
384 _ => None,
385 })
386 }
380} 387}
381 388
382impl Resolver { 389impl Resolver {
@@ -420,6 +427,14 @@ impl Resolver {
420 } 427 }
421} 428}
422 429
430pub(crate) enum ScopeDef {
431 PerNs(PerNs),
432 ImplSelfType(ImplId),
433 AdtSelfType(AdtId),
434 GenericParam(u32),
435 Local(PatId),
436}
437
423impl Scope { 438impl Scope {
424 fn process_names(&self, db: &impl DefDatabase2, f: &mut dyn FnMut(Name, ScopeDef)) { 439 fn process_names(&self, db: &impl DefDatabase2, f: &mut dyn FnMut(Name, ScopeDef)) {
425 match self { 440 match self {
@@ -432,30 +447,24 @@ impl Scope {
432 // }), 447 // }),
433 // ); 448 // );
434 m.crate_def_map[m.module_id].scope.entries().for_each(|(name, res)| { 449 m.crate_def_map[m.module_id].scope.entries().for_each(|(name, res)| {
435 f(name.clone(), res.def.into()); 450 f(name.clone(), ScopeDef::PerNs(res.def));
436 }); 451 });
437 m.crate_def_map[m.module_id].scope.legacy_macros().for_each(|(name, macro_)| { 452 m.crate_def_map[m.module_id].scope.legacy_macros().for_each(|(name, macro_)| {
438 f(name.clone(), ScopeDef::MacroDef(macro_.into())); 453 f(name.clone(), ScopeDef::PerNs(PerNs::macros(macro_)));
439 }); 454 });
440 m.crate_def_map.extern_prelude().iter().for_each(|(name, &def)| { 455 m.crate_def_map.extern_prelude().iter().for_each(|(name, &def)| {
441 f(name.clone(), ScopeDef::ModuleDef(def.into())); 456 f(name.clone(), ScopeDef::PerNs(PerNs::types(def.into())));
442 }); 457 });
443 if let Some(prelude) = m.crate_def_map.prelude() { 458 if let Some(prelude) = m.crate_def_map.prelude() {
444 let prelude_def_map = db.crate_def_map(prelude.krate); 459 let prelude_def_map = db.crate_def_map(prelude.krate);
445 prelude_def_map[prelude.module_id].scope.entries().for_each(|(name, res)| { 460 prelude_def_map[prelude.module_id].scope.entries().for_each(|(name, res)| {
446 f(name.clone(), res.def.into()); 461 f(name.clone(), ScopeDef::PerNs(res.def));
447 }); 462 });
448 } 463 }
449 } 464 }
450 Scope::GenericParams { params, def } => { 465 Scope::GenericParams { params, .. } => {
451 for param in params.params.iter() { 466 for param in params.params.iter() {
452 f( 467 f(param.name.clone(), ScopeDef::GenericParam(param.idx))
453 param.name.clone(),
454 ScopeDef::GenericParam(GenericParam {
455 parent: (*def).into(),
456 idx: param.idx,
457 }),
458 )
459 } 468 }
460 } 469 }
461 Scope::ImplBlockScope(i) => { 470 Scope::ImplBlockScope(i) => {
@@ -466,8 +475,7 @@ impl Scope {
466 } 475 }
467 Scope::ExprScope(scope) => { 476 Scope::ExprScope(scope) => {
468 scope.expr_scopes.entries(scope.scope_id).iter().for_each(|e| { 477 scope.expr_scopes.entries(scope.scope_id).iter().for_each(|e| {
469 let local = Local { parent: scope.owner.into(), pat_id: e.pat() }; 478 f(e.name().clone(), ScopeDef::Local(e.pat()));
470 f(e.name().clone(), ScopeDef::Local(local));
471 }); 479 });
472 } 480 }
473 } 481 }