@@ -179,19 +179,26 @@ pub(crate) fn merge_use_trees(use_trees: Vec<UseTree>, merge_by: SharedPrefix) -
179
179
}
180
180
}
181
181
}
182
- for merged in & mut result {
183
- // If a path ends with `::self`, rewrite it to `::{self}`.
184
- if let Some ( UseSegment :: Slf ( ..) ) = merged. path . last ( ) {
185
- let slf_segment = merged. path . pop ( ) . unwrap ( ) ;
186
- merged. path . push ( UseSegment :: List ( vec ! [ UseTree :: from_path(
187
- vec![ slf_segment] ,
188
- DUMMY_SP ,
189
- ) ] ) ) ;
190
- }
191
- }
192
182
result
193
183
}
194
184
185
+ pub ( crate ) fn flatten_use_trees ( use_trees : Vec < UseTree > ) -> Vec < UseTree > {
186
+ use_trees
187
+ . into_iter ( )
188
+ . flat_map ( UseTree :: flatten)
189
+ . map ( |mut tree| {
190
+ if let Some ( UseSegment :: Slf ( ..) ) = tree. path . last ( ) {
191
+ let self_segment = tree. path . pop ( ) . unwrap ( ) ;
192
+ tree. path . push ( UseSegment :: List ( vec ! [ UseTree :: from_path(
193
+ vec![ self_segment] ,
194
+ DUMMY_SP ,
195
+ ) ] ) ) ;
196
+ }
197
+ tree
198
+ } )
199
+ . collect ( )
200
+ }
201
+
195
202
impl fmt:: Debug for UseTree {
196
203
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
197
204
fmt:: Display :: fmt ( self , f)
@@ -552,25 +559,24 @@ impl UseTree {
552
559
SharedPrefix :: Module => {
553
560
self . path [ ..self . path . len ( ) - 1 ] == other. path [ ..other. path . len ( ) - 1 ]
554
561
}
555
- SharedPrefix :: NoPrefix => false ,
556
562
}
557
563
}
558
564
}
559
565
560
566
fn flatten ( self ) -> Vec < UseTree > {
561
567
match self . path . last ( ) {
562
568
Some ( UseSegment :: List ( list) ) => {
569
+ if list. len ( ) == 1 && list[ 0 ] . path . len ( ) == 1 {
570
+ if let UseSegment :: Slf ( ..) = list[ 0 ] . path [ 0 ] {
571
+ return vec ! [ self ] ;
572
+ } ;
573
+ }
563
574
let prefix = & self . path [ ..self . path . len ( ) - 1 ] ;
564
575
let mut result = vec ! [ ] ;
565
576
for nested_use_tree in list {
566
577
for flattened in & mut nested_use_tree. clone ( ) . flatten ( ) {
567
578
let mut new_path = prefix. to_vec ( ) ;
568
579
new_path. append ( & mut flattened. path ) ;
569
- if flattened. path . len ( ) == 1 {
570
- if let UseSegment :: Slf ( ..) = flattened. path [ 0 ] {
571
- new_path. pop ( ) ;
572
- }
573
- }
574
580
result. push ( UseTree {
575
581
path : new_path,
576
582
span : self . span ,
@@ -865,7 +871,6 @@ impl Rewrite for UseTree {
865
871
pub ( crate ) enum SharedPrefix {
866
872
Crate ,
867
873
Module ,
868
- NoPrefix
D7AE
,
869
874
}
870
875
871
876
#[ cfg( test) ]
@@ -1081,24 +1086,22 @@ mod test {
1081
1086
}
1082
1087
1083
1088
#[ test]
1084
- fn test_use_tree_merge_no_prefix ( ) {
1085
- test_merge ! (
1086
- NoPrefix ,
1087
- [ "foo::{a::{b, c}, d::e}" ] ,
1088
- [ "foo::a::b" , "foo::a::c" , "foo::d::e" ]
1089
+ fn test_flatten_use_trees ( ) {
1090
+ assert_eq ! (
1091
+ flatten_use_trees( parse_use_trees![ "foo::{a::{b, c}, d::e}" ] ) ,
1092
+ parse_use_trees![ "foo::a::b" , "foo::a::c" , "foo::d::e" ]
1089
1093
) ;
1090
1094
1091
- test_merge ! (
1092
- NoPrefix ,
1093
- [ "foo::{self, a, b::{c, d}, e::*}" ] ,
1094
- [
1095
+ assert_eq ! (
1096
+ flatten_use_trees( parse_use_trees![ "foo::{self, a, b::{c, d}, e::*}" ] ) ,
1097
+ parse_use_trees![
1095
1098
"foo::{self}" ,
1096
1099
"foo::a" ,
1097
1100
"foo::b::c" ,
1098
1101
"foo::b::d" ,
1099
1102
"foo::e::*"
1100
1103
]
1101
- )
1104
+ ) ;
1102
1105
}
1103
1106
1104
1107
#[ test]
0 commit comments