Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fn_width config option #6046

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Configurations.md
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,29 @@ By default this option is set as a percentage of [`max_width`](#max_width) provi

See also [`max_width`](#max_width) and [`use_small_heuristics`](#use_small_heuristics)


## `enable_fn_param_limit`

Switch to enable the unstable feature `fn_param_limit`.

- **Default value**: `false`
- **Possible values**: `true`, `false`
- **Stable**: No

See also [`fn_param_limit`](#fn_param_limit)


## `fn_param_limit`

Maximum parameters in the declaration of a function signature before falling back to formatting chosen with `fn_param_layout`.

- **Default value**: `4`
- **Possible values**: any non-negative integer
- **Stable**: No

See also [`enable_fn_param_limit`](#enable_fn_param_limit) and [`fn_params_layout`](#fn_params_layout)


## `fn_params_layout`

Control the layout of parameters in function signatures.
Expand Down
5 changes: 5 additions & 0 deletions src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,9 @@ create_config! {
"Put small struct literals on a single line";
fn_single_line: bool, false, false, "Put single-expression functions on a single line";
where_single_line: bool, false, false, "Force where-clauses to be on a single line";
enable_fn_param_limit: bool, false, false, "Switch to enable `fn_param_limit`";
fn_param_limit: usize, 4, false, "How many parameters in a function declaration before \
falling back to formatting chosen with `fn_param_layout`";

// Imports
imports_indent: IndentStyle, IndentStyle::Block, false, "Indent of imports";
Expand Down Expand Up @@ -649,6 +652,8 @@ empty_item_single_line = true
struct_lit_single_line = true
fn_single_line = false
where_single_line = false
enable_fn_param_limit = false
fn_param_limit = 4
imports_indent = "Block"
imports_layout = "Mixed"
imports_granularity = "Preserve"
Expand Down
6 changes: 5 additions & 1 deletion src/items.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2390,6 +2390,7 @@ fn rewrite_fn_base(
ret_str_len,
fn_brace_style,
multi_line_ret_str,
fd.inputs.len(),
)?;

debug!(
Expand Down Expand Up @@ -2779,6 +2780,7 @@ fn compute_budgets_for_params(
ret_str_len: usize,
fn_brace_style: FnBraceStyle,
force_vertical_layout: bool,
param_count: usize,
) -> Option<(usize, usize, Indent)> {
debug!(
"compute_budgets_for_params {} {:?}, {}, {:?}",
Expand All @@ -2787,8 +2789,10 @@ fn compute_budgets_for_params(
ret_str_len,
fn_brace_style,
);
let over_param_limit =
context.config.enable_fn_param_limit() && param_count > context.config.fn_param_limit();
// Try keeping everything on the same line.
if !result.contains('\n') && !force_vertical_layout {
if !result.contains('\n') && !force_vertical_layout && !over_param_limit {
// 2 = `()`, 3 = `() `, space is before ret_string.
let overhead = if ret_str_len == 0 { 2 } else { 3 };
let mut used_space = indent.width() + result.len() + ret_str_len + overhead;
Expand Down
95 changes: 95 additions & 0 deletions tests/source/fn_param_limit/0.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// rustfmt-enable_fn_param_limit: true
// rustfmt-fn_param_limit: 0
// rustfmt-edition: 2018

fn lorem(mut commands: Commands) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>, mut materials: ResMut<Assets<StandardMaterial>>) {
// block
}

fn comments(mut commands: Commands, /**/ icons: Res<Icons>) {
// block
}

fn comments(mut commands: Commands, /* really loooooong intermission */ icons: Res<Icons>) {
// block
}

fn generic<C>(query: Query<C>, query2: Query<C>) {
// block
}

fn lorem<C>(query: Query<C>) where C: Add + Sub + Mul + Div {
// body
}

fn lorem<C>(query: Query<C>, mut commands: Commands, icons: Res<Icons>) where C: Add + Sub + Mul + Div {
// body
}

fn lorem(mut commands: Commands, icons: Res<Icons>) -> bool {
// block
}

pub fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

pub(crate) fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

pub(super) fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

async fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

unsafe fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

extern "C" {
fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}
}

impl Trait {
fn lorem(mut commands: Commands);
fn lorem(mut commands: Commands, icons: Res<Icons>);
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>);
fn lorem(
mut commands: Commands,
icons: Res<Icons>,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
);
}

fn outer(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block

fn inner(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
}

mod example {
fn mod_func(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
fn nested(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
}
}
95 changes: 95 additions & 0 deletions tests/source/fn_param_limit/1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// rustfmt-enable_fn_param_limit: true
// rustfmt-fn_param_limit: 1
// rustfmt-edition: 2018

fn lorem(mut commands: Commands) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>, mut materials: ResMut<Assets<StandardMaterial>>) {
// block
}

fn comments(mut commands: Commands, /**/ icons: Res<Icons>) {
// block
}

fn comments(mut commands: Commands, /* really loooooong intermission */ icons: Res<Icons>) {
// block
}

fn generic<C>(query: Query<C>, query2: Query<C>) {
// block
}

fn lorem<C>(query: Query<C>) where C: Add + Sub + Mul + Div {
// body
}

fn lorem<C>(query: Query<C>, mut commands: Commands, icons: Res<Icons>) where C: Add + Sub + Mul + Div {
// body
}

fn lorem(mut commands: Commands, icons: Res<Icons>) -> bool {
// block
}

pub fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

pub(crate) fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

pub(super) fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

async fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

unsafe fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

extern "C" {
fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}
}

impl Trait {
fn lorem(mut commands: Commands);
fn lorem(mut commands: Commands, icons: Res<Icons>);
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>);
fn lorem(
mut commands: Commands,
icons: Res<Icons>,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
);
}

fn outer(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block

fn inner(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
}

mod example {
fn mod_func(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
fn nested(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
}
}
95 changes: 95 additions & 0 deletions tests/source/fn_param_limit/2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// rustfmt-enable_fn_param_limit: true
// rustfmt-fn_param_limit: 2
// rustfmt-edition: 2018

fn lorem(mut commands: Commands) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>, mut materials: ResMut<Assets<StandardMaterial>>) {
// block
}

fn comments(mut commands: Commands, /**/ icons: Res<Icons>) {
// block
}

fn comments(mut commands: Commands, /* really really loooooooong intermission */ icons: Res<Icons>) {
// block
}

fn generic<C>(query: Query<C>, query2: Query<C>) {
// block
}

fn lorem<C>(query: Query<C>) where C: Add + Sub + Mul + Div {
// body
}

fn lorem<C>(query: Query<C>, mut commands: Commands, icons: Res<Icons>) where C: Add + Sub + Mul + Div {
// body
}

fn lorem(mut commands: Commands, icons: Res<Icons>) -> bool {
// block
}

pub fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

pub(crate) fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

pub(super) fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

async fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

unsafe fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}

extern "C" {
fn lorem(mut commands: Commands, icons: Res<Icons>) {
// block
}
}

impl Trait {
fn lorem(mut commands: Commands);
fn lorem(mut commands: Commands, icons: Res<Icons>);
fn lorem(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>);
fn lorem(
mut commands: Commands,
icons: Res<Icons>,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
);
}

fn outer(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block

fn inner(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
}

mod example {
fn mod_func(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
fn nested(mut commands: Commands, icons: Res<Icons>, mut meshes: ResMut<Assets<Mesh>>) {
// block
}
}
}
Loading
Loading