From 7e8b96f07cf406a17f276c4f4b98657b46364f05 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Tue, 11 Jan 2022 15:30:39 +0100 Subject: [PATCH] Fix concatenation of `super` mod paths --- crates/hir_def/src/item_tree.rs | 24 +++++++++++++++----- crates/hir_def/src/nameres/tests.rs | 35 +++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/crates/hir_def/src/item_tree.rs b/crates/hir_def/src/item_tree.rs index c51201f675..0af5d654af 100644 --- a/crates/hir_def/src/item_tree.rs +++ b/crates/hir_def/src/item_tree.rs @@ -790,14 +790,26 @@ impl UseTree { } Some((prefix, ImportKind::Plain)) } - (Some(prefix), PathKind::Super(0)) => { - // `some::path::self` == `some::path` - if path.segments().is_empty() { - Some((prefix, ImportKind::TypeOnly)) - } else { - None + (Some(mut prefix), PathKind::Super(n)) + if *n > 0 && prefix.segments().is_empty() => + { + // `super::super` + `super::rest` + match &mut prefix.kind { + PathKind::Super(m) => { + cov_mark::hit!(concat_super_mod_paths); + *m += *n; + for segment in path.segments() { + prefix.push_segment(segment.clone()); + } + Some((prefix, ImportKind::Plain)) + } + _ => None, } } + (Some(prefix), PathKind::Super(0)) if path.segments().is_empty() => { + // `some::path::self` == `some::path` + Some((prefix, ImportKind::TypeOnly)) + } (Some(_), _) => None, } } diff --git a/crates/hir_def/src/nameres/tests.rs b/crates/hir_def/src/nameres/tests.rs index 37336ce1e9..4794932855 100644 --- a/crates/hir_def/src/nameres/tests.rs +++ b/crates/hir_def/src/nameres/tests.rs @@ -890,3 +890,38 @@ pub struct Struct; "#]], ); } + +#[test] +fn braced_supers_in_use_tree() { + cov_mark::check!(concat_super_mod_paths); + check( + r#" +mod some_module { + pub fn unknown_func() {} +} + +mod other_module { + mod some_submodule { + use { super::{ super::unknown_func, }, }; + } +} + +use some_module::unknown_func; + "#, + expect![[r#" + crate + other_module: t + some_module: t + unknown_func: v + + crate::some_module + unknown_func: v + + crate::other_module + some_submodule: t + + crate::other_module::some_submodule + unknown_func: v + "#]], + ) +}