From 997bd97b77e0cacf7eb8e466071e416492cc24b3 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Fri, 5 Feb 2021 19:24:03 +0100 Subject: Fix resolution of `self` module within blocks --- crates/hir_def/src/body/tests/block.rs | 14 ++++++++------ crates/hir_def/src/nameres/path_resolution.rs | 10 +++++++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/crates/hir_def/src/body/tests/block.rs b/crates/hir_def/src/body/tests/block.rs index 062560a70..e688c0989 100644 --- a/crates/hir_def/src/body/tests/block.rs +++ b/crates/hir_def/src/body/tests/block.rs @@ -26,9 +26,10 @@ fn outer() { fn use_from_crate() { check_at( r#" -struct Struct; +struct Struct {} fn outer() { - use Struct; + fn Struct() {} + use Struct as PlainStruct; use crate::Struct as CrateStruct; use self::Struct as SelfStruct; $0 @@ -36,12 +37,13 @@ fn outer() { "#, expect![[r#" block scope - CrateStruct: t v - SelfStruct: t v - Struct: t v + CrateStruct: t + PlainStruct: t v + SelfStruct: t + Struct: v crate - Struct: t v + Struct: t outer: v "#]], ); diff --git a/crates/hir_def/src/nameres/path_resolution.rs b/crates/hir_def/src/nameres/path_resolution.rs index 036e389b0..fdcdc23ae 100644 --- a/crates/hir_def/src/nameres/path_resolution.rs +++ b/crates/hir_def/src/nameres/path_resolution.rs @@ -227,7 +227,15 @@ impl DefMap { } } - PerNs::types(self.module_id(module).into(), Visibility::Public) + // Resolve `self` to the containing crate-rooted module if we're a block + self.with_ancestor_maps(db, module, &mut |def_map, module| { + if def_map.block.is_some() { + None // keep ascending + } else { + Some(PerNs::types(def_map.module_id(module).into(), Visibility::Public)) + } + }) + .expect("block DefMap not rooted in crate DefMap") } PathKind::Abs => { // 2018-style absolute path -- only extern prelude -- cgit v1.2.3