diff options
Diffstat (limited to 'crates/hir_def/src/resolver.rs')
-rw-r--r-- | crates/hir_def/src/resolver.rs | 60 |
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)] |
36 | struct ModuleItemMap { | 37 | struct 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) = ¶m.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 | ||