diff --git a/Configurations.md b/Configurations.md index 58740d0fb90..2a9df314417 100644 --- a/Configurations.md +++ b/Configurations.md @@ -276,7 +276,7 @@ fn lorem() -> T Whether to use different formatting for items and expressions if they satisfy a heuristic notion of 'small'. - **Default value**: `Default` -- **Possible values**: `Default`, `Off` +- **Possible values**: `Default`, `Off`, `Max` - **Stable**: Yes #### `Default` (default): @@ -337,6 +337,24 @@ fn main() { } ``` +#### `Max`: + +```rust +enum Lorem { + Ipsum, + Dolor(bool), + Sit { amet: Consectetur, adipiscing: Elit }, +} + +fn main() { + lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing"); + + let lorem = Lorem { ipsum: dolor, sit: amet }; + + let lorem = if ipsum { dolor } else { sit }; +} +``` + ## `binop_separator` Where to put a binary operator when a binary expression goes multiline. diff --git a/src/config/config_type.rs b/src/config/config_type.rs index ddb063feeab..82cf0e19a8f 100644 --- a/src/config/config_type.rs +++ b/src/config/config_type.rs @@ -403,6 +403,9 @@ macro_rules! create_config { if self.use_small_heuristics.2 == Heuristics::Default { let max_width = self.max_width.2; self.set().width_heuristics(WidthHeuristics::scaled(max_width)); + } else if self.use_small_heuristics.2 == Heuristics::Max { + let max_width = self.max_width.2; + self.set().width_heuristics(WidthHeuristics::set(max_width)); } else { self.set().width_heuristics(WidthHeuristics::null()); } diff --git a/src/config/options.rs b/src/config/options.rs index 5fa0a048313..a581cdef43d 100644 --- a/src/config/options.rs +++ b/src/config/options.rs @@ -154,6 +154,8 @@ configuration_option_enum! { TypeDensity: configuration_option_enum! { Heuristics: // Turn off any heuristics Off, + // Turn on max heuristics + Max, // Use Rustfmt's defaults Default, } @@ -257,6 +259,17 @@ impl WidthHeuristics { } } + pub fn set(max_width: usize) -> WidthHeuristics { + WidthHeuristics { + fn_call_width: max_width, + struct_lit_width: max_width, + struct_variant_width: max_width, + array_width: max_width, + chain_width: max_width, + single_line_if_else_max_width: max_width, + } + } + // scale the default WidthHeuristics according to max_width pub fn scaled(max_width: usize) -> WidthHeuristics { const DEFAULT_MAX_WIDTH: usize = 100; diff --git a/tests/source/configs/use_small_heuristics/max.rs b/tests/source/configs/use_small_heuristics/max.rs new file mode 100644 index 00000000000..8d30932e2c2 --- /dev/null +++ b/tests/source/configs/use_small_heuristics/max.rs @@ -0,0 +1,25 @@ +// rustfmt-use_small_heuristics: Max + +enum Lorem { + Ipsum, + Dolor(bool), + Sit { + amet: Consectetur, + adipiscing: Elit, + }, +} + +fn main() { + lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing"); + + let lorem = Lorem { + ipsum: dolor, + sit: amet, + }; + + let lorem = if ipsum { + dolor + } else { + sit + }; +} diff --git a/tests/target/configs/use_small_heuristics/max.rs b/tests/target/configs/use_small_heuristics/max.rs new file mode 100644 index 00000000000..785dfbea014 --- /dev/null +++ b/tests/target/configs/use_small_heuristics/max.rs @@ -0,0 +1,15 @@ +// rustfmt-use_small_heuristics: Max + +enum Lorem { + Ipsum, + Dolor(bool), + Sit { amet: Consectetur, adipiscing: Elit }, +} + +fn main() { + lorem("lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing"); + + let lorem = Lorem { ipsum: dolor, sit: amet }; + + let lorem = if ipsum { dolor } else { sit }; +}