Skip to content

Commit 5ca731a

Browse files
committed
Add imports_granularity="Flatten".
This option splits all imports into their own `use` statement.
1 parent e1ab878 commit 5ca731a

File tree

5 files changed

+66
-8
lines changed

5 files changed

+66
-8
lines changed

Configurations.md

+16-1
Original file line numberDiff line numberDiff line change
@@ -1710,7 +1710,7 @@ pub enum Foo {}
17101710
Merge together related imports based on their paths.
17111711

17121712
- **Default value**: `Preserve`
1713-
- **Possible values**: `Preserve`, `Crate`, `Module`
1713+
- **Possible values**: `Preserve`, `Crate`, `Module`, `Separate`
17141714
- **Stable**: No
17151715

17161716
#### `Preserve` (default):
@@ -1749,6 +1749,21 @@ use foo::{a, b, c};
17491749
use qux::{h, i};
17501750
```
17511751

1752+
#### `Flatten`:
1753+
1754+
Flatten imports so that each has its own `use` statement.
1755+
1756+
```rust
1757+
use foo::a;
1758+
use foo::b;
1759+
use foo::b::f;
1760+
use foo::b::g;
1761+
use foo::c;
1762+
use foo::d::e;
1763+
use qux::h;
1764+
use qux::i;
1765+
```
1766+
17521767
## `merge_imports`
17531768

17541769
This option is deprecated. Use `imports_granularity = "Crate"` instead.

src/config/options.rs

+2
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ pub enum ImportGranularity {
128128
Crate,
129129
/// Use one `use` statement per module.
130130
Module,
131+
/// Use one `use` statement per imported item.
132+
Flatten,
131133
}
132134

133135
#[config_type]

src/formatting/imports.rs

+17
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ impl UseTree {
542542
SharedPrefix::Module => {
543543
self.path[..self.path.len() - 1] == other.path[..other.path.len() - 1]
544544
}
545+
SharedPrefix::NoPrefix => false,
545546
}
546547
}
547548
}
@@ -854,6 +855,7 @@ impl Rewrite for UseTree {
854855
pub(crate) enum SharedPrefix {
855856
Crate,
856857
Module,
858+
NoPrefix,
857859
}
858860

859861
#[cfg(test)]
@@ -1068,6 +1070,21 @@ mod test {
10681070
);
10691071
}
10701072

1073+
#[test]
1074+
fn test_use_tree_merge_no_prefix() {
1075+
test_merge!(
1076+
NoPrefix,
1077+
["foo::{a::{b, c}, d::e}"],
1078+
["foo::a::b", "foo::a::c", "foo::d::e"]
1079+
);
1080+
1081+
test_merge!(
1082+
NoPrefix,
1083+
["foo::{self, a, b::{c, d}, e::*}"],
1084+
["foo::self", "foo::a", "foo::b::c", "foo::b::d", "foo::e::*"]
1085+
)
1086+
}
1087+
10711088
#[test]
10721089
fn test_use_tree_flatten() {
10731090
assert_eq!(

src/formatting/reorder.rs

+8-7
Original file line numberDiff line numberDiff line change
@@ -228,15 +228,16 @@ fn rewrite_reorderable_or_regroupable_items(
228228
for (item, list_item) in normalized_items.iter_mut().zip(list_items) {
229229
item.list_item = Some(list_item.clone());
230230
}
231-
match context.config.imports_granularity() {
232-
ImportGranularity::Crate => {
233-
normalized_items = merge_use_trees(normalized_items, SharedPrefix::Crate)
234-
}
231+
normalized_items = match context.config.imports_granularity() {
232+
ImportGranularity::Crate => merge_use_trees(normalized_items, SharedPrefix::Crate),
235233
ImportGranularity::Module => {
236-
normalized_items = merge_use_trees(normalized_items, SharedPrefix::Module)
234+
merge_use_trees(normalized_items, SharedPrefix::Module)
237235
}
238-
ImportGranularity::Preserve => {}
239-
}
236+
ImportGranularity::Separate => {
237+
merge_use_trees(normalized_items, SharedPrefix::NoPrefix)
238+
}
239+
ImportGranularity::Preserve => normalized_items,
240+
};
240241

241242
let mut regrouped_items = match context.config.group_imports() {
242243
GroupImportsTactic::Preserve => vec![normalized_items],
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// rustfmt-imports_granularity: Separate
2+
3+
use a::b::c;
4+
use a::d::e;
5+
use a::f;
6+
use a::g::h;
7+
use a::g::i;
8+
use a::j;
9+
use a::j::k;
10+
use a::j::k::l;
11+
use a::j::m;
12+
use a::n::o::p;
13+
use a::n::q;
14+
pub use a::r::s;
15+
pub use a::t;
16+
17+
use foo::e;
18+
#[cfg(test)]
19+
use foo::{a::b, c::d};
20+
21+
use bar::a::b;
22+
use bar::c::d;
23+
use bar::e::f;

0 commit comments

Comments
 (0)