aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_def/src/resolver.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir_def/src/resolver.rs')
-rw-r--r--crates/hir_def/src/resolver.rs60
1 files changed, 38 insertions, 22 deletions
diff --git a/crates/hir_def/src/resolver.rs b/crates/hir_def/src/resolver.rs
index 85ddc2c47..b2f577649 100644
--- a/crates/hir_def/src/resolver.rs
+++ b/crates/hir_def/src/resolver.rs
@@ -16,13 +16,14 @@ use crate::{
16 expr::{ExprId, PatId}, 16 expr::{ExprId, PatId},
17 generics::GenericParams, 17 generics::GenericParams,
18 item_scope::{BuiltinShadowMode, BUILTIN_SCOPE}, 18 item_scope::{BuiltinShadowMode, BUILTIN_SCOPE},
19 nameres::CrateDefMap, 19 nameres::DefMap,
20 path::{ModPath, PathKind}, 20 path::{ModPath, PathKind},
21 per_ns::PerNs, 21 per_ns::PerNs,
22 visibility::{RawVisibility, Visibility}, 22 visibility::{RawVisibility, Visibility},
23 AdtId, AssocContainerId, ConstId, ConstParamId, ContainerId, DefWithBodyId, EnumId, 23 AdtId, AssocContainerId, ConstId, ConstParamId, ContainerId, DefWithBodyId, EnumId,
24 EnumVariantId, FunctionId, GenericDefId, HasModule, ImplId, LocalModuleId, Lookup, ModuleDefId, 24 EnumVariantId, FunctionId, GenericDefId, GenericParamId, HasModule, ImplId, LifetimeParamId,
25 ModuleId, StaticId, StructId, TraitId, TypeAliasId, TypeParamId, VariantId, 25 LocalModuleId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, TraitId, TypeAliasId,
26 TypeParamId, VariantId,
26}; 27};
27 28
28#[derive(Debug, Clone, Default)] 29#[derive(Debug, Clone, Default)]
@@ -34,7 +35,7 @@ pub struct Resolver {
34// FIXME how to store these best 35// FIXME how to store these best
35#[derive(Debug, Clone)] 36#[derive(Debug, Clone)]
36struct ModuleItemMap { 37struct ModuleItemMap {
37 crate_def_map: Arc<CrateDefMap>, 38 crate_def_map: Arc<DefMap>,
38 module_id: LocalModuleId, 39 module_id: LocalModuleId,
39} 40}
40 41
@@ -145,6 +146,19 @@ impl Resolver {
145 self.resolve_module_path(db, path, BuiltinShadowMode::Module) 146 self.resolve_module_path(db, path, BuiltinShadowMode::Module)
146 } 147 }
147 148
149 pub fn resolve_module_path_in_trait_items(
150 &self,
151 db: &dyn DefDatabase,
152 path: &ModPath,
153 ) -> Option<TraitId> {
154 let (item_map, module) = self.module_scope()?;
155 let (module_res, ..) = item_map.resolve_path(db, module, &path, BuiltinShadowMode::Module);
156 match module_res.take_types()? {
157 ModuleDefId::TraitId(it) => Some(it),
158 _ => None,
159 }
160 }
161
148 pub fn resolve_path_in_type_ns( 162 pub fn resolve_path_in_type_ns(
149 &self, 163 &self,
150 db: &dyn DefDatabase, 164 db: &dyn DefDatabase,
@@ -415,7 +429,7 @@ impl Resolver {
415 let mut traits = FxHashSet::default(); 429 let mut traits = FxHashSet::default();
416 for scope in &self.scopes { 430 for scope in &self.scopes {
417 if let Scope::ModuleScope(m) = scope { 431 if let Scope::ModuleScope(m) = scope {
418 if let Some(prelude) = m.crate_def_map.prelude { 432 if let Some(prelude) = m.crate_def_map.prelude() {
419 let prelude_def_map = db.crate_def_map(prelude.krate); 433 let prelude_def_map = db.crate_def_map(prelude.krate);
420 traits.extend(prelude_def_map[prelude.local_id].scope.traits()); 434 traits.extend(prelude_def_map[prelude.local_id].scope.traits());
421 } 435 }
@@ -425,7 +439,7 @@ impl Resolver {
425 traits 439 traits
426 } 440 }
427 441
428 fn module_scope(&self) -> Option<(&CrateDefMap, LocalModuleId)> { 442 fn module_scope(&self) -> Option<(&DefMap, LocalModuleId)> {
429 self.scopes.iter().rev().find_map(|scope| match scope { 443 self.scopes.iter().rev().find_map(|scope| match scope {
430 Scope::ModuleScope(m) => Some((&*m.crate_def_map, m.module_id)), 444 Scope::ModuleScope(m) => Some((&*m.crate_def_map, m.module_id)),
431 445
@@ -445,11 +459,11 @@ impl Resolver {
445 459
446 pub fn module(&self) -> Option<ModuleId> { 460 pub fn module(&self) -> Option<ModuleId> {
447 let (def_map, local_id) = self.module_scope()?; 461 let (def_map, local_id) = self.module_scope()?;
448 Some(ModuleId { krate: def_map.krate, local_id }) 462 Some(ModuleId { krate: def_map.krate(), local_id })
449 } 463 }
450 464
451 pub fn krate(&self) -> Option<CrateId> { 465 pub fn krate(&self) -> Option<CrateId> {
452 self.module_scope().map(|t| t.0.krate) 466 self.module_scope().map(|t| t.0.krate())
453 } 467 }
454 468
455 pub fn where_predicates_in_scope<'a>( 469 pub fn where_predicates_in_scope<'a>(
@@ -484,7 +498,7 @@ pub enum ScopeDef {
484 PerNs(PerNs), 498 PerNs(PerNs),
485 ImplSelfType(ImplId), 499 ImplSelfType(ImplId),
486 AdtSelfType(AdtId), 500 AdtSelfType(AdtId),
487 GenericParam(TypeParamId), 501 GenericParam(GenericParamId),
488 Local(PatId), 502 Local(PatId),
489} 503}
490 504
@@ -508,13 +522,13 @@ impl Scope {
508 seen.insert((name.clone(), scope)); 522 seen.insert((name.clone(), scope));
509 f(name.clone(), ScopeDef::PerNs(scope)); 523 f(name.clone(), ScopeDef::PerNs(scope));
510 }); 524 });
511 m.crate_def_map.extern_prelude.iter().for_each(|(name, &def)| { 525 m.crate_def_map.extern_prelude().for_each(|(name, &def)| {
512 f(name.clone(), ScopeDef::PerNs(PerNs::types(def, Visibility::Public))); 526 f(name.clone(), ScopeDef::PerNs(PerNs::types(def, Visibility::Public)));
513 }); 527 });
514 BUILTIN_SCOPE.iter().for_each(|(name, &def)| { 528 BUILTIN_SCOPE.iter().for_each(|(name, &def)| {
515 f(name.clone(), ScopeDef::PerNs(def)); 529 f(name.clone(), ScopeDef::PerNs(def));
516 }); 530 });
517 if let Some(prelude) = m.crate_def_map.prelude { 531 if let Some(prelude) = m.crate_def_map.prelude() {
518 let prelude_def_map = db.crate_def_map(prelude.krate); 532 let prelude_def_map = db.crate_def_map(prelude.krate);
519 prelude_def_map[prelude.local_id].scope.entries().for_each(|(name, def)| { 533 prelude_def_map[prelude.local_id].scope.entries().for_each(|(name, def)| {
520 let seen_tuple = (name.clone(), def); 534 let seen_tuple = (name.clone(), def);
@@ -527,15 +541,21 @@ impl Scope {
527 Scope::LocalItemsScope(body) => body.item_scope.entries().for_each(|(name, def)| { 541 Scope::LocalItemsScope(body) => body.item_scope.entries().for_each(|(name, def)| {
528 f(name.clone(), ScopeDef::PerNs(def)); 542 f(name.clone(), ScopeDef::PerNs(def));
529 }), 543 }),
530 Scope::GenericParams { params, def } => { 544 &Scope::GenericParams { ref params, def: parent } => {
531 for (local_id, param) in params.types.iter() { 545 for (local_id, param) in params.types.iter() {
532 if let Some(name) = &param.name { 546 if let Some(ref name) = param.name {
533 f( 547 let id = TypeParamId { local_id, parent };
534 name.clone(), 548 f(name.clone(), ScopeDef::GenericParam(id.into()))
535 ScopeDef::GenericParam(TypeParamId { local_id, parent: *def }),
536 )
537 } 549 }
538 } 550 }
551 for (local_id, param) in params.consts.iter() {
552 let id = ConstParamId { local_id, parent };
553 f(param.name.clone(), ScopeDef::GenericParam(id.into()))
554 }
555 for (local_id, param) in params.lifetimes.iter() {
556 let id = LifetimeParamId { local_id, parent };
557 f(param.name.clone(), ScopeDef::GenericParam(id.into()))
558 }
539 } 559 }
540 Scope::ImplDefScope(i) => { 560 Scope::ImplDefScope(i) => {
541 f(name![Self], ScopeDef::ImplSelfType(*i)); 561 f(name![Self], ScopeDef::ImplSelfType(*i));
@@ -588,11 +608,7 @@ impl Resolver {
588 self.push_scope(Scope::ImplDefScope(impl_def)) 608 self.push_scope(Scope::ImplDefScope(impl_def))
589 } 609 }
590 610
591 fn push_module_scope( 611 fn push_module_scope(self, crate_def_map: Arc<DefMap>, module_id: LocalModuleId) -> Resolver {
592 self,
593 crate_def_map: Arc<CrateDefMap>,
594 module_id: LocalModuleId,
595 ) -> Resolver {
596 self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id })) 612 self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id }))
597 } 613 }
598 614