Fix edge case for ImportGranularity guessing

This commit is contained in:
Lukas Wirth 2021-06-08 22:14:30 +02:00
parent 590472607c
commit 31aad2528f
3 changed files with 30 additions and 8 deletions

View File

@ -120,15 +120,19 @@ fn guess_granularity_from_scope(&self) -> ImportGranularityGuess {
if eq_visibility(prev_vis, curr_vis.clone()) && eq_attrs(prev_attrs, curr_attrs.clone())
{
if let Some((prev_path, curr_path)) = prev.path().zip(curr.path()) {
if let Some(_) = common_prefix(&prev_path, &curr_path) {
if let Some((prev_prefix, _)) = common_prefix(&prev_path, &curr_path) {
if prev.use_tree_list().is_none() && curr.use_tree_list().is_none() {
// Same prefix but no use tree lists so this has to be of item style.
break ImportGranularityGuess::Item; // this overwrites CrateOrModule, technically the file doesn't adhere to anything here.
} else {
// Same prefix with item tree lists, has to be module style as it
// can't be crate style since the trees wouldn't share a prefix then.
break ImportGranularityGuess::Module;
let prefix_c = prev_prefix.qualifiers().count();
let curr_c = curr_path.qualifiers().count() - prefix_c;
let prev_c = prev_path.qualifiers().count() - prefix_c;
if curr_c <= 1 || prev_c <= 1 {
// Same prefix but no use tree lists so this has to be of item style.
break ImportGranularityGuess::Item; // this overwrites CrateOrModule, technically the file doesn't adhere to anything here.
}
}
// Same prefix with item tree lists, has to be module style as it
// can't be crate style since the trees wouldn't share a prefix then.
break ImportGranularityGuess::Module;
}
}
}

View File

@ -660,6 +660,13 @@ fn guess_item() {
r"
use foo::bar::baz;
use foo::bar::qux;
",
ImportGranularityGuess::Item,
);
check_guess(
r"
use foo::bar::Bar;
use foo::baz;
",
ImportGranularityGuess::Item,
);
@ -679,6 +686,14 @@ fn guess_module() {
r"
use foo::bar::baz;
use foo::{baz::{qux, quux}, bar};
",
ImportGranularityGuess::Module,
);
check_guess(
r"
use foo::bar::Bar;
use foo::baz::Baz;
use foo::{Foo, Qux};
",
ImportGranularityGuess::Module,
);

View File

@ -259,11 +259,14 @@ pub fn first_segment(&self) -> Option<ast::PathSegment> {
}
pub fn segments(&self) -> impl Iterator<Item = ast::PathSegment> + Clone {
// cant make use of SyntaxNode::siblings, because the returned Iterator is not clone
successors(self.first_segment(), |p| {
p.parent_path().parent_path().and_then(|p| p.segment())
})
}
pub fn qualifiers(&self) -> impl Iterator<Item = ast::Path> + Clone {
successors(self.qualifier(), |p| p.qualifier())
}
}
impl ast::UseTree {
pub fn is_simple_path(&self) -> bool {