@@ -166,23 +166,16 @@ pub(crate) fn merge_use_trees(use_trees: Vec<UseTree>) -> Vec<UseTree> {
166
166
}
167
167
168
168
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
+ }
170
174
}
171
175
}
172
176
result
173
177
}
174
178
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
-
186
179
impl fmt:: Debug for UseTree {
187
180
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
188
181
fmt:: Display :: fmt ( self , f)
@@ -595,7 +588,6 @@ fn merge_rest(a: &[UseSegment], b: &[UseSegment], mut len: usize) -> Option<Vec<
595
588
if a. len ( ) != len && b. len ( ) != len {
596
589
if let UseSegment :: List ( mut list) = a[ len] . clone ( ) {
597
590
merge_use_trees_inner ( & mut list, UseTree :: from_path ( b[ len..] . to_vec ( ) , DUMMY_SP ) ) ;
598
- list. sort ( ) ;
599
591
let mut new_path = b[ ..len] . to_vec ( ) ;
600
592
new_path. push ( UseSegment :: List ( list) ) ;
601
593
return Some ( new_path) ;
@@ -622,6 +614,26 @@ fn merge_rest(a: &[UseSegment], b: &[UseSegment], mut len: usize) -> Option<Vec<
622
614
Some ( new_path)
623
615
}
624
616
617
+ fn merge_use_trees_inner ( trees : & mut Vec < UseTree > , use_tree : UseTree ) {
618
+ let similar_trees = trees. iter_mut ( ) . filter ( |tree| tree. share_prefix ( & use_tree) ) ;
619
+ if use_tree. path . len ( ) == 1 {
620
+ if let Some ( tree) = similar_trees. min_by_key ( |tree| tree. path . len ( ) ) {
621
+ if tree. path . len ( ) == 1 {
622
+ return ;
623
+ }
624
+ }
625
+ } else {
626
+ if let Some ( tree) = similar_trees. max_by_key ( |tree| tree. path . len ( ) ) {
627
+ if tree. path . len ( ) > 1 {
628
+ tree. merge ( & use_tree) ;
629
+ return ;
630
+ }
631
+ }
632
+ }
633
+ trees. push ( use_tree) ;
634
+ trees. sort ( ) ;
635
+ }
636
+
625
637
impl PartialOrd for UseSegment {
626
638
fn partial_cmp ( & self , other : & UseSegment ) -> Option < Ordering > {
627
639
Some ( self . cmp ( other) )
@@ -988,7 +1000,12 @@ mod test {
988
1000
test_merge ! ( [ "a::b::{c, d}" , "a::b::{e, f}" ] , [ "a::b::{c, d, e, f}" ] ) ;
989
1001
test_merge ! ( [ "a::b::c" , "a::b" ] , [ "a::{b, b::c}" ] ) ;
990
1002
test_merge ! ( [ "a::b" , "a::b" ] , [ "a::b" ] ) ;
991
- test_merge ! ( [ "a" , "a::b" , "a::b::c" ] , [ "a::{self, b::{self, c}}" ] ) ;
1003
+ test_merge ! ( [ "a" , "a::b" , "a::b::c" ] , [ "a::{self, b, b::c}" ] ) ;
1004
+ test_merge ! (
1005
+ [ "a" , "a::b" , "a::b::c" , "a::b::c::d" ] ,
1006
+ [ "a::{self, b, b::{c, c::d}}" ]
1007
+ ) ;
1008
+ test_merge ! ( [ "a" , "a::b" , "a::b::c" , "a::b" ] , [ "a::{self, b, b::c}" ] ) ;
992
1009
test_merge ! (
993
1010
[ "a::{b::{self, c}, d::e}" , "a::d::f" ] ,
994
1011
[ "a::{b::{self, c}, d::{e, f}}" ]
0 commit comments