mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-13 21:54:42 +00:00
Merge #9187
9187: fix: Fix edge case for ImportGranularity guessing r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
f1a40f9093
3 changed files with 30 additions and 8 deletions
|
@ -120,15 +120,19 @@ impl ImportScope {
|
||||||
if eq_visibility(prev_vis, curr_vis.clone()) && eq_attrs(prev_attrs, curr_attrs.clone())
|
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((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() {
|
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.
|
let prefix_c = prev_prefix.qualifiers().count();
|
||||||
break ImportGranularityGuess::Item; // this overwrites CrateOrModule, technically the file doesn't adhere to anything here.
|
let curr_c = curr_path.qualifiers().count() - prefix_c;
|
||||||
} else {
|
let prev_c = prev_path.qualifiers().count() - prefix_c;
|
||||||
// Same prefix with item tree lists, has to be module style as it
|
if curr_c <= 1 || prev_c <= 1 {
|
||||||
// can't be crate style since the trees wouldn't share a prefix then.
|
// Same prefix but no use tree lists so this has to be of item style.
|
||||||
break ImportGranularityGuess::Module;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -660,6 +660,13 @@ fn guess_item() {
|
||||||
r"
|
r"
|
||||||
use foo::bar::baz;
|
use foo::bar::baz;
|
||||||
use foo::bar::qux;
|
use foo::bar::qux;
|
||||||
|
",
|
||||||
|
ImportGranularityGuess::Item,
|
||||||
|
);
|
||||||
|
check_guess(
|
||||||
|
r"
|
||||||
|
use foo::bar::Bar;
|
||||||
|
use foo::baz;
|
||||||
",
|
",
|
||||||
ImportGranularityGuess::Item,
|
ImportGranularityGuess::Item,
|
||||||
);
|
);
|
||||||
|
@ -679,6 +686,14 @@ use foo::bar::{qux, quux};
|
||||||
r"
|
r"
|
||||||
use foo::bar::baz;
|
use foo::bar::baz;
|
||||||
use foo::{baz::{qux, quux}, bar};
|
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,
|
ImportGranularityGuess::Module,
|
||||||
);
|
);
|
||||||
|
|
|
@ -259,11 +259,14 @@ impl ast::Path {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn segments(&self) -> impl Iterator<Item = ast::PathSegment> + Clone {
|
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| {
|
successors(self.first_segment(), |p| {
|
||||||
p.parent_path().parent_path().and_then(|p| p.segment())
|
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 {
|
impl ast::UseTree {
|
||||||
pub fn is_simple_path(&self) -> bool {
|
pub fn is_simple_path(&self) -> bool {
|
||||||
|
|
Loading…
Reference in a new issue