diff options
Diffstat (limited to 'crates/hir_def/src/resolver.rs')
-rw-r--r-- | crates/hir_def/src/resolver.rs | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/crates/hir_def/src/resolver.rs b/crates/hir_def/src/resolver.rs index d48029b7d..130c074f0 100644 --- a/crates/hir_def/src/resolver.rs +++ b/crates/hir_def/src/resolver.rs | |||
@@ -146,6 +146,19 @@ impl Resolver { | |||
146 | self.resolve_module_path(db, path, BuiltinShadowMode::Module) | 146 | self.resolve_module_path(db, path, BuiltinShadowMode::Module) |
147 | } | 147 | } |
148 | 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 | |||
149 | pub fn resolve_path_in_type_ns( | 162 | pub fn resolve_path_in_type_ns( |
150 | &self, | 163 | &self, |
151 | db: &dyn DefDatabase, | 164 | db: &dyn DefDatabase, |
@@ -417,7 +430,7 @@ impl Resolver { | |||
417 | for scope in &self.scopes { | 430 | for scope in &self.scopes { |
418 | if let Scope::ModuleScope(m) = scope { | 431 | if let Scope::ModuleScope(m) = scope { |
419 | if let Some(prelude) = m.crate_def_map.prelude() { | 432 | if let Some(prelude) = m.crate_def_map.prelude() { |
420 | let prelude_def_map = db.crate_def_map(prelude.krate); | 433 | let prelude_def_map = prelude.def_map(db); |
421 | traits.extend(prelude_def_map[prelude.local_id].scope.traits()); | 434 | traits.extend(prelude_def_map[prelude.local_id].scope.traits()); |
422 | } | 435 | } |
423 | traits.extend(m.crate_def_map[m.module_id].scope.traits()); | 436 | traits.extend(m.crate_def_map[m.module_id].scope.traits()); |
@@ -516,7 +529,7 @@ impl Scope { | |||
516 | f(name.clone(), ScopeDef::PerNs(def)); | 529 | f(name.clone(), ScopeDef::PerNs(def)); |
517 | }); | 530 | }); |
518 | if let Some(prelude) = m.crate_def_map.prelude() { | 531 | if let Some(prelude) = m.crate_def_map.prelude() { |
519 | let prelude_def_map = db.crate_def_map(prelude.krate); | 532 | let prelude_def_map = prelude.def_map(db); |
520 | 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)| { |
521 | let seen_tuple = (name.clone(), def); | 534 | let seen_tuple = (name.clone(), def); |
522 | if !seen.contains(&seen_tuple) { | 535 | if !seen.contains(&seen_tuple) { |
@@ -620,7 +633,7 @@ pub trait HasResolver: Copy { | |||
620 | 633 | ||
621 | impl HasResolver for ModuleId { | 634 | impl HasResolver for ModuleId { |
622 | fn resolver(self, db: &dyn DefDatabase) -> Resolver { | 635 | fn resolver(self, db: &dyn DefDatabase) -> Resolver { |
623 | let def_map = db.crate_def_map(self.krate); | 636 | let def_map = self.def_map(db); |
624 | Resolver::default().push_module_scope(def_map, self.local_id) | 637 | Resolver::default().push_module_scope(def_map, self.local_id) |
625 | } | 638 | } |
626 | } | 639 | } |