Fix resolution of self module within blocks

This commit is contained in:
Jonas Schievink 2021-02-05 19:24:03 +01:00
parent 80ab753d7e
commit 997bd97b77
2 changed files with 17 additions and 7 deletions

View File

@ -26,9 +26,10 @@ fn inner() {}
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
"#]],
);

View File

@ -227,7 +227,15 @@ pub(super) fn resolve_path_fp_with_macro_single(
}
}
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