@@ -190,13 +190,17 @@ pub(crate) fn merge_use_trees(use_trees: Vec<UseTree>, merge_by: SharedPrefix) -
190
190
continue ;
191
191
}
192
192
193
- for flattened in use_tree. flatten ( ) {
193
+ for mut flattened in use_tree. flatten ( ) {
194
194
if let Some ( tree) = result
195
195
. iter_mut ( )
196
196
. find ( |tree| tree. share_prefix ( & flattened, merge_by) )
197
197
{
198
198
tree. merge ( & flattened, merge_by) ;
199
199
} else {
200
+ // If this is the first tree with this prefix, handle potential trailing ::self
201
+ if merge_by == SharedPrefix :: Module {
202
+ flattened = flattened. nest_trailing_self ( ) ;
203
+ }
200
204
result. push ( flattened) ;
201
205
}
202
206
}
@@ -208,17 +212,7 @@ pub(crate) fn flatten_use_trees(use_trees: Vec<UseTree>) -> Vec<UseTree> {
208
212
use_trees
209
213
. into_iter ( )
210
214
. flat_map ( UseTree :: flatten)
211
- . map ( |mut tree| {
212
- // If a path ends in `::self`, rewrite it to `::{self}`.
213
- if let Some ( UseSegment :: Slf ( ..) ) = tree. path . last ( ) {
214
- let self_segment = tree. path . pop ( ) . unwrap ( ) ;
215
- tree. path . push ( UseSegment :: List ( vec ! [ UseTree :: from_path(
216
- vec![ self_segment] ,
217
- DUMMY_SP ,
218
- ) ] ) ) ;
219
- }
220
- tree
221
- } )
215
+ . map ( UseTree :: nest_trailing_self)
222
216
. collect ( )
223
217
}
224
218
@@ -635,6 +629,18 @@ impl UseTree {
635
629
self . span = self . span . to ( other. span ) ;
636
630
}
637
631
}
632
+
633
+ /// If this tree ends in `::self`, rewrite it to `::{self}`.
634
+ fn nest_trailing_self ( mut self ) -> UseTree {
635
+ if let Some ( UseSegment :: Slf ( ..) ) = self . path . last ( ) {
636
+ let self_segment = self . path . pop ( ) . unwrap ( ) ;
637
+ self . path . push ( UseSegment :: List ( vec ! [ UseTree :: from_path(
638
+ vec![ self_segment] ,
639
+ DUMMY_SP ,
640
+ ) ] ) ) ;
641
+ }
642
+ self
643
+ }
638
644
}
639
645
640
646
fn merge_rest (
@@ -1311,4 +1317,24 @@ mod test {
1311
1317
< parse_use_tree( "std::cmp::{b, e, g, f}" ) . normalize( )
1312
1318
) ;
1313
1319
}
1320
+
1321
+ #[ test]
1322
+ fn test_use_tree_nest_trailing_self ( ) {
1323
+ assert_eq ! (
1324
+ parse_use_tree( "a::b::self" ) . nest_trailing_self( ) ,
1325
+ parse_use_tree( "a::b::{self}" )
1326
+ ) ;
1327
+ assert_eq ! (
1328
+ parse_use_tree( "a::b::c" ) . nest_trailing_self( ) ,
1329
+ parse_use_tree( "a::b::c" )
1330
+ ) ;
1331
+ assert_eq ! (
1332
+ parse_use_tree( "a::b::{c, d}" ) . nest_trailing_self( ) ,
1333
+ parse_use_tree( "a::b::{c, d}" )
1334
+ ) ;
1335
+ assert_eq ! (
1336
+ parse_use_tree( "a::b::{self, c}" ) . nest_trailing_self( ) ,
1337
+ parse_use_tree( "a::b::{self, c}" )
1338
+ ) ;
1339
+ }
1314
1340
}
0 commit comments