Skip to content

Commit e040d96

Browse files
committed
Prevent format_visibility from adding trailing space with Version::Two
1 parent c591e66 commit e040d96

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
@@ -327,7 +327,12 @@ impl<'a> FnSig<'a> {
327327
fn to_str(&self, context: &RewriteContext<'_>) -> String {
328328
let mut result = String::with_capacity(128);
329329
// Vis defaultness constness unsafety abi.
330-
result.push_str(&*format_visibility(context, self.visibility));
330+
let vis = format_visibility(context, self.visibility);
331+
result.push_str(&vis);
332+
if !vis.is_empty() && context.config.version() == Version::Two {
333+
// format_visibility doesn't have a trailing space in Version::Two
334+
result.push(' ');
335+
}
331336
result.push_str(format_defaultness(self.defaultness));
332337
result.push_str(format_constness(self.constness));
333338
result.push_str(format_async(&self.is_async));
@@ -917,7 +922,12 @@ fn format_impl_ref_and_type(
917922
} = *iimpl;
918923
let mut result = String::with_capacity(128);
919924

920-
result.push_str(&format_visibility(context, &item.vis));
925+
let vis = format_visibility(context, &item.vis);
926+
result.push_str(&vis);
927+
if !vis.is_empty() && context.config.version() == Version::Two {
928+
// format_visibility doesn't have a trailing space in Version::Two
929+
result.push(' ');
930+
}
921931
result.push_str(format_defaultness(defaultness));
922932
result.push_str(format_unsafety(unsafety));
923933

@@ -1126,12 +1136,16 @@ pub(crate) fn format_trait(
11261136
} = **trait_kind;
11271137

11281138
let mut result = String::with_capacity(128);
1129-
let header = format!(
1130-
"{}{}{}trait ",
1131-
format_visibility(context, &item.vis),
1132-
format_unsafety(unsafety),
1133-
format_auto(is_auto),
1134-
);
1139+
1140+
let mut vis = format_visibility(context, &item.vis);
1141+
if !vis.is_empty() && context.config.version() == Version::Two {
1142+
// format_visibility doesn't have a trailing space in Version::Two
1143+
vis += " ";
1144+
}
1145+
let unsafety = format_unsafety(unsafety);
1146+
let auto = format_auto(is_auto);
1147+
1148+
let header = format!("{vis}{unsafety}{auto}trait ");
11351149
result.push_str(&header);
11361150

11371151
let body_lo = context.snippet_provider.span_after(item.span, "{");
@@ -1334,8 +1348,13 @@ pub(crate) fn format_trait_alias(
13341348
// 6 = "trait ", 2 = " ="
13351349
let g_shape = shape.offset_left(6)?.sub_width(2)?;
13361350
let generics_str = rewrite_generics(context, alias, generics, g_shape)?;
1337-
let vis_str = format_visibility(context, vis);
1338-
let lhs = format!("{vis_str}trait {generics_str} =");
1351+
let vis = format_visibility(context, vis);
1352+
let lhs = if !vis.is_empty() && context.config.version() == Version::Two {
1353+
// format_visibility doesn't have a trailing space in Version::Two
1354+
format!("{vis} trait {generics_str} =")
1355+
} else {
1356+
format!("{vis}trait {generics_str} =")
1357+
};
13391358
// 1 = ";"
13401359
let trait_alias_bounds = TraitAliasBounds {
13411360
generic_bounds,
@@ -1722,7 +1741,13 @@ fn rewrite_ty<R: Rewrite>(
17221741
if !after_where_predicates.is_empty() {
17231742
return None;
17241743
}
1725-
result.push_str(&format!("{}type ", format_visibility(context, vis)));
1744+
let vis = format_visibility(context, vis);
1745+
result.push_str(&vis);
1746+
if !vis.is_empty() && context.config.version() == Version::Two {
1747+
// format_visibility doesn't have a trailing space in Version::Two
1748+
result.push(' ');
1749+
}
1750+
result.push_str("type ");
17261751
let ident_str = rewrite_ident(context, ident);
17271752

17281753
if generics.params.is_empty() {
@@ -1820,18 +1845,22 @@ fn type_annotation_spacing(config: &Config) -> (&str, &str) {
18201845
pub(crate) fn rewrite_struct_field_prefix(
18211846
context: &RewriteContext<'_>,
18221847
field: &ast::FieldDef,
1823-
) -> Option<String> {
1848+
) -> Option<Cow<'static, str>> {
18241849
let vis = format_visibility(context, &field.vis);
1825-
let type_annotation_spacing = type_annotation_spacing(context.config);
1826-
Some(match field.ident {
1827-
Some(name) => format!(
1828-
"{}{}{}:",
1829-
vis,
1830-
rewrite_ident(context, name),
1831-
type_annotation_spacing.0
1832-
),
1833-
None => vis.to_string(),
1834-
})
1850+
1851+
let Some(name) = field.ident else {
1852+
return Some(vis);
1853+
};
1854+
1855+
let (space_before_colon, _) = type_annotation_spacing(context.config);
1856+
let ident = rewrite_ident(context, name);
1857+
1858+
let prefix = if !vis.is_empty() && context.config.version() == Version::Two {
1859+
format!("{vis} {ident}{space_before_colon}:")
1860+
} else {
1861+
format!("{vis}{ident}{space_before_colon}:")
1862+
};
1863+
Some(Cow::from(prefix))
18351864
}
18361865

18371866
impl Rewrite for ast::FieldDef {
@@ -1851,7 +1880,7 @@ pub(crate) fn rewrite_struct_field(
18511880
}
18521881

18531882
let type_annotation_spacing = type_annotation_spacing(context.config);
1854-
let mut prefix = rewrite_struct_field_prefix(context, field)?;
1883+
let prefix = rewrite_struct_field_prefix(context, field)?;
18551884

18561885
let attrs_str = field.attrs.rewrite(context, shape)?;
18571886
let attrs_extendable = field.ident.is_none() && is_attributes_extendable(&attrs_str);
@@ -1883,6 +1912,14 @@ pub(crate) fn rewrite_struct_field(
18831912
if prefix.is_empty() && !attrs_str.is_empty() && attrs_extendable && spacing.is_empty() {
18841913
spacing.push(' ');
18851914
}
1915+
1916+
if !prefix.is_empty() && field.ident.is_none() && context.config.version() == Version::Two {
1917+
// For tuple struct fields, which only have a visibility modifier a space is needed
1918+
// when using Version::Two since rewrite_struct_field_prefix won't add a trailing space
1919+
// after the visibilty modifier.
1920+
spacing.push(' ');
1921+
}
1922+
18861923
let orig_ty = shape
18871924
.offset_left(overhead + spacing.len())
18881925
.and_then(|ty_shape| field.ty.rewrite(context, ty_shape));
@@ -1894,11 +1931,6 @@ pub(crate) fn rewrite_struct_field(
18941931

18951932
let is_prefix_empty = prefix.is_empty();
18961933
// We must use multiline. We are going to put attributes and a field on different lines.
1897-
if context.config.version() == Version::Two {
1898-
// Remove any additional whitespace at the end of the prefix.
1899-
// For example if there is a space after a visibility modifier.
1900-
prefix.truncate(prefix.trim_end().len());
1901-
}
19021934
let field_str = rewrite_assign_rhs(context, prefix, &*field.ty, &RhsAssignKind::Ty, shape)?;
19031935
// Remove a leading white-space from `rewrite_assign_rhs()` when rewriting a tuple struct.
19041936
let field_str = if is_prefix_empty {
@@ -1986,15 +2018,18 @@ fn rewrite_static(
19862018
offset: Indent,
19872019
) -> Option<String> {
19882020
let colon = colon_spaces(context.config);
1989-
let mut prefix = format!(
1990-
"{}{}{} {}{}{}",
1991-
format_visibility(context, static_parts.vis),
1992-
static_parts.defaultness.map_or("", format_defaultness),
1993-
static_parts.prefix,
1994-
format_mutability(static_parts.mutability),
1995-
rewrite_ident(context, static_parts.ident),
1996-
colon,
1997-
);
2021+
2022+
let vis = format_visibility(context, static_parts.vis);
2023+
let defaultness = static_parts.defaultness.map_or("", format_defaultness);
2024+
let static_prefix = static_parts.prefix;
2025+
let mutability = format_mutability(static_parts.mutability);
2026+
let ident = rewrite_ident(context, static_parts.ident);
2027+
let mut prefix = if !vis.is_empty() && context.config.version() == Version::Two {
2028+
// format_visibility doesn't have a trailing space in Version::Two
2029+
format!("{vis} {defaultness}{static_prefix} {mutability}{ident}{colon}")
2030+
} else {
2031+
format!("{vis}{defaultness}{static_prefix} {mutability}{ident}{colon}")
2032+
};
19982033
// 2 = " =".len()
19992034
let ty_shape =
20002035
Shape::indented(offset.block_only(), context.config).offset_left(prefix.len() + 2)?;
@@ -3148,7 +3183,13 @@ fn format_header(
31483183
let mut result = String::with_capacity(128);
31493184
let shape = Shape::indented(offset, context.config);
31503185

3151-
result.push_str(format_visibility(context, vis).trim());
3186+
let visibility = format_visibility(context, vis);
3187+
if context.config.version() == Version::Two {
3188+
// format_visibility doesn't have a trailing space in Version::Two
3189+
result.push_str(&visibility);
3190+
} else {
3191+
result.push_str(visibility.trim());
3192+
}
31523193

31533194
// Check for a missing comment between the visibility and the item name.
31543195
let after_vis = vis.span.hi();
@@ -3334,12 +3375,13 @@ impl Rewrite for ast::ForeignItem {
33343375
// function kw here.
33353376
let vis = format_visibility(context, &self.vis);
33363377
let mut_str = format_mutability(mutability);
3337-
let prefix = format!(
3338-
"{}static {}{}:",
3339-
vis,
3340-
mut_str,
3341-
rewrite_ident(context, self.ident)
3342-
);
3378+
let ident = rewrite_ident(context, self.ident);
3379+
let prefix = if !vis.is_empty() && context.config.version() == Version::Two {
3380+
// format_visibility doesn't have a trailing space in Version::Two
3381+
format!("{vis} static {mut_str}{ident}:")
3382+
} else {
3383+
format!("{vis}static {mut_str}{ident}:")
3384+
};
33433385
// 1 = ;
33443386
rewrite_assign_rhs(
33453387
context,
@@ -3417,7 +3459,12 @@ pub(crate) fn rewrite_mod(
34173459
attrs_shape: Shape,
34183460
) -> Option<String> {
34193461
let mut result = String::with_capacity(32);
3420-
result.push_str(&*format_visibility(context, &item.vis));
3462+
let vis = format_visibility(context, &item.vis);
3463+
result.push_str(&vis);
3464+
if !vis.is_empty() && context.config.version() == Version::Two {
3465+
// format_visibility doesn't have a trailing space in Version::Two
3466+
result.push(' ');
3467+
}
34213468
result.push_str("mod ");
34223469
result.push_str(rewrite_ident(context, item.ident));
34233470
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)