Skip to content

Commit 5864cec

Browse files
goffriedavidBar-On
authored andcommitted
Rename option to imports_merge_style, still parse the old option
1 parent e9dd4a0 commit 5864cec

18 files changed

+147
-88
lines changed

Configurations.md

+26-5
Original file line numberDiff line numberDiff line change
@@ -1705,17 +1705,17 @@ pub enum Foo {}
17051705
pub enum Foo {}
17061706
```
17071707

1708-
## `merge_imports`
1708+
## `imports_merge_style`
17091709

17101710
Merge together related imports based on their paths.
17111711

17121712
This option requires `reorder_imports`, which is enabled by default.
17131713

1714-
- **Default value**: `Never`
1715-
- **Possible values**: `Never`, `Crate`, `Module`
1714+
- **Default value**: `Preserve`
1715+
- **Possible values**: `Preserve`, `Crate`, `Module`
17161716
- **Stable**: No (tracking issue: [#3362](https://github.com/rust-lang/rustfmt/issues/3362))
17171717

1718-
#### `Never` (default):
1718+
#### `Preserve` (default):
17191719

17201720
```rust
17211721
use foo::b;
@@ -1745,6 +1745,27 @@ use foo::{a, b, c};
17451745
use qux::{h, i};
17461746
```
17471747

1748+
## `merge_imports`
1749+
1750+
This option is deprecated. Use `imports_merge_style = "Crate"` instead.
1751+
1752+
- **Default value**: `false`
1753+
- **Possible values**: `true`, `false`
1754+
1755+
#### `false` (default):
1756+
1757+
```rust
1758+
use foo::{a, c, d};
1759+
use foo::{b, g};
1760+
use foo::{e, f};
1761+
```
1762+
1763+
#### `true`:
1764+
1765+
```rust
1766+
use foo::{a, b, c, d, e, f, g};
1767+
```
1768+
17481769
## `newline_style`
17491770

17501771
Unix or Windows line endings
@@ -2577,7 +2598,7 @@ Enable unstable features on stable and beta channels (unstable features are avai
25772598

25782599
For example:
25792600
```bash
2580-
rustfmt src/lib.rs --config unstable_features=true merge_imports=Crate
2601+
rustfmt src/lib.rs --config unstable_features=true imports_merge_style=Crate
25812602
```
25822603

25832604
## `use_field_init_shorthand`

src/config.rs

+68-12
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ create_config! {
7777
// Imports
7878
imports_indent: IndentStyle, IndentStyle::Block, false, "Indent of imports";
7979
imports_layout: ListTactic, ListTactic::Mixed, false, "Item layout inside a import block";
80-
merge_imports: MergeImports, MergeImports::Never, false, "Merge imports";
80+
imports_merge_style: ImportMergeStyle, ImportMergeStyle::Preserve, false, "Merge imports";
8181
group_imports: GroupImportsTactic, GroupImportsTactic::Preserve, false,
8282
"Controls the strategy for how imports are grouped together";
83+
merge_imports: bool, false, false, "(deprecated: use imports_merge_style instead)";
8384

8485
// Ordering
8586
reorder_imports: bool, true, true, "Reorder import and extern crate statements alphabetically";
@@ -175,6 +176,7 @@ impl PartialConfig {
175176
// Non-user-facing options can't be specified in TOML
176177
let mut cloned = self.clone();
177178
cloned.file_lines = None;
179+
cloned.merge_imports = None;
178180

179181
::toml::to_string(&cloned).map_err(ToTomlError)
180182
}
@@ -444,6 +446,10 @@ mod test {
444446
chain_width: usize, 60, true, "Maximum length of a chain to fit on a single line.";
445447
single_line_if_else_max_width: usize, 50, true, "Maximum line length for single \
446448
line if-else expressions. A value of zero means always break if-else expressions.";
449+
// merge_imports deprecation
450+
imports_merge_style: ImportMergeStyle, ImportMergeStyle::Preserve, false,
451+
"Merge imports";
452+
merge_imports: bool, false, false, "(deprecated: use imports_merge_style instead)";
447453

448454
unstable_features: bool, false, true,
449455
"Enables unstable features on stable and beta channels \
@@ -595,7 +601,7 @@ fn_single_line = false
595601
where_single_line = false
596602
imports_indent = "Block"
597603
imports_layout = "Mixed"
598-
merge_imports = "Never"
604+
imports_merge_style = "Preserve"
599605
group_imports = "Preserve"
600606
reorder_imports = true
601607
reorder_modules = true
@@ -716,13 +722,13 @@ ignore = []
716722
}
717723
let toml = r#"
718724
unstable_features = true
719-
merge_imports = "Crate"
725+
imports_merge_style = "Crate"
720726
"#;
721727
let config = Config::from_toml(toml, Path::new("")).unwrap();
722728
assert_eq!(config.was_set().unstable_features(), true);
723-
assert_eq!(config.was_set().merge_imports(), true);
729+
assert_eq!(config.was_set().imports_merge_style(), true);
724730
assert_eq!(config.unstable_features(), true);
725-
assert_eq!(config.merge_imports(), MergeImports::Crate);
731+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Crate);
726732
}
727733

728734
#[test]
@@ -731,9 +737,10 @@ ignore = []
731737
// This test requires non-nightly
732738
return;
733739
}
734-
let config = Config::from_toml("merge_imports = Crate", Path::new("")).unwrap();
735-
assert_eq!(config.was_set().merge_imports(), false);
736-
assert_eq!(config.merge_imports(), MergeImports::Never);
740+
let config =
741+
Config::from_toml("imports_merge_style = \"Crate\"", Path::new("")).unwrap();
742+
assert_eq!(config.was_set().imports_merge_style(), false);
743+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Preserve);
737744
}
738745

739746
#[test]
@@ -778,12 +785,12 @@ ignore = []
778785
}
779786
let mut config = Config::default();
780787
assert_eq!(config.unstable_features(), false);
781-
config.override_value("merge_imports", "Crate");
782-
assert_eq!(config.merge_imports(), MergeImports::Crate);
788+
config.override_value("imports_merge_style", "Crate");
789+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Preserve);
783790
config.override_value("unstable_features", "true");
784791
assert_eq!(config.unstable_features(), true);
785-
config.override_value("merge_imports", "Crate");
786-
assert_eq!(config.merge_imports(), MergeImports::Crate);
792+
config.override_value("imports_merge_style", "Crate");
793+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Crate);
787794
}
788795

789796
#[test]
@@ -1036,4 +1043,53 @@ ignore = []
10361043
assert_eq!(config.single_line_if_else_max_width(), 100);
10371044
}
10381045
}
1046+
1047+
#[cfg(test)]
1048+
mod deprecated_option_merge_imports {
1049+
use super::*;
1050+
1051+
#[test]
1052+
fn test_old_option_set() {
1053+
let toml = r#"
1054+
unstable_features = true
1055+
merge_imports = true
1056+
"#;
1057+
let config = Config::from_toml(toml, Path::new("")).unwrap();
1058+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Crate);
1059+
}
1060+
1061+
#[test]
1062+
fn test_both_set() {
1063+
let toml = r#"
1064+
unstable_features = true
1065+
merge_imports = true
1066+
imports_merge_style = "Preserve"
1067+
"#;
1068+
let config = Config::from_toml(toml, Path::new("")).unwrap();
1069+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Preserve);
1070+
}
1071+
1072+
#[test]
1073+
fn test_new_overridden() {
1074+
let toml = r#"
1075+
unstable_features = true
1076+
merge_imports = true
1077+
"#;
1078+
let mut config = Config::from_toml(toml, Path::new("")).unwrap();
1079+
config.override_value("imports_merge_style", "Preserve");
1080+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Preserve);
1081+
}
1082+
1083+
#[test]
1084+
fn test_old_overridden() {
1085+
let toml = r#"
1086+
unstable_features = true
1087+
imports_merge_style = "Module"
1088+
"#;
1089+
let mut config = Config::from_toml(toml, Path::new("")).unwrap();
1090+
config.override_value("merge_imports", "true");
1091+
// no effect: the new option always takes precedence
1092+
assert_eq!(config.imports_merge_style(), ImportMergeStyle::Module);
1093+
}
1094+
}
10391095
}

src/config/config_type.rs

+27-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::config::file_lines::FileLines;
2-
use crate::config::options::{IgnoreList, MergeImports, WidthHeuristics};
2+
use crate::config::options::{IgnoreList, WidthHeuristics};
33

44
/// Trait for types that can be used in `Config`.
55
pub(crate) trait ConfigType: Sized {
@@ -50,12 +50,6 @@ impl ConfigType for IgnoreList {
5050
}
5151
}
5252

53-
impl ConfigType for MergeImports {
54-
fn doc_hint() -> String {
55-
"[Never|Crate|Module]".to_owned()
56-
}
57-
}
58-
5953
macro_rules! update_config {
6054
($config:ident, ignore = $val:ident, $dir:ident) => {
6155
$config.ignore.1 = true;
@@ -66,6 +60,12 @@ macro_rules! update_config {
6660
$config.ignore.2 = old_ignored.merge_into(new_ignored);
6761
};
6862

63+
($config:ident, merge_imports = $val:ident, $dir:ident) => {
64+
$config.merge_imports.1 = true;
65+
$config.merge_imports.2 = $val;
66+
$config.set_merge_imports();
67+
};
68+
6969
($config:ident, $i:ident = $val:ident, $dir:ident) => {
7070
$config.$i.1 = true;
7171
$config.$i.2 = $val;
@@ -127,6 +127,7 @@ macro_rules! create_config {
127127
| "array_width"
128128
| "chain_width" => self.0.set_heuristics(),
129129
"license_template_path" => self.0.set_license_template(),
130+
"merge_imports" => self.0.set_merge_imports(),
130131
&_ => (),
131132
}
132133
}
@@ -278,14 +279,16 @@ macro_rules! create_config {
278279
| "array_width"
279280
| "chain_width" => self.set_heuristics(),
280281
"license_template_path" => self.set_license_template(),
282+
"merge_imports" => self.set_merge_imports(),
281283
&_ => (),
282284
}
283285
}
284286

285287
#[allow(unreachable_pub)]
286288
pub fn is_hidden_option(name: &str) -> bool {
287-
const HIDE_OPTIONS: [&str; 1] = [
289+
const HIDE_OPTIONS: [&str; 2] = [
288290
"file_lines",
291+
"merge_imports",
289292
];
290293
HIDE_OPTIONS.contains(&name)
291294
}
@@ -429,6 +432,22 @@ macro_rules! create_config {
429432
}
430433
}
431434

435+
fn set_merge_imports(&mut self) {
436+
if self.was_set().merge_imports() {
437+
eprintln!(
438+
"Warning: the `merge_imports` option is deprecated. \
439+
Use `imports_merge_style=Crate` instead"
440+
);
441+
if !self.was_set().imports_merge_style() {
442+
self.imports_merge_style.2 = if self.merge_imports() {
443+
ImportMergeStyle::Crate
444+
} else {
445+
ImportMergeStyle::Preserve
446+
};
447+
}
448+
}
449+
}
450+
432451
#[allow(unreachable_pub)]
433452
/// Returns `true` if the config key was explicitly set and is the default value.
434453
pub fn is_default(&self, key: &str) -> bool {

src/config/options.rs

+3-47
Original file line numberDiff line numberDiff line change
@@ -119,61 +119,17 @@ pub enum GroupImportsTactic {
119119
StdExternalCrate,
120120
}
121121

122-
#[derive(Debug, Copy, Clone, Eq, PartialEq, Serialize)]
122+
#[config_type]
123123
/// How to merge imports.
124-
pub enum MergeImports {
124+
pub enum ImportMergeStyle {
125125
/// Do not merge imports.
126-
Never,
126+
Preserve,
127127
/// Use one `use` statement per crate.
128128
Crate,
129129
/// Use one `use` statement per module.
130130
Module,
131131
}
132132

133-
impl FromStr for MergeImports {
134-
type Err = &'static str;
135-
136-
fn from_str(s: &str) -> Result<Self, Self::Err> {
137-
if "false".eq_ignore_ascii_case(s) {
138-
eprintln!("Warning: merge_imports=false is being renamed to Never");
139-
return Ok(MergeImports::Never);
140-
}
141-
if "true".eq_ignore_ascii_case(s) {
142-
eprintln!("Warning: merge_imports=true is being renamed to Crate");
143-
return Ok(MergeImports::Crate);
144-
}
145-
if "Never".eq_ignore_ascii_case(s) {
146-
return Ok(MergeImports::Never);
147-
}
148-
if "Crate".eq_ignore_ascii_case(s) {
149-
return Ok(MergeImports::Crate);
150-
}
151-
if "Module".eq_ignore_ascii_case(s) {
152-
return Ok(MergeImports::Module);
153-
}
154-
return Err("Bad variant, expected one of: `Never` `Crate` `Module`");
155-
}
156-
}
157-
158-
impl fmt::Display for MergeImports {
159-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
160-
write!(f, "{:?}", self)
161-
}
162-
}
163-
164-
impl<'de> Deserialize<'de> for MergeImports {
165-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
166-
where
167-
D: Deserializer<'de>,
168-
{
169-
let s = String::deserialize(deserializer)?;
170-
Self::from_str(&s).map_err(|_| {
171-
static ALLOWED: &'static [&str] = &["Never", "Crate", "Module"];
172-
serde::de::Error::unknown_variant(&s, ALLOWED)
173-
})
174-
}
175-
}
176-
177133
#[config_type]
178134
pub enum ReportTactic {
179135
Always,

src/formatting/reorder.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use std::cmp::{Ord, Ordering};
1111
use rustc_ast::ast;
1212
use rustc_span::{symbol::sym, Span};
1313

14-
use crate::config::{Config, GroupImportsTactic, MergeImports};
14+
use crate::config::{Config, GroupImportsTactic, ImportMergeStyle};
1515
use crate::formatting::imports::UseSegment;
1616
use crate::formatting::modules::{get_mod_inner_attrs, FileModMap};
1717
use crate::formatting::{
@@ -226,12 +226,12 @@ fn rewrite_reorderable_or_regroupable_items(
226226
for (item, list_item) in normalized_items.iter_mut().zip(list_items) {
227227
item.list_item = Some(list_item.clone());
228228
}
229-
match context.config.merge_imports() {
230-
MergeImports::Crate => normalized_items = merge_use_trees(normalized_items),
231-
MergeImports::Module => {
229+
match context.config.imports_merge_style() {
230+
ImportMergeStyle::Crate => normalized_items = merge_use_trees(normalized_items),
231+
ImportMergeStyle::Module => {
232232
normalized_items = unnest_use_trees(merge_use_trees(normalized_items))
233233
}
234-
MergeImports::Never => {}
234+
ImportMergeStyle::Preserve => {}
235235
}
236236

237237
let mut regrouped_items = match context.config.group_imports() {

src/rustfmt/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ struct Opt {
100100
/// Set options from command line.
101101
///
102102
/// Set configuration options via command line by specifying a list of key-value pairs
103-
/// separated by commas (e.g., rustfmt --config=max_width=100,merge_imports=Crate).
103+
/// separated by commas (e.g., rustfmt --config=max_width=100,imports_merge_style=Crate).
104104
/// These settings precedes any other settings specified in configuration files.
105105
#[structopt(long = "config")]
106106
inline_config: Option<Vec<InlineConfig>>,

tests/source/configs/group_imports/StdExternalCrate-merge_imports.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// rustfmt-group_imports: StdExternalCrate
2-
// rustfmt-merge_imports: Crate
2+
// rustfmt-imports_merge_style: Crate
33
use chrono::Utc;
44
use super::update::convert_publish_payload;
55

tests/source/configs/imports_layout/merge_mixed.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// rustfmt-imports_indent: Block
2-
// rustfmt-merge_imports: Crate
2+
// rustfmt-imports_merge_style: Crate
33
// rustfmt-imports_layout: Mixed
44

55
use std::{fmt, io, str};

0 commit comments

Comments
 (0)