Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/resolver.rs')
| -rw-r--r-- | crates/hir-def/src/resolver.rs | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/crates/hir-def/src/resolver.rs b/crates/hir-def/src/resolver.rs index 28d460b503..b159b0142a 100644 --- a/crates/hir-def/src/resolver.rs +++ b/crates/hir-def/src/resolver.rs @@ -212,7 +212,7 @@ impl<'db> Resolver<'db> { let first_name = path.segments().first()?; let skip_to_mod = path.kind != PathKind::Plain; if skip_to_mod { - return self.module_scope.resolve_path_in_type_ns(db, path); + return self.skip_to_mod(|scope| scope.resolve_path_in_type_ns(db, path)); } let remaining_idx = || { @@ -326,6 +326,18 @@ impl<'db> Resolver<'db> { self.resolve_path_in_value_ns_with_prefix_info(db, path, hygiene_id).map(|(it, _)| it) } + fn skip_to_mod<'this, T>( + &'this self, + mut f: impl FnMut(&'this ModuleItemMap<'db>) -> Option<T>, + ) -> Option<T> { + self.scopes() + .find_map(|scope| match scope { + Scope::BlockScope(it) => f(it), + _ => None, + }) + .or_else(|| f(&self.module_scope)) + } + pub fn resolve_path_in_value_ns_with_prefix_info( &self, db: &dyn SourceDatabase, @@ -379,7 +391,7 @@ impl<'db> Resolver<'db> { let first_name = if path.is_self() { &tmp } else { path.segments().first()? }; let skip_to_mod = path.kind != PathKind::Plain && !path.is_self(); if skip_to_mod { - return self.module_scope.resolve_path_in_value_ns(db, path); + return self.skip_to_mod(|scope| scope.resolve_path_in_value_ns(db, path)); } if n_segments <= 1 { |