Skip to content

Commit 09dbeda

Browse files
committed
Prevent format_visibility from adding trailing space with Version::Two
1 parent 97c9aef commit 09dbeda

File tree

5 files changed

+117
-48
lines changed

5 files changed

+117
-48
lines changed

src/imports.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,9 +332,14 @@ impl UseTree {
332332
context: &RewriteContext<'_>,
333333
shape: Shape,
334334
) -> Option<String> {
335-
let vis = self.visibility.as_ref().map_or(Cow::from(""), |vis| {
335+
let mut vis = self.visibility.as_ref().map_or(Cow::from(""), |vis| {
336336
crate::utils::format_visibility(context, vis)
337337
});
338+
339+
if !vis.is_empty() && context.config.version() == Version::Two {
340+
vis += " ";
341+
}
342+
338343
let use_str = self
339344
.rewrite(context, shape.offset_left(vis.len())?)
340345
.map(|s| {

src/items.rs

Lines changed: 92 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,12 @@ impl<'a> FnSig<'a> {
340340
fn to_str(&self, context: &RewriteContext<'_>) -> String {
341341
let mut result = String::with_capacity(128);
342342
// 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+
}
344349
result.push_str(format_defaultness(self.defaultness));
345350
result.push_str(format_constness(self.constness));
346351
self.coroutine_kind
@@ -933,7 +938,12 @@ fn format_impl_ref_and_type(
933938
} = *iimpl;
934939
let mut result = String::with_capacity(128);
935940

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+
}
937947
result.push_str(format_defaultness(defaultness));
938948
result.push_str(format_unsafety(unsafety));
939949

@@ -1142,12 +1152,16 @@ pub(crate) fn format_trait(
11421152
} = **trait_kind;
11431153

11441154
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 ");
11511165
result.push_str(&header);
11521166

11531167
let body_lo = context.snippet_provider.span_after(item.span, "{");
@@ -1350,8 +1364,13 @@ pub(crate) fn format_trait_alias(
13501364
// 6 = "trait ", 2 = " ="
13511365
let g_shape = shape.offset_left(6)?.sub_width(2)?;
13521366
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+
};
13551374
// 1 = ";"
13561375
let trait_alias_bounds = TraitAliasBounds {
13571376
generic_bounds,
@@ -1738,7 +1757,13 @@ fn rewrite_ty<R: Rewrite>(
17381757
if !after_where_predicates.is_empty() {
17391758
return None;
17401759
}
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 ");
17421767
let ident_str = rewrite_ident(context, ident);
17431768

17441769
if generics.params.is_empty() {
@@ -1836,18 +1861,22 @@ fn type_annotation_spacing(config: &Config) -> (&str, &str) {
18361861
pub(crate) fn rewrite_struct_field_prefix(
18371862
context: &RewriteContext<'_>,
18381863
field: &ast::FieldDef,
1839-
) -> Option<String> {
1864+
) -> Option<Cow<'static, str>> {
18401865
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))
18511880
}
18521881

18531882
impl Rewrite for ast::FieldDef {
@@ -1867,7 +1896,7 @@ pub(crate) fn rewrite_struct_field(
18671896
}
18681897

18691898
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)?;
18711900

18721901
let attrs_str = field.attrs.rewrite(context, shape)?;
18731902
let attrs_extendable = field.ident.is_none() && is_attributes_extendable(&attrs_str);
@@ -1899,6 +1928,14 @@ pub(crate) fn rewrite_struct_field(
18991928
if prefix.is_empty() && !attrs_str.is_empty() && attrs_extendable && spacing.is_empty() {
19001929
spacing.push(' ');
19011930
}
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+
19021939
let orig_ty = shape
19031940
.offset_left(overhead + spacing.len())
19041941
.and_then(|ty_shape| field.ty.rewrite(context, ty_shape));
@@ -1910,11 +1947,6 @@ pub(crate) fn rewrite_struct_field(
19101947

19111948
let is_prefix_empty = prefix.is_empty();
19121949
// 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-
}
19181950
let field_str = rewrite_assign_rhs(context, prefix, &*field.ty, &RhsAssignKind::Ty, shape)?;
19191951
// Remove a leading white-space from `rewrite_assign_rhs()` when rewriting a tuple struct.
19201952
let field_str = if is_prefix_empty {
@@ -2002,15 +2034,18 @@ fn rewrite_static(
20022034
offset: Indent,
20032035
) -> Option<String> {
20042036
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+
};
20142049
// 2 = " =".len()
20152050
let ty_shape =
20162051
Shape::indented(offset.block_only(), context.config).offset_left(prefix.len() + 2)?;
@@ -3165,7 +3200,13 @@ fn format_header(
31653200
let mut result = String::with_capacity(128);
31663201
let shape = Shape::indented(offset, context.config);
31673202

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+
}
31693210

31703211
// Check for a missing comment between the visibility and the item name.
31713212
let after_vis = vis.span.hi();
@@ -3351,12 +3392,13 @@ impl Rewrite for ast::ForeignItem {
33513392
// function kw here.
33523393
let vis = format_visibility(context, &self.vis);
33533394
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+
};
33603402
// 1 = ;
33613403
rewrite_assign_rhs(
33623404
context,
@@ -3434,7 +3476,12 @@ pub(crate) fn rewrite_mod(
34343476
attrs_shape: Shape,
34353477
) -> Option<String> {
34363478
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+
}
34383485
result.push_str("mod ");
34393486
result.push_str(rewrite_ident(context, item.ident));
34403487
result.push(';');

src/macros.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ use crate::comment::{
2525
contains_comment, CharClasses, FindUncommented, FullCodeCharKind, LineClasses,
2626
};
2727
use crate::config::lists::*;
28+
use crate::config::Version;
2829
use crate::expr::{rewrite_array, rewrite_assign_rhs, RhsAssignKind};
2930
use crate::lists::{itemize_list, write_list, ListFormatting};
3031
use crate::overflow;
@@ -419,6 +420,9 @@ pub(crate) fn rewrite_macro_def(
419420

420421
let mut result = if def.macro_rules {
421422
String::from("macro_rules!")
423+
} else if context.config.version() == Version::Two {
424+
// format_visibility doesn't have a trailing space in Version::Two
425+
format!("{} macro", format_visibility(context, vis))
422426
} else {
423427
format!("{}macro", format_visibility(context, vis))
424428
};
@@ -1369,7 +1373,11 @@ fn format_lazy_static(
13691373
let last = parsed_elems.len() - 1;
13701374
for (i, (vis, id, ty, expr)) in parsed_elems.iter().enumerate() {
13711375
// Rewrite as a static item.
1372-
let vis = crate::utils::format_visibility(context, vis);
1376+
let mut vis = crate::utils::format_visibility(context, vis);
1377+
if !vis.is_empty() && context.config.version() == Version::Two {
1378+
// format_visibility doesn't have a trailing space in Version::Two
1379+
vis += " ";
1380+
};
13731381
let mut stmt = String::with_capacity(128);
13741382
stmt.push_str(&format!(
13751383
"{}static ref {}: {} =",

src/utils.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ pub(crate) fn format_visibility(
5555
vis: &Visibility,
5656
) -> Cow<'static, str> {
5757
match vis.kind {
58+
VisibilityKind::Public if context.config.version() == Version::Two => Cow::from("pub"),
5859
VisibilityKind::Public => Cow::from("pub "),
5960
VisibilityKind::Inherited => Cow::from(""),
6061
VisibilityKind::Restricted { ref path, .. } => {
@@ -69,7 +70,11 @@ pub(crate) fn format_visibility(
6970
let path = segments_iter.collect::<Vec<_>>().join("::");
7071
let in_str = if is_keyword(&path) { "" } else { "in " };
7172

72-
Cow::from(format!("pub({in_str}{path}) "))
73+
if context.config.version() == Version::Two {
74+
Cow::from(format!("pub({in_str}{path})"))
75+
} else {
76+
Cow::from(format!("pub({in_str}{path}) "))
77+
}
7378
}
7479
}
7580
}

src/visitor.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,10 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
922922
) {
923923
let vis_str = utils::format_visibility(&self.get_context(), vis);
924924
self.push_str(&*vis_str);
925+
if !vis_str.is_empty() && self.config.version() == Version::Two {
926+
// format_visibility doesn't have a trailing space in Version::Two
927+
self.push_str(" ");
928+
}
925929
self.push_str(format_unsafety(unsafety));
926930
self.push_str("mod ");
927931
// Calling `to_owned()` to work around borrow checker.

0 commit comments

Comments
 (0)