@@ -340,7 +340,12 @@ impl<'a> FnSig<'a> {
340
340
fn to_str ( & self , context : & RewriteContext < ' _ > ) -> String {
341
341
let mut result = String :: with_capacity ( 128 ) ;
342
342
// Vis defaultness constness unsafety abi.
343
- result. push_str ( & * format_visibility ( context, self . visibility ) ) ;
343
+ let vis = format_visibility ( context, self . visibility ) ;
344
+ result. push_str ( & vis) ;
345
+ if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
346
+ // format_visibility doesn't have a trailing space in Version::Two
347
+ result. push ( ' ' ) ;
348
+ }
344
349
result. push_str ( format_defaultness ( self . defaultness ) ) ;
345
350
result. push_str ( format_constness ( self . constness ) ) ;
346
351
self . coroutine_kind
@@ -933,7 +938,12 @@ fn format_impl_ref_and_type(
933
938
} = * iimpl;
934
939
let mut result = String :: with_capacity ( 128 ) ;
935
940
936
- result. push_str ( & format_visibility ( context, & item. vis ) ) ;
941
+ let vis = format_visibility ( context, & item. vis ) ;
942
+ result. push_str ( & vis) ;
943
+ if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
944
+ // format_visibility doesn't have a trailing space in Version::Two
945
+ result. push ( ' ' ) ;
946
+ }
937
947
result. push_str ( format_defaultness ( defaultness) ) ;
938
948
result. push_str ( format_unsafety ( unsafety) ) ;
939
949
@@ -1142,12 +1152,16 @@ pub(crate) fn format_trait(
1142
1152
} = * * trait_kind;
1143
1153
1144
1154
let mut result = String :: with_capacity ( 128 ) ;
1145
- let header = format ! (
1146
- "{}{}{}trait " ,
1147
- format_visibility( context, & item. vis) ,
1148
- format_unsafety( unsafety) ,
1149
- format_auto( is_auto) ,
1150
- ) ;
1155
+
1156
+ let mut vis = format_visibility ( context, & item. vis ) ;
1157
+ if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
1158
+ // format_visibility doesn't have a trailing space in Version::Two
1159
+ vis += " " ;
1160
+ }
1161
+ let unsafety = format_unsafety ( unsafety) ;
1162
+ let auto = format_auto ( is_auto) ;
1163
+
1164
+ let header = format ! ( "{vis}{unsafety}{auto}trait " ) ;
1151
1165
result. push_str ( & header) ;
1152
1166
1153
1167
let body_lo = context. snippet_provider . span_after ( item. span , "{" ) ;
@@ -1350,8 +1364,13 @@ pub(crate) fn format_trait_alias(
1350
1364
// 6 = "trait ", 2 = " ="
1351
1365
let g_shape = shape. offset_left ( 6 ) ?. sub_width ( 2 ) ?;
1352
1366
let generics_str = rewrite_generics ( context, alias, generics, g_shape) ?;
1353
- let vis_str = format_visibility ( context, vis) ;
1354
- let lhs = format ! ( "{vis_str}trait {generics_str} =" ) ;
1367
+ let vis = format_visibility ( context, vis) ;
1368
+ let lhs = if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
1369
+ // format_visibility doesn't have a trailing space in Version::Two
1370
+ format ! ( "{vis} trait {generics_str} =" )
1371
+ } else {
1372
+ format ! ( "{vis}trait {generics_str} =" )
1373
+ } ;
1355
1374
// 1 = ";"
1356
1375
let trait_alias_bounds = TraitAliasBounds {
1357
1376
generic_bounds,
@@ -1738,7 +1757,13 @@ fn rewrite_ty<R: Rewrite>(
1738
1757
if !after_where_predicates. is_empty ( ) {
1739
1758
return None ;
1740
1759
}
1741
- result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
1760
+ let vis = format_visibility ( context, vis) ;
1761
+ result. push_str ( & vis) ;
1762
+ if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
1763
+ // format_visibility doesn't have a trailing space in Version::Two
1764
+ result. push ( ' ' ) ;
1765
+ }
1766
+ result. push_str ( "type " ) ;
1742
1767
let ident_str = rewrite_ident ( context, ident) ;
1743
1768
1744
1769
if generics. params . is_empty ( ) {
@@ -1836,18 +1861,22 @@ fn type_annotation_spacing(config: &Config) -> (&str, &str) {
1836
1861
pub ( crate ) fn rewrite_struct_field_prefix (
1837
1862
context : & RewriteContext < ' _ > ,
1838
1863
field : & ast:: FieldDef ,
1839
- ) -> Option < String > {
1864
+ ) -> Option < Cow < ' static , str > > {
1840
1865
let vis = format_visibility ( context, & field. vis ) ;
1841
- let type_annotation_spacing = type_annotation_spacing ( context. config ) ;
1842
- Some ( match field. ident {
1843
- Some ( name) => format ! (
1844
- "{}{}{}:" ,
1845
- vis,
1846
- rewrite_ident( context, name) ,
1847
- type_annotation_spacing. 0
1848
- ) ,
1849
- None => vis. to_string ( ) ,
1850
- } )
1866
+
1867
+ let Some ( name) = field. ident else {
1868
+ return Some ( vis) ;
1869
+ } ;
1870
+
1871
+ let ( space_before_colon, _) = type_annotation_spacing ( context. config ) ;
1872
+ let ident = rewrite_ident ( context, name) ;
1873
+
1874
+ let prefix = if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
1875
+ format ! ( "{vis} {ident}{space_before_colon}:" )
1876
+ } else {
1877
+ format ! ( "{vis}{ident}{space_before_colon}:" )
1878
+ } ;
1879
+ Some ( Cow :: from ( prefix) )
1851
1880
}
1852
1881
1853
1882
impl Rewrite for ast:: FieldDef {
@@ -1867,7 +1896,7 @@ pub(crate) fn rewrite_struct_field(
1867
1896
}
1868
1897
1869
1898
let type_annotation_spacing = type_annotation_spacing ( context. config ) ;
1870
- let mut prefix = rewrite_struct_field_prefix ( context, field) ?;
1899
+ let prefix = rewrite_struct_field_prefix ( context, field) ?;
1871
1900
1872
1901
let attrs_str = field. attrs . rewrite ( context, shape) ?;
1873
1902
let attrs_extendable = field. ident . is_none ( ) && is_attributes_extendable ( & attrs_str) ;
@@ -1899,6 +1928,14 @@ pub(crate) fn rewrite_struct_field(
1899
1928
if prefix. is_empty ( ) && !attrs_str. is_empty ( ) && attrs_extendable && spacing. is_empty ( ) {
1900
1929
spacing. push ( ' ' ) ;
1901
1930
}
1931
+
1932
+ if !prefix. is_empty ( ) && field. ident . is_none ( ) && context. config . version ( ) == Version :: Two {
1933
+ // For tuple struct fields, which only have a visibility modifier a space is needed
1934
+ // when using Version::Two since rewrite_struct_field_prefix won't add a trailing space
1935
+ // after the visibilty modifier.
1936
+ spacing. push ( ' ' ) ;
1937
+ }
1938
+
1902
1939
let orig_ty = shape
1903
1940
. offset_left ( overhead + spacing. len ( ) )
1904
1941
. and_then ( |ty_shape| field. ty . rewrite ( context, ty_shape) ) ;
@@ -1910,11 +1947,6 @@ pub(crate) fn rewrite_struct_field(
1910
1947
1911
1948
let is_prefix_empty = prefix. is_empty ( ) ;
1912
1949
// We must use multiline. We are going to put attributes and a field on different lines.
1913
- if context. config . version ( ) == Version :: Two {
1914
- // Remove any additional whitespace at the end of the prefix.
1915
- // For example if there is a space after a visibility modifier.
1916
- prefix. truncate ( prefix. trim_end ( ) . len ( ) ) ;
1917
- }
1918
1950
let field_str = rewrite_assign_rhs ( context, prefix, & * field. ty , & RhsAssignKind :: Ty , shape) ?;
1919
1951
// Remove a leading white-space from `rewrite_assign_rhs()` when rewriting a tuple struct.
1920
1952
let field_str = if is_prefix_empty {
@@ -2002,15 +2034,18 @@ fn rewrite_static(
2002
2034
offset : Indent ,
2003
2035
) -> Option < String > {
2004
2036
let colon = colon_spaces ( context. config ) ;
2005
- let mut prefix = format ! (
2006
- "{}{}{} {}{}{}" ,
2007
- format_visibility( context, static_parts. vis) ,
2008
- static_parts. defaultness. map_or( "" , format_defaultness) ,
2009
- static_parts. prefix,
2010
- format_mutability( static_parts. mutability) ,
2011
- rewrite_ident( context, static_parts. ident) ,
2012
- colon,
2013
- ) ;
2037
+
2038
+ let vis = format_visibility ( context, static_parts. vis ) ;
2039
+ let defaultness = static_parts. defaultness . map_or ( "" , format_defaultness) ;
2040
+ let static_prefix = static_parts. prefix ;
2041
+ let mutability = format_mutability ( static_parts. mutability ) ;
2042
+ let ident = rewrite_ident ( context, static_parts. ident ) ;
2043
+ let mut prefix = if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
2044
+ // format_visibility doesn't have a trailing space in Version::Two
2045
+ format ! ( "{vis} {defaultness}{static_prefix} {mutability}{ident}{colon}" )
2046
+ } else {
2047
+ format ! ( "{vis}{defaultness}{static_prefix} {mutability}{ident}{colon}" )
2048
+ } ;
2014
2049
// 2 = " =".len()
2015
2050
let ty_shape =
2016
2051
Shape :: indented ( offset. block_only ( ) , context. config ) . offset_left ( prefix. len ( ) + 2 ) ?;
@@ -3165,7 +3200,13 @@ fn format_header(
3165
3200
let mut result = String :: with_capacity ( 128 ) ;
3166
3201
let shape = Shape :: indented ( offset, context. config ) ;
3167
3202
3168
- result. push_str ( format_visibility ( context, vis) . trim ( ) ) ;
3203
+ let visibility = format_visibility ( context, vis) ;
3204
+ if context. config . version ( ) == Version :: Two {
3205
+ // format_visibility doesn't have a trailing space in Version::Two
3206
+ result. push_str ( & visibility) ;
3207
+ } else {
3208
+ result. push_str ( visibility. trim ( ) ) ;
3209
+ }
3169
3210
3170
3211
// Check for a missing comment between the visibility and the item name.
3171
3212
let after_vis = vis. span . hi ( ) ;
@@ -3351,12 +3392,13 @@ impl Rewrite for ast::ForeignItem {
3351
3392
// function kw here.
3352
3393
let vis = format_visibility ( context, & self . vis ) ;
3353
3394
let mut_str = format_mutability ( mutability) ;
3354
- let prefix = format ! (
3355
- "{}static {}{}:" ,
3356
- vis,
3357
- mut_str,
3358
- rewrite_ident( context, self . ident)
3359
- ) ;
3395
+ let ident = rewrite_ident ( context, self . ident ) ;
3396
+ let prefix = if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
3397
+ // format_visibility doesn't have a trailing space in Version::Two
3398
+ format ! ( "{vis} static {mut_str}{ident}:" )
3399
+ } else {
3400
+ format ! ( "{vis}static {mut_str}{ident}:" )
3401
+ } ;
3360
3402
// 1 = ;
3361
3403
rewrite_assign_rhs (
3362
3404
context,
@@ -3434,7 +3476,12 @@ pub(crate) fn rewrite_mod(
3434
3476
attrs_shape : Shape ,
3435
3477
) -> Option < String > {
3436
3478
let mut result = String :: with_capacity ( 32 ) ;
3437
- result. push_str ( & * format_visibility ( context, & item. vis ) ) ;
3479
+ let vis = format_visibility ( context, & item. vis ) ;
3480
+ result. push_str ( & vis) ;
3481
+ if !vis. is_empty ( ) && context. config . version ( ) == Version :: Two {
3482
+ // format_visibility doesn't have a trailing space in Version::Two
3483
+ result. push ( ' ' ) ;
3484
+ }
3438
3485
result. push_str ( "mod " ) ;
3439
3486
result. push_str ( rewrite_ident ( context, item. ident ) ) ;
3440
3487
result. push ( ';' ) ;
0 commit comments