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 From c312ab51d0d0bcee9514e08e6fafea26d061ea67 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Fri, 5 Feb 2021 19:25:50 +0100 Subject: Test `super` resolution too --- crates/hir_def/src/body/tests/block.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/hir_def/src/body/tests/block.rs b/crates/hir_def/src/body/tests/block.rs index e688c0989..b599c6269 100644 --- a/crates/hir_def/src/body/tests/block.rs +++ b/crates/hir_def/src/body/tests/block.rs @@ -32,6 +32,7 @@ fn outer() { use Struct as PlainStruct; use crate::Struct as CrateStruct; use self::Struct as SelfStruct; + use super::Struct as SuperStruct; $0 } "#, @@ -41,6 +42,7 @@ fn outer() { PlainStruct: t v SelfStruct: t Struct: v + SuperStruct: _ crate Struct: t -- cgit v1.2.3