Skip to content

Commit 0ff3f6c

Browse files
committed
Include trailing comma in single param vertical fn
When formatting a function with a single parameter with `fn_params_layout` set to `Vertical`, the previous tactic would remove any trailing commas before spilling to multiple lines for other reasons, such as long function names or return types. Instead, use the same tactic as `Tall` does, so that the trailing comma is kept if the end result spans multiple lines. `fn_params_layout = "Vertical"` is stable, so this is a breaking change. Guard on the style edition so that it only takes effect starting in the next edition. Issue #6889 `fn_params_layout = "Vertical"` removes single argument's trailing comma
1 parent d5f07e1 commit 0ff3f6c

6 files changed

Lines changed: 172 additions & 3 deletions

File tree

src/config/options.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,16 @@ pub enum Heuristics {
9696
}
9797

9898
impl Density {
99-
pub fn to_list_tactic(self, len: usize) -> ListTactic {
99+
pub fn to_list_tactic(self, style_edition: StyleEdition, len: usize) -> ListTactic {
100100
match self {
101101
Density::Compressed => ListTactic::Mixed,
102102
Density::Tall => ListTactic::HorizontalVertical,
103-
Density::Vertical if len == 1 => ListTactic::Horizontal,
103+
Density::Vertical if style_edition < StyleEdition::Edition2027 && len == 1 => {
104+
ListTactic::Horizontal
105+
}
106+
Density::Vertical if style_edition >= StyleEdition::Edition2027 && len == 1 => {
107+
ListTactic::HorizontalVertical
108+
}
104109
Density::Vertical => ListTactic::Vertical,
105110
}
106111
}

src/items.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2877,7 +2877,7 @@ fn rewrite_params(
28772877
context
28782878
.config
28792879
.fn_params_layout()
2880-
.to_list_tactic(param_items.len()),
2880+
.to_list_tactic(context.config.style_edition(), param_items.len()),
28812881
Separator::Comma,
28822882
one_line_budget,
28832883
);

tests/source/configs/fn_params_layout/vertical.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
// Function arguments density
33

44
trait Lorem {
5+
fn lorem(ipsum: Ipsum);
6+
7+
fn lorem(ipsum: Ipsum) -> Dolor;
8+
59
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet);
610

711
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet) {
@@ -13,4 +17,22 @@ trait Lorem {
1317
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: onsectetur, adipiscing: Adipiscing, elit: Elit) {
1418
// body
1519
}
20+
21+
fn long_param_name(lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod: Tempor);
22+
23+
fn long_param_type(lorem: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore,
24+
);
25+
26+
fn long_return_type(lorem: Lorem)
27+
-> IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore;
28+
29+
fn lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod_tempor_incididunt
30+
(lorem: Lorem);
31+
32+
fn lorem<T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEt>(t: T);
33+
34+
fn lorem<T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEtDolore>
35+
(
36+
t: T,
37+
);
1638
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// rustfmt-style_edition: 2027
2+
// rustfmt-fn_params_layout: Vertical
3+
// Function arguments density
4+
5+
trait Lorem {
6+
fn lorem(ipsum: Ipsum);
7+
8+
fn lorem(ipsum: Ipsum) -> Dolor;
9+
10+
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet);
11+
12+
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet) {
13+
// body
14+
}
15+
16+
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: onsectetur, adipiscing: Adipiscing, elit: Elit);
17+
18+
fn lorem(ipsum: Ipsum, dolor: Dolor, sit: Sit, amet: Amet, consectetur: onsectetur, adipiscing: Adipiscing, elit: Elit) {
19+
// body
20+
}
21+
22+
fn long_param_name(lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod: Tempor);
23+
24+
fn long_param_type(lorem: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore,
25+
);
26+
27+
fn long_return_type(lorem: Lorem)
28+
-> IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore;
29+
30+
fn lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod_tempor_incididunt
31+
(lorem: Lorem);
32+
33+
fn lorem<T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEt>(t: T);
34+
35+
fn lorem<T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEtDolore>
36+
(
37+
t: T,
38+
);
39+
}

tests/target/configs/fn_params_layout/vertical.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
// Function arguments density
33

44
trait Lorem {
5+
fn lorem(ipsum: Ipsum);
6+
7+
fn lorem(ipsum: Ipsum) -> Dolor;
8+
59
fn lorem(
610
ipsum: Ipsum,
711
dolor: Dolor,
@@ -39,4 +43,30 @@ trait Lorem {
3943
) {
4044
// body
4145
}
46+
47+
fn long_param_name(
48+
lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod: Tempor
49+
);
50+
51+
fn long_param_type(
52+
lorem: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore
53+
);
54+
55+
fn long_return_type(
56+
lorem: Lorem
57+
) -> IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore;
58+
59+
fn lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod_tempor_incididunt(
60+
lorem: Lorem
61+
);
62+
63+
fn lorem<T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEt>(
64+
t: T
65+
);
66+
67+
fn lorem<
68+
T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEtDolore,
69+
>(
70+
t: T
71+
);
4272
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// rustfmt-style_edition: 2027
2+
// rustfmt-fn_params_layout: Vertical
3+
// Function arguments density
4+
5+
trait Lorem {
6+
fn lorem(ipsum: Ipsum);
7+
8+
fn lorem(ipsum: Ipsum) -> Dolor;
9+
10+
fn lorem(
11+
ipsum: Ipsum,
12+
dolor: Dolor,
13+
sit: Sit,
14+
amet: Amet,
15+
);
16+
17+
fn lorem(
18+
ipsum: Ipsum,
19+
dolor: Dolor,
20+
sit: Sit,
21+
amet: Amet,
22+
) {
23+
// body
24+
}
25+
26+
fn lorem(
27+
ipsum: Ipsum,
28+
dolor: Dolor,
29+
sit: Sit,
30+
amet: Amet,
31+
consectetur: onsectetur,
32+
adipiscing: Adipiscing,
33+
elit: Elit,
34+
);
35+
36+
fn lorem(
37+
ipsum: Ipsum,
38+
dolor: Dolor,
39+
sit: Sit,
40+
amet: Amet,
41+
consectetur: onsectetur,
42+
adipiscing: Adipiscing,
43+
elit: Elit,
44+
) {
45+
// body
46+
}
47+
48+
fn long_param_name(
49+
lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod: Tempor,
50+
);
51+
52+
fn long_param_type(
53+
lorem: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore,
54+
);
55+
56+
fn long_return_type(
57+
lorem: Lorem,
58+
) -> IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLabore;
59+
60+
fn lorem_ipsum_dolor_sit_amet_consectetur_adipiscing_elit_sed_do_eiusmod_tempor_incididunt(
61+
lorem: Lorem,
62+
);
63+
64+
fn lorem<T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEt>(
65+
t: T,
66+
);
67+
68+
fn lorem<
69+
T: IpsumDolorSitAmetConsecteturAdipiscingElitSedDoEiusmodTemporIncididuntUtLaboreEtDolore,
70+
>(
71+
t: T,
72+
);
73+
}

0 commit comments

Comments
 (0)