Skip to content

Commit 811f06f

Browse files
committed
Another fix for merge_imports
1 parent f800ce4 commit 811f06f

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

src/imports.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -166,23 +166,16 @@ pub(crate) fn merge_use_trees(use_trees: Vec<UseTree>) -> Vec<UseTree> {
166166
}
167167

168168
for flattened in use_tree.flatten() {
169-
merge_use_trees_inner(&mut result, flattened);
169+
if let Some(tree) = result.iter_mut().find(|tree| tree.share_prefix(&flattened)) {
170+
tree.merge(&flattened);
171+
} else {
172+
result.push(flattened);
173+
}
170174
}
171175
}
172176
result
173177
}
174178

175-
fn merge_use_trees_inner(trees: &mut Vec<UseTree>, use_tree: UseTree) {
176-
for tree in trees.iter_mut() {
177-
if tree.share_prefix(&use_tree) {
178-
tree.merge(&use_tree);
179-
return;
180-
}
181-
}
182-
183-
trees.push(use_tree);
184-
}
185-
186179
impl fmt::Debug for UseTree {
187180
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
188181
fmt::Display::fmt(self, f)
@@ -594,7 +587,16 @@ fn merge_rest(a: &[UseSegment], b: &[UseSegment], mut len: usize) -> Option<Vec<
594587
}
595588
if a.len() != len && b.len() != len {
596589
if let UseSegment::List(mut list) = a[len].clone() {
597-
merge_use_trees_inner(&mut list, UseTree::from_path(b[len..].to_vec(), DUMMY_SP));
590+
let b_rest = UseTree::from_path(b[len..].to_vec(), DUMMY_SP);
591+
if let Some(a_rest) = list.iter_mut().find(|a_rest| a_rest.share_prefix(&b_rest)) {
592+
if a_rest.path.len() > 1 && b_rest.path.len() > 1 {
593+
a_rest.merge(&b_rest);
594+
} else if a_rest.path.len() > 1 || b_rest.path.len() > 1 {
595+
list.push(b_rest);
596+
}
597+
} else {
598+
list.push(b_rest);
599+
}
598600
list.sort();
599601
let mut new_path = b[..len].to_vec();
600602
new_path.push(UseSegment::List(list));
@@ -988,7 +990,7 @@ mod test {
988990
test_merge!(["a::b::{c, d}", "a::b::{e, f}"], ["a::b::{c, d, e, f}"]);
989991
test_merge!(["a::b::c", "a::b"], ["a::{b, b::c}"]);
990992
test_merge!(["a::b", "a::b"], ["a::b"]);
991-
test_merge!(["a", "a::b", "a::b::c"], ["a::{self, b::{self, c}}"]);
993+
test_merge!(["a", "a::b", "a::b::c"], ["a::{self, b, b::c}"]);
992994
test_merge!(
993995
["a::{b::{self, c}, d::e}", "a::d::f"],
994996
["a::{b::{self, c}, d::{e, f}}"]

tests/target/configs/imports_layout/merge_mixed.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,4 @@
22
// rustfmt-merge_imports: true
33
// rustfmt-imports_layout: Mixed
44

5-
use std::{
6-
fmt, io,
7-
str::{self, FromStr},
8-
};
5+
use std::{fmt, io, str, str::FromStr};

0 commit comments

Comments
 (0)