diff options
author | Aleksey Kladov <[email protected]> | 2019-11-21 12:13:46 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-11-21 12:13:46 +0000 |
commit | eb53aa37a336b6c9369ea931812f6c491e8f4a71 (patch) | |
tree | 30d6f3818af29182f2dc69d4add2ad27a6538514 /crates/ra_hir/src/resolve.rs | |
parent | ca1af86e7bb104533f9878f84a7a3a39e5107c30 (diff) |
Split internal and user-visible ScopeDef
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r-- | crates/ra_hir/src/resolve.rs | 38 |
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 | ||
382 | impl Resolver { | 389 | impl Resolver { |
@@ -420,6 +427,14 @@ impl Resolver { | |||
420 | } | 427 | } |
421 | } | 428 | } |
422 | 429 | ||
430 | pub(crate) enum ScopeDef { | ||
431 | PerNs(PerNs), | ||
432 | ImplSelfType(ImplId), | ||
433 | AdtSelfType(AdtId), | ||
434 | GenericParam(u32), | ||
435 | Local(PatId), | ||
436 | } | ||
437 | |||
423 | impl Scope { | 438 | impl 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 | } |