@@ -13,7 +13,7 @@ use utils;
13
13
use syntax:: codemap:: { self , BytePos , Span } ;
14
14
use codemap:: SpanUtils ;
15
15
use lists:: { write_list, itemize_list, ListItem , ListFormatting , SeparatorTactic , definitive_tactic} ;
16
- use types:: rewrite_path;
16
+ use types:: { rewrite_path, PathContext } ;
17
17
use rewrite:: { Rewrite , RewriteContext } ;
18
18
use visitor:: FmtVisitor ;
19
19
use std:: cmp:: { self , Ordering } ;
@@ -139,17 +139,20 @@ impl Rewrite for ast::ViewPath {
139
139
// 4 = " as ".len()
140
140
let budget = try_opt ! ( width. checked_sub( ident_str. len( ) + 4 ) ) ;
141
141
142
- let path_str = if context. config . normalize_imports &&
143
- path. segments . last ( ) . unwrap ( ) . identifier . to_string ( ) == "self" &&
142
+ let path_str = if path. segments . last ( ) . unwrap ( ) . identifier . to_string ( ) == "self" &&
144
143
path. segments . len ( ) > 1 {
145
144
let path = & ast:: Path {
146
145
span : path. span . clone ( ) ,
147
146
segments : path. segments [ ..path. segments . len ( ) - 1 ] . to_owned ( ) ,
148
- global : path. global ,
149
147
} ;
150
- try_opt ! ( rewrite_path( context, false , None , & path, budget, offset) )
148
+ try_opt ! ( rewrite_path( context,
149
+ PathContext :: Import ,
150
+ None ,
151
+ & path,
152
+ budget,
153
+ offset) )
151
154
} else {
152
- try_opt ! ( rewrite_path( context, false , None , path, budget, offset) )
155
+ try_opt ! ( rewrite_path( context, PathContext :: Import , None , path, budget, offset) )
153
156
} ;
154
157
155
158
Some ( if path. segments . last ( ) . unwrap ( ) . identifier == ident {
@@ -248,17 +251,22 @@ impl<'a> FmtVisitor<'a> {
248
251
}
249
252
}
250
253
251
- fn rewrite_single_use_list ( path_str : Option < String > ,
252
- vpi : & ast:: PathListItem ,
253
- context : & RewriteContext )
254
- -> String {
255
- let path_item_str = match path_str {
256
- Some ( ref path_str) if vpi. node . name . to_string ( ) == "self" &&
257
- context. config . normalize_imports => path_str. to_owned ( ) ,
258
- Some ( path_str) => format ! ( "{}::{}" , path_str, vpi. node. name) ,
259
- None => vpi. node . name . to_string ( ) ,
254
+ fn rewrite_single_use_list ( path_str : String , vpi : & ast:: PathListItem ) -> String {
255
+ let mut item_str = vpi. node . name . to_string ( ) ;
256
+ if item_str == "self" {
257
+ item_str = "" . to_owned ( ) ;
258
+ }
259
+ let path_item_str = if path_str. is_empty ( ) {
260
+ if item_str. is_empty ( ) {
261
+ "self" . to_owned ( )
262
+ } else {
263
+ item_str
264
+ }
265
+ } else if item_str. is_empty ( ) {
266
+ path_str
267
+ } else {
268
+ format ! ( "{}::{}" , path_str, item_str)
260
269
} ;
261
-
262
270
append_alias ( path_item_str, vpi)
263
271
}
264
272
@@ -283,27 +291,16 @@ pub fn rewrite_use_list(width: usize,
283
291
context : & RewriteContext )
284
292
-> Option < String > {
285
293
// Returns a different option to distinguish `::foo` and `foo`
286
- let opt_path_str = if !path. to_string ( ) . is_empty ( ) {
287
- Some ( path. to_string ( ) )
288
- } else if path. global {
289
- // path is absolute, we return an empty String to avoid a double `::`
290
- Some ( String :: new ( ) )
291
- } else {
292
- None
293
- } ;
294
+ let path_str = try_opt ! ( rewrite_path( context, PathContext :: Import , None , path, width, offset) ) ;
294
295
295
296
match path_list. len ( ) {
296
297
0 => unreachable ! ( ) ,
297
- 1 => return Some ( rewrite_single_use_list ( opt_path_str , & path_list[ 0 ] , context ) ) ,
298
+ 1 => return Some ( rewrite_single_use_list ( path_str , & path_list[ 0 ] ) ) ,
298
299
_ => ( ) ,
299
300
}
300
301
301
- // 2 = ::
302
- let path_separation_w = if opt_path_str. is_some ( ) { 2 } else { 0 } ;
303
- // 1 = {
304
- let supp_indent = path. to_string ( ) . len ( ) + path_separation_w + 1 ;
305
- // 1 = }
306
- let remaining_width = width. checked_sub ( supp_indent + 1 ) . unwrap_or ( 0 ) ;
302
+ // 2 = {}
303
+ let remaining_width = width. checked_sub ( path_str. len ( ) + 2 ) . unwrap_or ( 0 ) ;
307
304
308
305
let mut items = {
309
306
// Dummy value, see explanation below.
@@ -330,14 +327,16 @@ pub fn rewrite_use_list(width: usize,
330
327
items[ 1 ..] . sort_by ( |a, b| a. item . cmp ( & b. item ) ) ;
331
328
}
332
329
330
+ let colons_offset = if path_str. is_empty ( ) { 0 } else { 2 } ;
331
+
333
332
let tactic = definitive_tactic ( & items[ first_index..] ,
334
333
:: lists:: ListTactic :: Mixed ,
335
334
remaining_width) ;
336
335
let fmt = ListFormatting {
337
336
tactic : tactic,
338
337
separator : "," ,
339
338
trailing_separator : SeparatorTactic :: Never ,
340
- indent : offset + supp_indent ,
339
+ indent : offset + path_str . len ( ) + 1 + colons_offset ,
341
340
// FIXME This is too conservative, and will not use all width
342
341
// available
343
342
// (loose 1 column (";"))
@@ -347,9 +346,10 @@ pub fn rewrite_use_list(width: usize,
347
346
} ;
348
347
let list_str = try_opt ! ( write_list( & items[ first_index..] , & fmt) ) ;
349
348
350
- Some ( match opt_path_str {
351
- Some ( opt_path_str) => format ! ( "{}::{{{}}}" , opt_path_str, list_str) ,
352
- None => format ! ( "{{{}}}" , list_str) ,
349
+ Some ( if path_str. is_empty ( ) {
350
+ format ! ( "{{{}}}" , list_str)
351
+ } else {
352
+ format ! ( "{}::{{{}}}" , path_str, list_str)
353
353
} )
354
354
}
355
355
0 commit comments