@@ -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 flattened in use_tree. flatten ( ) {
205
+ for 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) )
@@ -204,10 +216,13 @@ pub(crate) fn merge_use_trees(use_trees: Vec<UseTree>, merge_by: SharedPrefix) -
204
216
result
205
217
}
206
218
207
- pub ( crate ) fn flatten_use_trees ( use_trees : Vec < UseTree > ) -> Vec < UseTree > {
219
+ fn flatten_use_trees (
220
+ use_trees : Vec < UseTree > ,
221
+ import_granularity : ImportGranularity ,
222
+ ) -> Vec < UseTree > {
208
223
use_trees
209
224
. into_iter ( )
210
- . flat_map ( UseTree :: flatten)
225
+ . flat_map ( |tree| tree . flatten ( import_granularity ) )
211
226
. map ( |mut tree| {
212
227
// If a path ends in `::self`, rewrite it to `::{self}`.
213
228
if let Some ( UseSegment :: Slf ( ..) ) = tree. path . last ( ) {
@@ -587,7 +602,7 @@ impl UseTree {
587
602
}
588
603
}
589
604
590
- fn flatten ( self ) -> Vec < UseTree > {
605
+ fn flatten ( self , import_granularity : ImportGranularity ) -> Vec < UseTree > {
591
606
if self . path . is_empty ( ) {
592
607
return vec ! [ self ] ;
593
608
}
@@ -601,15 +616,19 @@ impl UseTree {
601
616
let prefix = & self . path [ ..self . path . len ( ) - 1 ] ;
602
617
let mut result = vec ! [ ] ;
603
618
for nested_use_tree in list {
604
- for flattend in & mut nested_use_tree. clone ( ) . flatten ( ) {
619
+ for flattend in & mut nested_use_tree. clone ( ) . flatten ( import_granularity ) {
605
620
let mut new_path = prefix. to_vec ( ) ;
606
621
new_path. append ( & mut flattend. path ) ;
607
622
result. push ( UseTree {
608
623
path : new_path,
609
624
span : self . span ,
610
625
list_item : None ,
611
626
visibility : self . visibility . clone ( ) ,
612
- attrs : None ,
627
+ // only retain attributes for `ImportGranularity::Item`
628
+ attrs : match import_granularity {
629
+ ImportGranularity :: Item => self . attrs . clone ( ) ,
630
+ _ => None ,
631
+ } ,
613
632
} ) ;
614
633
}
615
634
}
@@ -945,7 +964,7 @@ impl Rewrite for UseTree {
945
964
}
946
965
947
966
#[ derive( Copy , Clone , Debug , PartialEq , Eq ) ]
948
- pub ( crate ) enum SharedPrefix {
967
+ enum SharedPrefix {
949
968
Crate ,
950
969
Module ,
951
970
One ,
@@ -1100,7 +1119,7 @@ mod test {
1100
1119
macro_rules! test_merge {
1101
1120
( $by: ident, [ $( $input: expr) ,* $( , ) * ] , [ $( $output: expr) ,* $( , ) * ] ) => {
1102
1121
assert_eq!(
1103
- merge_use_trees ( parse_use_trees!( $( $input, ) * ) , SharedPrefix :: $by) ,
1122
+ regroup_use_trees ( parse_use_trees!( $( $input, ) * ) , ImportGranularity :: $by) ,
1104
1123
parse_use_trees!( $( $output, ) * ) ,
1105
1124
) ;
1106
1125
}
@@ -1209,12 +1228,18 @@ mod test {
1209
1228
#[ test]
1210
1229
fn test_flatten_use_trees ( ) {
1211
1230
assert_eq ! (
1212
- flatten_use_trees( parse_use_trees![ "foo::{a::{b, c}, d::e}" ] ) ,
1231
+ flatten_use_trees(
1232
+ parse_use_trees![ "foo::{a::{b, c}, d::e}" ] ,
1233
+ ImportGranularity :: Item
1234
+ ) ,
1213
1235
parse_use_trees![ "foo::a::b" , "foo::a::c" , "foo::d::e" ]
1214
1236
) ;
1215
1237
1216
1238
assert_eq ! (
1217
- flatten_use_trees( parse_use_trees![ "foo::{self, a, b::{c, d}, e::*}" ] ) ,
1239
+ flatten_use_trees(
1240
+ parse_use_trees![ "foo::{self, a, b::{c, d}, e::*}" ] ,
1241
+ ImportGranularity :: Item
1242
+ ) ,
1218
1243
parse_use_trees![
1219
1244
"foo::{self}" ,
1220
1245
"foo::a" ,
@@ -1228,12 +1253,13 @@ mod test {
1228
1253
#[ test]
1229
1254
fn test_use_tree_flatten ( ) {
1230
1255
assert_eq ! (
1231
- parse_use_tree( "a::b::{c, d, e, f}" ) . flatten( ) ,
1256
+ parse_use_tree( "a::b::{c, d, e, f}" ) . flatten( ImportGranularity :: Item ) ,
1232
1257
parse_use_trees!( "a::b::c" , "a::b::d" , "a::b::e" , "a::b::f" , )
1233
1258
) ;
1234
1259
1235
1260
assert_eq ! (
1236
- parse_use_tree( "a::b::{c::{d, e, f}, g, h::{i, j, k}}" ) . flatten( ) ,
1261
+ parse_use_tree( "a::b::{c::{d, e, f}, g, h::{i, j, k}}" )
1262
+ . flatten( ImportGranularity :: Item ) ,
1237
1263
parse_use_trees![
1238
1264
"a::b::c::d" ,
1239
1265
"a::b::c::e" ,
0 commit comments