Skip to content

Commit cc7e8a0

Browse files
committed
Fix issue rust-lang#4746 - formatting of import long lines
1 parent ee2bed9 commit cc7e8a0

File tree

7 files changed

+372
-3
lines changed

7 files changed

+372
-3
lines changed

src/imports.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::rewrite::{Rewrite, RewriteContext};
2323
use crate::shape::Shape;
2424
use crate::source_map::SpanUtils;
2525
use crate::spanned::Spanned;
26-
use crate::utils::{is_same_visibility, mk_sp, rewrite_ident};
26+
use crate::utils::{first_line_width, is_same_visibility, mk_sp, rewrite_ident};
2727
use crate::visitor::FmtVisitor;
2828

2929
/// Returns a name imported by a `use` declaration.
@@ -1077,15 +1077,27 @@ impl Rewrite for UseTree {
10771077
fn rewrite(&self, context: &RewriteContext<'_>, mut shape: Shape) -> Option<String> {
10781078
let mut result = String::with_capacity(256);
10791079
let mut iter = self.path.iter().peekable();
1080+
let start_shape = shape;
1081+
10801082
while let Some(segment) = iter.next() {
10811083
let segment_str = segment.rewrite(context, shape)?;
1084+
let mut added_len = first_line_width(&segment_str);
1085+
if iter.peek().is_some() {
1086+
added_len += 2; // 3 == "::"
1087+
}
1088+
if added_len > shape.width {
1089+
result.push_str(&start_shape.to_string_with_newline(context.config));
1090+
shape = start_shape;
1091+
}
1092+
10821093
result.push_str(&segment_str);
10831094
if iter.peek().is_some() {
10841095
result.push_str("::");
10851096
// 2 = "::"
10861097
shape = shape.offset_left(2 + segment_str.len())?;
10871098
}
10881099
}
1100+
10891101
Some(result)
10901102
}
10911103
}

tests/source/issue-4746/crate.rs

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// rustfmt-imports_granularity: Crate
2+
3+
// Long imports with reordering - from original issue
4+
use foo::bar;
5+
use foo::{foo, baz};
6+
use abaadfsasdfdsfdfas::aasdffjsioejr::abc::sdsdf::sdfsdfsdf::sdfsdfdsf::{
7+
asdfasdefasdasdfsdfdfasdf::asdfasdasedfafasdfasdf,
8+
};
9+
10+
use foo::bar;
11+
use foo::{foo, baz};
12+
use abaadfsasdfdsfdfas::aasdffjsioejr::abc::sdsdf::sdfsdfsdf::sdfsdfds::{
13+
asdfasdefasdasdfsdfdfasdf::asdfasdasedfafasdfasdf,
14+
};
15+
16+
// Long imports with different sizes - based on original issue
17+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::asdf;
18+
use a;
19+
20+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::a;
21+
use a;
22+
23+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
24+
use a;
25+
26+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z12345678::z1234567;
27+
use a;
28+
29+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567890123456::z1234567;
30+
use a;
31+
32+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z12345678901234567::z1234567;
33+
use a;
34+
35+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::asdf;
36+
use a;
37+
38+
// Very long (two lines) imports
39+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
40+
use a;
41+
42+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{foo, baz};
43+
use a;
44+
45+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo;
46+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz;
47+
use a;
48+
49+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{
50+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567,
51+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567};
52+
use a;
53+
54+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{
55+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567,
56+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567};
57+
use a;
58+
59+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{
60+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo,
61+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz};
62+
use a;
63+
64+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
65+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
66+
use a;
67+
68+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo;
69+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz;
70+
use a;

tests/source/issue-4746/preserve.rs

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// rustfmt-imports_granularity: Preserve
2+
3+
// Long imports with reordering - from original issue
4+
use foo::bar;
5+
use foo::{foo, baz};
6+
use abaadfsasdfdsfdfas::aasdffjsioejr::abc::sdsdf::sdfsdfsdf::sdfsdfdsf::{
7+
asdfasdefasdasdfsdfdfasdf::asdfasdasedfafasdfasdf,
8+
};
9+
10+
use foo::bar;
11+
use foo::{foo, baz};
12+
use abaadfsasdfdsfdfas::aasdffjsioejr::abc::sdsdf::sdfsdfsdf::sdfsdfds::{
13+
asdfasdefasdasdfsdfdfasdf::asdfasdasedfafasdfasdf,
14+
};
15+
16+
// Long imports with different sizes - based on original issue
17+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::asdf;
18+
use a;
19+
20+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::a;
21+
use a;
22+
23+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
24+
use a;
25+
26+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z12345678::z1234567;
27+
use a;
28+
29+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567890123456::z1234567;
30+
use a;
31+
32+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z12345678901234567::z1234567;
33+
use a;
34+
35+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::asdf;
36+
use a;
37+
38+
// Very long (two lines) imports
39+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
40+
use a;
41+
42+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{foo, baz};
43+
use a;
44+
45+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo;
46+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz;
47+
use a;
48+
49+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{
50+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567,
51+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567};
52+
use a;
53+
54+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{
55+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567,
56+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567};
57+
use a;
58+
59+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::{
60+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo,
61+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz};
62+
use a;
63+
64+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
65+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
66+
use a;
67+
68+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::foo;
69+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::baz;
70+
use a;

tests/source/issue_3033.rs

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerBinding::
2+
BluetoothRemoteGATTServerMethods;

tests/target/issue-4746/crate.rs

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
// rustfmt-imports_granularity: Crate
2+
3+
// Long imports with reordering - from original issue
4+
use abaadfsasdfdsfdfas::aasdffjsioejr::abc::sdsdf::sdfsdfsdf::sdfsdfdsf::
5+
asdfasdefasdasdfsdfdfasdf::asdfasdasedfafasdfasdf;
6+
use foo::{bar, baz, foo};
7+
8+
use abaadfsasdfdsfdfas::aasdffjsioejr::abc::sdsdf::sdfsdfsdf::sdfsdfds::asdfasdefasdasdfsdfdfasdf::
9+
asdfasdasedfafasdfasdf;
10+
use foo::{bar, baz, foo};
11+
12+
// Long imports with different sizes - based on original issue
13+
use a;
14+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
15+
z1234567::asdf;
16+
17+
use a;
18+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
19+
z1234567::a;
20+
21+
use a;
22+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567;
23+
24+
use a;
25+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z12345678::z1234567;
26+
27+
use a;
28+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567890123456::
29+
z1234567;
30+
31+
use a;
32+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
33+
z12345678901234567::z1234567;
34+
35+
use a;
36+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
37+
z1234567::asdf;
38+
39+
// Very long (two lines) imports
40+
use a;
41+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
42+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
43+
z1234567::z1234567;
44+
45+
use a;
46+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
47+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
48+
z1234567::z1234567::{baz, foo};
49+
50+
use a;
51+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
52+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
53+
z1234567::z1234567::{baz, foo};
54+
55+
use a;
56+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
57+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
58+
z1234567::z1234567::{
59+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
60+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
61+
z1234567,
62+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
63+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
64+
z1234567,
65+
};
66+
67+
use a;
68+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
69+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
70+
z1234567::z1234567::{
71+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
72+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
73+
z1234567,
74+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
75+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
76+
z1234567,
77+
};
78+
79+
use a;
80+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
81+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
82+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
83+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
84+
z1234567::z1234567::z1234567::{baz, foo};
85+
86+
use a;
87+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
88+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
89+
z1234567::z1234567::{
90+
baz::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
91+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
92+
z1234567,
93+
foo::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
94+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
95+
z1234567,
96+
};
97+
98+
use a;
99+
use z123::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
100+
z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::z1234567::
101+
z1234567::z1234567::{baz, foo};

0 commit comments

Comments
 (0)