From b0715044d93cda14f15cbec385e8728c12bc4c45 Mon Sep 17 00:00:00 2001 From: 123vivekr <123vivekr@gmail.com> Date: Sun, 13 Feb 2022 17:54:09 +0530 Subject: [PATCH] Add `short_item_threshold` config option Allow custom short item threshold values via config --- Configurations.md | 8 ++++++++ src/config/mod.rs | 18 ++++++++++++++++++ src/overflow.rs | 10 +++++----- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Configurations.md b/Configurations.md index 2e2b0f7cfbe..010a2362b32 100644 --- a/Configurations.md +++ b/Configurations.md @@ -2200,6 +2200,14 @@ specific version of rustfmt is used in your CI, use this option. - **Possible values**: any published version (e.g. `"0.3.8"`) - **Stable**: No (tracking issue: [#3386](https://github.com/rust-lang/rustfmt/issues/3386)) +## `short_item_threshold` + +Maximum width threshold for a short item. + +- **Default value**: `10` +- **Possible values**: any positive integer that is less than or equal to the value specified for [`max_width`](#max_width) +- **Stable**: Yes + ## `skip_children` Don't reformat out of line modules diff --git a/src/config/mod.rs b/src/config/mod.rs index cd90e0904b6..5ab45623218 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -106,6 +106,7 @@ create_config! { // Misc. remove_nested_parens: bool, true, true, "Remove nested parens"; combine_control_expr: bool, true, false, "Combine control expressions with function calls"; + short_item_threshold: usize, 10, true, "Maximum width threshold for a short item"; overflow_delimited_expr: bool, false, false, "Allow trailing bracket/brace delimited expressions to overflow"; struct_field_align_threshold: usize, 0, false, @@ -589,6 +590,7 @@ spaces_around_ranges = false binop_separator = "Front" remove_nested_parens = true combine_control_expr = true +short_item_threshold = 10 overflow_delimited_expr = false struct_field_align_threshold = 0 enum_discrim_align_threshold = 0 @@ -902,6 +904,15 @@ make_backup = false assert_eq!(config.single_line_if_else_max_width(), 70); } + #[test] + fn test_short_item_threshold_config_exceeds_max_width() { + let toml = r#" + short_item_threshold = 10 + "#; + let config = Config::from_toml(toml, Path::new("")).unwrap(); + assert_eq!(config.short_item_threshold(), 10); + } + #[test] fn test_override_fn_call_width_exceeds_max_width() { let mut config = Config::default(); @@ -950,5 +961,12 @@ make_backup = false config.override_value("single_line_if_else_max_width", "101"); assert_eq!(config.single_line_if_else_max_width(), 100); } + + #[test] + fn test_override_short_item_threshold_exceeds_max_width() { + let mut config = Config::default(); + config.override_value("short_item_threshold", "20"); + assert_eq!(config.short_item_threshold(), 20); + } } } diff --git a/src/overflow.rs b/src/overflow.rs index 3475f5c378c..e01c4caceb0 100644 --- a/src/overflow.rs +++ b/src/overflow.rs @@ -26,8 +26,6 @@ use crate::spanned::Spanned; use crate::types::{can_be_overflowed_type, SegmentParam}; use crate::utils::{count_newlines, extra_offset, first_line_width, last_line_width, mk_sp}; -const SHORT_ITEM_THRESHOLD: usize = 10; - /// A list of `format!`-like macros, that take a long format string and a list of arguments to /// format. /// @@ -572,7 +570,9 @@ impl<'a> Context<'a> { if one_line { tactic = DefinitiveListTactic::SpecialMacro(num_args_before); }; - } else if is_every_expr_simple(&self.items) && no_long_items(list_items) { + } else if is_every_expr_simple(&self.items) + && no_long_items(list_items, self.context.config.short_item_threshold()) + { tactic = DefinitiveListTactic::Mixed; } } @@ -755,9 +755,9 @@ fn shape_from_indent_style( } } -fn no_long_items(list: &[ListItem]) -> bool { +fn no_long_items(list: &[ListItem], short_item_threshold: usize) -> bool { list.iter() - .all(|item| item.inner_as_ref().len() <= SHORT_ITEM_THRESHOLD) + .all(|item| item.inner_as_ref().len() <= short_item_threshold) } /// In case special-case style is required, returns an offset from which we start horizontal layout.