11259: fix: fix `use super::{super::...};` r=jonas-schievink a=jonas-schievink

Fixes https://github.com/rust-analyzer/rust-analyzer/issues/11249

bors r+

Co-authored-by: Jonas Schievink <jonas.schievink@ferrous-systems.com>
This commit is contained in:
bors[bot] 2022-01-11 14:43:44 +00:00 committed by GitHub
commit a3393c9a57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 6 deletions

View File

@ -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,
}
}

View File

@ -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
"#]],
)
}