Skip to content

Commit 19af235

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 2c8b3be commit 19af235

9 files changed

+562
-1
lines changed

src/imports.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ impl<'a> FmtVisitor<'a> {
3636
pub(crate) fn format_import(&mut self, item: &ast::Item, tree: &ast::UseTree) {
3737
let span = item.span();
3838
let shape = self.shape();
39+
// 4 = "use ", 1 = ";"
40+
let nested_shape = shape
41+
.offset_left(4)
42+
.and_then(|s| s.sub_width(1))
43+
.unwrap_or(shape);
3944
let rw = UseTree::from_ast(
4045
&self.get_context(),
4146
tree,
@@ -44,7 +49,7 @@ impl<'a> FmtVisitor<'a> {
4449
Some(item.span.lo()),
4550
Some(item.attrs.clone()),
4651
)
47-
.rewrite_top_level(&self.get_context(), shape);
52+
.rewrite_top_level(&self.get_context(), nested_shape);
4853
match rw {
4954
Some(ref s) if s.is_empty() => {
5055
// Format up to last newline
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+
};
33+
34+
// deeply nested use
35+
mod nested {
36+
mod even_more_nested {
37+
use module::{
38+
submodule_A::{Type_A1, Type_A2},
39+
submodule_B::{Type_B1, Type_B2},
40+
};
41+
42+
pub use module::{
43+
submodule_A::{Type_A1, Type_A2},
44+
submodule_B::{Type_B1, Type_B2},
45+
};
46+
47+
pub(crate) use module::{
48+
submodule_A::{Type_A1, Type_A2},
49+
submodule_B::{Type_B1, Type_B2},
50+
};
51+
52+
use module::{
53+
submodule_B::{Type_B1, Type_B2},
54+
submodule_A::{Type_A1, Type_A2},
55+
};
56+
57+
pub use module::{
58+
submodule_B::{Type_B1, Type_B2},
59+
submodule_A::{Type_A1, Type_A2},
60+
};
61+
62+
pub(crate) use module::{
63+
submodule_B::{Type_B1, Type_B2},
64+
submodule_A::{Type_A1, Type_A2},
65+
};
66+
}
67+
}
68+
69+
// use inside a function
70+
fn main() {
71+
use module::{
72+
submodule_A::{Type_A1, Type_A2},
73+
submodule_B::{Type_B1, Type_B2},
74+
};
75+
println!("hello world!");
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+
};
33+
34+
// deeply nested use
35+
mod nested {
36+
mod even_more_nested {
37+
use module::{
38+
submodule_A::{Type_A1, Type_A2},
39+
submodule_B::{Type_B1, Type_B2},
40+
};
41+
42+
pub use module::{
43+
submodule_A::{Type_A1, Type_A2},
44+
submodule_B::{Type_B1, Type_B2},
45+
};
46+
47+
pub(crate) use module::{
48+
submodule_A::{Type_A1, Type_A2},
49+
submodule_B::{Type_B1, Type_B2},
50+
};
51+
52+
use module::{
53+
submodule_B::{Type_B1, Type_B2},
54+
submodule_A::{Type_A1, Type_A2},
55+
};
56+
57+
pub use module::{
58+
submodule_B::{Type_B1, Type_B2},
59+
submodule_A::{Type_A1, Type_A2},
60+
};
61+
62+
pub(crate) use module::{
63+
submodule_B::{Type_B1, Type_B2},
64+
submodule_A::{Type_A1, Type_A2},
65+
};
66+
}
67+
}
68+
69+
// use inside a function
70+
fn main() {
71+
use module::{
72+
submodule_A::{Type_A1, Type_A2},
73+
submodule_B::{Type_B1, Type_B2},
74+
};
75+
println!("hello world!");
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+
};
33+
34+
// deeply nested use
35+
mod nested {
36+
mod even_more_nested {
37+
use module::{
38+
submodule_A::{Type_A1, Type_A2},
39+
submodule_B::{Type_B1, Type_B2},
40+
};
41+
42+
pub use module::{
43+
submodule_A::{Type_A1, Type_A2},
44+
submodule_B::{Type_B1, Type_B2},
45+
};
46+
47+
pub(crate) use module::{
48+
submodule_A::{Type_A1, Type_A2},
49+
submodule_B::{Type_B1, Type_B2},
50+
};
51+
52+
use module::{
53+
submodule_B::{Type_B1, Type_B2},
54+
submodule_A::{Type_A1, Type_A2},
55+
};
56+
57+
pub use module::{
58+
submodule_B::{Type_B1, Type_B2},
59+
submodule_A::{Type_A1, Type_A2},
60+
};
61+
62+
pub(crate) use module::{
63+
submodule_B::{Type_B1, Type_B2},
64+
submodule_A::{Type_A1, Type_A2},
65+
};
66+
}
67+
}
68+
69+
// use inside a function
70+
fn main() {
71+
use module::{
72+
submodule_A::{Type_A1, Type_A2},
73+
submodule_B::{Type_B1, Type_B2},
74+
};
75+
println!("hello world!");
76+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+
};
33+
34+
// deeply nested use
35+
mod nested {
36+
mod even_more_nested {
37+
use module::{
38+
submodule_A::{Type_A1, Type_A2},
39+
submodule_B::{Type_B1, Type_B2},
40+
};
41+
42+
pub use module::{
43+
submodule_A::{Type_A1, Type_A2},
44+
submodule_B::{Type_B1, Type_B2},
45+
};
46+
47+
pub(crate) use module::{
48+
submodule_A::{Type_A1, Type_A2},
49+
submodule_B::{Type_B1, Type_B2},
50+
};
51+
52+
use module::{
53+
submodule_B::{Type_B1, Type_B2},
54+
submodule_A::{Type_A1, Type_A2},
55+
};
56+
57+
pub use module::{
58+
submodule_B::{Type_B1, Type_B2},
59+
submodule_A::{Type_A1, Type_A2},
60+
};
61+
62+
pub(crate) use module::{
63+
submodule_B::{Type_B1, Type_B2},
64+
submodule_A::{Type_A1, Type_A2},
65+
};
66+
}
67+
}
68+
69+
// use inside a function
70+
fn main() {
71+
use module::{
72+
submodule_A::{Type_A1, Type_A2},
73+
submodule_B::{Type_B1, Type_B2},
74+
};
75+
println!("hello world!");
76+
}

0 commit comments

Comments
 (0)