Skip to content

Commit 89a1bd6

Browse files
committed
Use the same shape to rewrite import when reordering them or not
Fixes 4794 The code paths for formatting imports diverge based on the value of `reorder_imports`. Each code path used a slightly different shape when rewriting the imports which lead to issues when `reorder_imports = false` and `imports_indent = Visual`. Now the code path that rewrites imports without reordering uses the same shape as the path that also reorders imports.
1 parent 2d9bc46 commit 89a1bd6

9 files changed

+239
-1
lines changed

src/imports.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ impl<'a> FmtVisitor<'a> {
3131
pub(crate) fn format_import(&mut self, item: &ast::Item, tree: &ast::UseTree) {
3232
let span = item.span();
3333
let shape = self.shape();
34+
// 4 = "use ", 1 = ";"
35+
let nested_shape = shape
36+
.offset_left(4)
37+
.unwrap_or(shape)
38+
.sub_width(1)
39+
.unwrap_or(shape);
3440
let rw = UseTree::from_ast(
3541
&self.get_context(),
3642
tree,
@@ -39,7 +45,7 @@ impl<'a> FmtVisitor<'a> {
3945
Some(item.span.lo()),
4046
Some(item.attrs.clone()),
4147
)
42-
.rewrite_top_level(&self.get_context(), shape);
48+
.rewrite_top_level(&self.get_context(), nested_shape);
4349
match rw {
4450
Some(ref s) if s.is_empty() => {
4551
// Format up to last newline
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// rustfmt-imports_indent: Block
2+
// rustfmt-reorder_imports: false
3+
4+
use module::{
5+
submodule_A::{Type_A1, Type_A2},
6+
submodule_B::{Type_B1, Type_B2},
7+
};
8+
9+
pub use module::{
10+
submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2},
12+
};
13+
14+
pub(crate) use module::{
15+
submodule_A::{Type_A1, Type_A2},
16+
submodule_B::{Type_B1, Type_B2},
17+
};
18+
19+
use module::{
20+
submodule_B::{Type_B1, Type_B2},
21+
submodule_A::{Type_A1, Type_A2},
22+
};
23+
24+
pub use module::{
25+
submodule_B::{Type_B1, Type_B2},
26+
submodule_A::{Type_A1, Type_A2},
27+
};
28+
29+
pub(crate) use module::{
30+
submodule_B::{Type_B1, Type_B2},
31+
submodule_A::{Type_A1, Type_A2},
32+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// rustfmt-imports_indent: Visual
2+
// rustfmt-reorder_imports: false
3+
4+
use module::{
5+
submodule_A::{Type_A1, Type_A2},
6+
submodule_B::{Type_B1, Type_B2},
7+
};
8+
9+
pub use module::{
10+
submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2},
12+
};
13+
14+
pub(crate) use module::{
15+
submodule_A::{Type_A1, Type_A2},
16+
submodule_B::{Type_B1, Type_B2},
17+
};
18+
19+
use module::{
20+
submodule_B::{Type_B1, Type_B2},
21+
submodule_A::{Type_A1, Type_A2},
22+
};
23+
24+
pub use module::{
25+
submodule_B::{Type_B1, Type_B2},
26+
submodule_A::{Type_A1, Type_A2},
27+
};
28+
29+
pub(crate) use module::{
30+
submodule_B::{Type_B1, Type_B2},
31+
submodule_A::{Type_A1, Type_A2},
32+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// rustfmt-imports_indent: Block
2+
// rustfmt-reorder_imports: true
3+
4+
use module::{
5+
submodule_A::{Type_A1, Type_A2},
6+
submodule_B::{Type_B1, Type_B2},
7+
};
8+
9+
pub use module::{
10+
submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2},
12+
};
13+
14+
pub(crate) use module::{
15+
submodule_A::{Type_A1, Type_A2},
16+
submodule_B::{Type_B1, Type_B2},
17+
};
18+
19+
use module::{
20+
submodule_B::{Type_B1, Type_B2},
21+
submodule_A::{Type_A1, Type_A2},
22+
};
23+
24+
pub use module::{
25+
submodule_B::{Type_B1, Type_B2},
26+
submodule_A::{Type_A1, Type_A2},
27+
};
28+
29+
pub(crate) use module::{
30+
submodule_B::{Type_B1, Type_B2},
31+
submodule_A::{Type_A1, Type_A2},
32+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// rustfmt-imports_indent: Visual
2+
// rustfmt-reorder_imports: true
3+
4+
use module::{
5+
submodule_A::{Type_A1, Type_A2},
6+
submodule_B::{Type_B1, Type_B2},
7+
};
8+
9+
pub use module::{
10+
submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2},
12+
};
13+
14+
pub(crate) use module::{
15+
submodule_A::{Type_A1, Type_A2},
16+
submodule_B::{Type_B1, Type_B2},
17+
};
18+
19+
use module::{
20+
submodule_B::{Type_B1, Type_B2},
21+
submodule_A::{Type_A1, Type_A2},
22+
};
23+
24+
pub use module::{
25+
submodule_B::{Type_B1, Type_B2},
26+
submodule_A::{Type_A1, Type_A2},
27+
};
28+
29+
pub(crate) use module::{
30+
submodule_B::{Type_B1, Type_B2},
31+
submodule_A::{Type_A1, Type_A2},
32+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// rustfmt-imports_indent: Block
2+
// rustfmt-reorder_imports: false
3+
4+
use module::{
5+
submodule_A::{Type_A1, Type_A2},
6+
submodule_B::{Type_B1, Type_B2},
7+
};
8+
9+
pub use module::{
10+
submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2},
12+
};
13+
14+
pub(crate) use module::{
15+
submodule_A::{Type_A1, Type_A2},
16+
submodule_B::{Type_B1, Type_B2},
17+
};
18+
19+
use module::{
20+
submodule_B::{Type_B1, Type_B2},
21+
submodule_A::{Type_A1, Type_A2},
22+
};
23+
24+
pub use module::{
25+
submodule_B::{Type_B1, Type_B2},
26+
submodule_A::{Type_A1, Type_A2},
27+
};
28+
29+
pub(crate) use module::{
30+
submodule_B::{Type_B1, Type_B2},
31+
submodule_A::{Type_A1, Type_A2},
32+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// rustfmt-imports_indent: Visual
2+
// rustfmt-reorder_imports: false
3+
4+
use module::{submodule_A::{Type_A1, Type_A2},
5+
submodule_B::{Type_B1, Type_B2}};
6+
7+
pub use module::{submodule_A::{Type_A1, Type_A2},
8+
submodule_B::{Type_B1, Type_B2}};
9+
10+
pub(crate) use module::{submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2}};
12+
13+
use module::{submodule_B::{Type_B1, Type_B2},
14+
submodule_A::{Type_A1, Type_A2}};
15+
16+
pub use module::{submodule_B::{Type_B1, Type_B2},
17+
submodule_A::{Type_A1, Type_A2}};
18+
19+
pub(crate) use module::{submodule_B::{Type_B1, Type_B2},
20+
submodule_A::{Type_A1, Type_A2}};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// rustfmt-imports_indent: Block
2+
// rustfmt-reorder_imports: true
3+
4+
use module::{
5+
submodule_A::{Type_A1, Type_A2},
6+
submodule_B::{Type_B1, Type_B2},
7+
};
8+
9+
pub use module::{
10+
submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2},
12+
};
13+
14+
pub(crate) use module::{
15+
submodule_A::{Type_A1, Type_A2},
16+
submodule_B::{Type_B1, Type_B2},
17+
};
18+
19+
use module::{
20+
submodule_A::{Type_A1, Type_A2},
21+
submodule_B::{Type_B1, Type_B2},
22+
};
23+
24+
pub use module::{
25+
submodule_A::{Type_A1, Type_A2},
26+
submodule_B::{Type_B1, Type_B2},
27+
};
28+
29+
pub(crate) use module::{
30+
submodule_A::{Type_A1, Type_A2},
31+
submodule_B::{Type_B1, Type_B2},
32+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// rustfmt-imports_indent: Visual
2+
// rustfmt-reorder_imports: true
3+
4+
use module::{submodule_A::{Type_A1, Type_A2},
5+
submodule_B::{Type_B1, Type_B2}};
6+
7+
pub use module::{submodule_A::{Type_A1, Type_A2},
8+
submodule_B::{Type_B1, Type_B2}};
9+
10+
pub(crate) use module::{submodule_A::{Type_A1, Type_A2},
11+
submodule_B::{Type_B1, Type_B2}};
12+
13+
use module::{submodule_A::{Type_A1, Type_A2},
14+
submodule_B::{Type_B1, Type_B2}};
15+
16+
pub use module::{submodule_A::{Type_A1, Type_A2},
17+
submodule_B::{Type_B1, Type_B2}};
18+
19+
pub(crate) use module::{submodule_A::{Type_A1, Type_A2},
20+
submodule_B::{Type_B1, Type_B2}};

0 commit comments

Comments
 (0)