Skip to content

Commit 2633e23

Browse files
author
Jonas Schievink
committed
resolver: manually traverse nested block scopes
1 parent 94aa3a7 commit 2633e23

File tree

4 files changed

+45
-5
lines changed

4 files changed

+45
-5
lines changed

crates/hir_def/src/nameres.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,23 @@ impl DefMap {
322322
(res.resolved_def, res.segment_index)
323323
}
324324

325+
pub(crate) fn resolve_path_locally(
326+
&self,
327+
db: &dyn DefDatabase,
328+
original_module: LocalModuleId,
329+
path: &ModPath,
330+
shadow: BuiltinShadowMode,
331+
) -> (PerNs, Option<usize>) {
332+
let res = self.resolve_path_fp_with_macro_single(
333+
db,
334+
ResolveMode::Other,
335+
original_module,
336+
path,
337+
shadow,
338+
);
339+
(res.resolved_def, res.segment_index)
340+
}
341+
325342
/// Ascends the `DefMap` hierarchy and calls `f` with every `DefMap` and containing module.
326343
///
327344
/// If `f` returns `Some(val)`, iteration is stopped and `Some(val)` is returned. If `f` returns

crates/hir_def/src/nameres/path_resolution.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ impl DefMap {
156156
}
157157
}
158158

159-
fn resolve_path_fp_with_macro_single(
159+
pub(super) fn resolve_path_fp_with_macro_single(
160160
&self,
161161
db: &dyn DefDatabase,
162162
mode: ResolveMode,

crates/hir_def/src/resolver.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ impl ModuleItemMap {
548548
path: &ModPath,
549549
) -> Option<ResolveValueResult> {
550550
let (module_def, idx) =
551-
self.def_map.resolve_path(db, self.module_id, &path, BuiltinShadowMode::Other);
551+
self.def_map.resolve_path_locally(db, self.module_id, &path, BuiltinShadowMode::Other);
552552
match idx {
553553
None => {
554554
let value = to_value_ns(module_def)?;
@@ -578,7 +578,7 @@ impl ModuleItemMap {
578578
path: &ModPath,
579579
) -> Option<(TypeNs, Option<usize>)> {
580580
let (module_def, idx) =
581-
self.def_map.resolve_path(db, self.module_id, &path, BuiltinShadowMode::Other);
581+
self.def_map.resolve_path_locally(db, self.module_id, &path, BuiltinShadowMode::Other);
582582
let res = to_type_ns(module_def)?;
583583
Some((res, idx))
584584
}
@@ -627,8 +627,18 @@ pub trait HasResolver: Copy {
627627

628628
impl HasResolver for ModuleId {
629629
fn resolver(self, db: &dyn DefDatabase) -> Resolver {
630-
let def_map = self.def_map(db);
631-
Resolver::default().push_module_scope(def_map, self.local_id)
630+
let mut def_map = self.def_map(db);
631+
let mut modules = Vec::new();
632+
modules.push((def_map.clone(), self.local_id));
633+
while let Some(parent) = def_map.parent() {
634+
def_map = parent.def_map(db);
635+
modules.push((def_map.clone(), parent.local_id));
636+
}
637+
let mut resolver = Resolver::default();
638+
for (def_map, module) in modules.into_iter().rev() {
639+
resolver = resolver.push_module_scope(def_map, module);
640+
}
641+
resolver
632642
}
633643
}
634644

crates/hir_ty/src/tests/regression.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,3 +961,16 @@ fn issue_6852() {
961961
"#]],
962962
);
963963
}
964+
965+
#[test]
966+
fn param_overrides_fn() {
967+
check_types(
968+
r#"
969+
fn example(example: i32) {
970+
fn f() {}
971+
example;
972+
//^^^^^^^ i32
973+
}
974+
"#,
975+
)
976+
}

0 commit comments

Comments
 (0)