@@ -10,6 +10,7 @@ use rustc_span::{
10
10
11
11
use crate :: comment:: combine_strs_with_missing_comments;
12
12
use crate :: config:: lists:: * ;
13
+ use crate :: config:: ImportGranularity ;
13
14
use crate :: config:: { Edition , IndentStyle } ;
14
15
use crate :: lists:: {
15
16
definitive_tactic, itemize_list, write_list, ListFormatting , ListItem , Separator ,
@@ -182,15 +183,26 @@ impl UseSegment {
182
183
}
183
184
}
184
185
185
- pub ( crate ) fn merge_use_trees ( use_trees : Vec < UseTree > , merge_by : SharedPrefix ) -> Vec < UseTree > {
186
+ pub ( crate ) fn regroup_use_trees (
187
+ use_trees : Vec < UseTree > ,
188
+ import_granularity : ImportGranularity ,
189
+ ) -> Vec < UseTree > {
190
+ let merge_by = match import_granularity {
191
+ ImportGranularity :: Item => return flatten_use_trees ( use_trees, ImportGranularity :: Item ) ,
192
+ ImportGranularity :: Preserve => return use_trees,
193
+ ImportGranularity :: Crate => SharedPrefix :: Crate ,
194
+ ImportGranularity :: Module => SharedPrefix :: Module ,
195
+ ImportGranularity :: One => SharedPrefix :: One ,
196
+ } ;
197
+
186
198
let mut result = Vec :: with_capacity ( use_trees. len ( ) ) ;
187
199
for use_tree in use_trees {
188
200
if use_tree. has_comment ( ) || use_tree. attrs . is_some ( ) {
189
201
result. push ( use_tree) ;
190
202
continue ;
191
203
}
192
204
193
- for mut flattened in use_tree. flatten ( ) {
205
+ for mut flattened in use_tree. flatten ( import_granularity ) {
194
206
if let Some ( tree) = result
195
207
. iter_mut ( )
196
208
. find ( |tree| tree. share_prefix ( & flattened, merge_by) )
@@ -208,10 +220,13 @@ pub(crate) fn merge_use_trees(use_trees: Vec<UseTree>, merge_by: SharedPrefix) -
208
220
result
209
221
}
210
222
211
- pub ( crate ) fn flatten_use_trees ( use_trees : Vec < UseTree > ) -> Vec < UseTree > {
223
+ fn flatten_use_trees (
224
+ use_trees : Vec < UseTree > ,
225
+ import_granularity : ImportGranularity ,
226
+ ) -> Vec < UseTree > {
212
227
use_trees
213
228
. into_iter ( )
214
- . flat_map ( UseTree :: flatten)
229
+ . flat_map ( |tree| tree . flatten ( import_granularity ) )
215
230
. map ( UseTree :: nest_trailing_self)
216
231
. collect ( )
217
232
}
@@ -581,7 +596,7 @@ impl UseTree {
581
596
}
582
597
}
583
598
584
- fn flatten ( self ) -> Vec < UseTree > {
599
+ fn flatten ( self , import_granularity : ImportGranularity ) -> Vec < UseTree > {
585
600
if self . path . is_empty ( ) {
586
601
return vec ! [ self ] ;
587
602
}
@@ -595,15 +610,19 @@ impl UseTree {
595
610
let prefix = & self . path [ ..self . path . len ( ) - 1 ] ;
596
611
let mut result = vec ! [ ] ;
597
612
for nested_use_tree in list {
598
- for flattend in & mut nested_use_tree. clone ( ) . flatten ( ) {
613
+ for flattend in & mut nested_use_tree. clone ( ) . flatten ( import_granularity ) {
599
614
let mut new_path = prefix. to_vec ( ) ;
600
615
new_path. append ( & mut flattend. path ) ;
601
616
result. push ( UseTree {
602
617
path : new_path,
603
618
span : self . span ,
604
619
list_item : None ,
605
620
visibility : self . visibility . clone ( ) ,
606
- attrs : None ,
621
+ // only retain attributes for `ImportGranularity::Item`
622
+ attrs : match import_granularity {
623
+ ImportGranularity :: Item => self . attrs . clone ( ) ,
624
+ _ => None ,
625
+ } ,
607
626
} ) ;
608
627
}
609
628
}
@@ -951,7 +970,7 @@ impl Rewrite for UseTree {
951
970
}
952
971
953
972
#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
954
- pub ( crate ) enum SharedPrefix {
973
+ enum SharedPrefix {
955
974
Crate ,
956
975
Module ,
957
976
One ,
@@ -1106,7 +1125,7 @@ mod test {
1106
1125
macro_rules! test_merge {
1107
1126
( $by: ident, [ $( $input: expr) ,* $( , ) * ] , [ $( $output: expr) ,* $( , ) * ] ) => {
1108
1127
assert_eq!(
1109
- merge_use_trees ( parse_use_trees!( $( $input, ) * ) , SharedPrefix :: $by) ,
1128
+ regroup_use_trees ( parse_use_trees!( $( $input, ) * ) , ImportGranularity :: $by) ,
1110
1129
parse_use_trees!( $( $output, ) * ) ,
1111
1130
) ;
1112
1131
}
@@ -1215,12 +1234,18 @@ mod test {
1215
1234
#[ test]
1216
1235
fn test_flatten_use_trees ( ) {
1217
1236
assert_eq ! (
1218
- flatten_use_trees( parse_use_trees![ "foo::{a::{b, c}, d::e}" ] ) ,
1237
+ flatten_use_trees(
1238
+ parse_use_trees![ "foo::{a::{b, c}, d::e}" ] ,
1239
+ ImportGranularity :: Item
1240
+ ) ,
1219
1241
parse_use_trees![ "foo::a::b" , "foo::a::c" , "foo::d::e" ]
1220
1242
) ;
1221
1243
1222
1244
assert_eq ! (
1223
- flatten_use_trees( parse_use_trees![ "foo::{self, a, b::{c, d}, e::*}" ] ) ,
1245
+ flatten_use_trees(
1246
+ parse_use_trees![ "foo::{self, a, b::{c, d}, e::*}" ] ,
1247
+ ImportGranularity :: Item
1248
+ ) ,
1224
1249
parse_use_trees![
1225
1250
"foo::{self}" ,
1226
1251
"foo::a" ,
@@ -1234,12 +1259,13 @@ mod test {
1234
1259
#[ test]
1235
1260
fn test_use_tree_flatten ( ) {
1236
1261
assert_eq ! (
1237
- parse_use_tree( "a::b::{c, d, e, f}" ) . flatten( ) ,
1262
+ parse_use_tree( "a::b::{c, d, e, f}" ) . flatten( ImportGranularity :: Item ) ,
1238
1263
parse_use_trees!( "a::b::c" , "a::b::d" , "a::b::e" , "a::b::f" , )
1239
1264
) ;
1240
1265
1241
1266
assert_eq ! (
1242
- parse_use_tree( "a::b::{c::{d, e, f}, g, h::{i, j, k}}" ) . flatten( ) ,
1267
+ parse_use_tree( "a::b::{c::{d, e, f}, g, h::{i, j, k}}" )
1268
+ . flatten( ImportGranularity :: Item ) ,
1243
1269
parse_use_trees![
1244
1270
"a::b::c::d" ,
1245
1271
"a::b::c::e" ,
0 commit comments