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.rs16
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 {