Skip to content

Commit a71be3a

Browse files
committed
version gate
1 parent 727179e commit a71be3a

12 files changed

+1293
-217
lines changed

Diff for: src/imports.rs

+94-77
Original file line numberDiff line numberDiff line change
@@ -1125,90 +1125,107 @@ impl Rewrite for UseTree {
11251125

11261126
// This does NOT format attributes and visibility or add a trailing `;`.
11271127
fn rewrite_result(&self, context: &RewriteContext<'_>, mut shape: Shape) -> RewriteResult {
1128-
fn proceed(
1129-
context: &RewriteContext<'_>,
1130-
span: &Span,
1131-
shape: &Shape,
1132-
curr_segment: &UseSegment,
1133-
curr_segment_is_allow_overflow: bool,
1134-
next_segment: Option<&&UseSegment>,
1135-
) -> Result<(String, Shape), RewriteError> {
1136-
let mut rewritten_segment = curr_segment.rewrite_result(context, shape.clone())?;
1137-
if next_segment.is_some() {
1138-
rewritten_segment.push_str("::");
1139-
}
1140-
let reserved_room_for_brace = match next_segment.map(|s| &s.kind) {
1141-
Some(UseSegmentKind::List(_)) => "{".len(),
1142-
_ => 0,
1143-
};
1144-
let next_shape = if matches!(&curr_segment.kind, UseSegmentKind::List(_)) {
1145-
// This is the last segment and we won't use `next_shape`. Return `shape`
1146-
// unchanged.
1147-
shape.clone()
1148-
} else if curr_segment_is_allow_overflow {
1149-
// If the segment follows `use ` or newline, force to consume the segment with
1150-
// overflow.
1151-
1152-
let s = shape.offset_left_maybe_overflow(rewritten_segment.len());
1153-
if s.width == 0 {
1154-
// We have to to commit current segment in this line. Make a room for next
1155-
// round.
1156-
s.add_width(reserved_room_for_brace)
1157-
} else {
1158-
s.clone()
1128+
if context.config.style_edition() >= StyleEdition::Edition2024 {
1129+
fn proceed(
1130+
context: &RewriteContext<'_>,
1131+
span: &Span,
1132+
shape: &Shape,
1133+
curr_segment: &UseSegment,
1134+
curr_segment_is_allow_overflow: bool,
1135+
next_segment: Option<&&UseSegment>,
1136+
) -> Result<(String, Shape), RewriteError> {
1137+
let mut rewritten_segment = curr_segment.rewrite_result(context, shape.clone())?;
1138+
if next_segment.is_some() {
1139+
rewritten_segment.push_str("::");
11591140
}
1160-
} else {
1161-
let Some(ret) = shape.offset_left(rewritten_segment.len()) else {
1162-
return Err(RewriteError::ExceedsMaxWidth {
1163-
configured_width: shape.width,
1164-
span: span.clone(),
1165-
});
1141+
let reserved_room_for_brace = match next_segment.map(|s| &s.kind) {
1142+
Some(UseSegmentKind::List(_)) => "{".len(),
1143+
_ => 0,
11661144
};
1167-
// Check that there is a room for the next "{". If not, return an error for retry
1168-
// with newline.
1169-
if ret.offset_left(reserved_room_for_brace).is_none() {
1170-
return Err(RewriteError::ExceedsMaxWidth {
1171-
configured_width: shape.width,
1172-
span: span.clone(),
1173-
});
1174-
}
1175-
ret
1176-
};
1177-
Ok((rewritten_segment, next_shape))
1178-
}
1145+
let next_shape = if matches!(&curr_segment.kind, UseSegmentKind::List(_)) {
1146+
// This is the last segment and we won't use `next_shape`. Return `shape`
1147+
// unchanged.
1148+
shape.clone()
1149+
} else if curr_segment_is_allow_overflow {
1150+
// If the segment follows `use ` or newline, force to consume the segment with
1151+
// overflow.
1152+
1153+
let s = shape.offset_left_maybe_overflow(rewritten_segment.len());
1154+
if s.width == 0 {
1155+
// We have to to commit current segment in this line. Make a room for next
1156+
// round.
1157+
s.add_width(reserved_room_for_brace)
1158+
} else {
1159+
s.clone()
1160+
}
1161+
} else {
1162+
let Some(ret) = shape.offset_left(rewritten_segment.len()) else {
1163+
return Err(RewriteError::ExceedsMaxWidth {
1164+
configured_width: shape.width,
1165+
span: span.clone(),
1166+
});
1167+
};
1168+
// Check that there is a room for the next "{". If not, return an error for
1169+
// retry with newline.
1170+
if ret.offset_left(reserved_room_for_brace).is_none() {
1171+
return Err(RewriteError::ExceedsMaxWidth {
1172+
configured_width: shape.width,
1173+
span: span.clone(),
1174+
});
1175+
}
1176+
ret
1177+
};
1178+
Ok((rewritten_segment, next_shape))
1179+
}
11791180

1180-
let shape_top_level = shape.clone();
1181-
let mut result = String::with_capacity(256);
1182-
let mut is_first = true;
1183-
let mut iter = self.path.iter().peekable();
1184-
let span = self.span();
1185-
while let Some(segment) = iter.next() {
1186-
let allow_overflow = is_first;
1187-
is_first = false;
1188-
match proceed(context, &span, &shape, segment, allow_overflow, iter.peek()) {
1189-
Ok((rewritten_segment, next_shape)) => {
1190-
result.push_str(&rewritten_segment);
1191-
shape = next_shape;
1192-
continue;
1193-
}
1194-
Err(RewriteError::ExceedsMaxWidth { .. }) => {
1195-
// If the first `proceed()` failed with no room, retry with newline.
1181+
let shape_top_level = shape.clone();
1182+
let mut result = String::with_capacity(256);
1183+
let mut is_first = true;
1184+
let mut iter = self.path.iter().peekable();
1185+
let span = self.span();
1186+
while let Some(segment) = iter.next() {
1187+
let allow_overflow = is_first;
1188+
is_first = false;
1189+
match proceed(context, &span, &shape, segment, allow_overflow, iter.peek()) {
1190+
Ok((rewritten_segment, next_shape)) => {
1191+
result.push_str(&rewritten_segment);
1192+
shape = next_shape;
1193+
continue;
1194+
}
1195+
Err(RewriteError::ExceedsMaxWidth { .. }) => {
1196+
// If the first `proceed()` failed with no room, retry with newline.
1197+
}
1198+
Err(e) => {
1199+
// Abort otherwise.
1200+
return Err(e);
1201+
}
11961202
}
1197-
Err(e) => {
1198-
// Abort otherwise.
1199-
return Err(e);
1203+
result.push_str("\n");
1204+
result.push_str(&" ".repeat(shape.indent.block_indent + 4));
1205+
shape = shape_top_level.clone();
1206+
let allow_overflow = true;
1207+
let (rewritten_segment, next_shape) =
1208+
proceed(context, &span, &shape, segment, allow_overflow, iter.peek())?;
1209+
result.push_str(&rewritten_segment);
1210+
shape = next_shape;
1211+
}
1212+
Ok(result)
1213+
} else {
1214+
let mut result = String::with_capacity(256);
1215+
let mut iter = self.path.iter().peekable();
1216+
while let Some(segment) = iter.next() {
1217+
let segment_str = segment.rewrite_result(context, shape)?;
1218+
result.push_str(&segment_str);
1219+
if iter.peek().is_some() {
1220+
result.push_str("::");
1221+
// 2 = "::"
1222+
shape = shape
1223+
.offset_left(2 + segment_str.len())
1224+
.max_width_error(shape.width, self.span())?;
12001225
}
12011226
}
1202-
result.push_str("\n");
1203-
result.push_str(&" ".repeat(shape.indent.block_indent + 4));
1204-
shape = shape_top_level.clone();
1205-
let allow_overflow = true;
1206-
let (rewritten_segment, next_shape) =
1207-
proceed(context, &span, &shape, segment, allow_overflow, iter.peek())?;
1208-
result.push_str(&rewritten_segment);
1209-
shape = next_shape;
1227+
Ok(result)
12101228
}
1211-
Ok(result)
12121229
}
12131230
}
12141231

Diff for: tests/source/5131_crate.rs

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use qux::h;
1313
use qux::h as h2;
1414
use qux::i;
1515

16-
1716
mod indent4 {
1817
use column_____________________________________________________________________________________102::{
1918
Foo,

Diff for: tests/source/5131_crate_2024.rs

+166
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// rustfmt-imports_granularity: Crate
2+
// rustfmt-style_edition: 2024
3+
4+
use foo::a;
5+
use foo::a;
6+
use foo::b;
7+
use foo::b as b2;
8+
use foo::b::f;
9+
use foo::b::g;
10+
use foo::b::g as g2;
11+
use foo::c;
12+
use foo::d::e;
13+
use qux::h;
14+
use qux::h as h2;
15+
use qux::i;
16+
17+
18+
mod indent4 {
19+
use column_____________________________________________________________________________________102::{
20+
Foo,
21+
bar::Bar,
22+
bar::baz::Baz,
23+
Foo2,
24+
bar::Bar2,
25+
};
26+
27+
use column_______________________________________________________________________________096::{
28+
Foo,
29+
bar::Bar,
30+
bar::baz::Baz,
31+
Foo2,
32+
bar::Bar2,
33+
};
34+
35+
use column_________________________________________________________________________090::{
36+
Foo,
37+
bar::Bar,
38+
bar::baz::Baz,
39+
Foo2,
40+
bar::Bar2,
41+
};
42+
43+
use c012::c018::c024::c030::c036::c042::c048::c054::c060::c066::c072::c078::c084::c090::c096::c102::{
44+
Foo,
45+
bar::Bar,
46+
bar::baz::Baz,
47+
Foo2,
48+
bar::Bar2,
49+
};
50+
51+
use c012::c018::c024::c030::c036::c042::c048::c054::c060::c066::c072::c078::c084::c090::c096::{
52+
Foo,
53+
bar::Bar,
54+
bar::baz::Baz,
55+
Foo2,
56+
bar::Bar2,
57+
};
58+
59+
use c012::c018::c024::c030::c036::c042::c048::c054::c060::c066::c072::c078::c084::c090::{
60+
Foo,
61+
bar::Bar,
62+
bar::baz::Baz,
63+
Foo2,
64+
bar::Bar2,
65+
};
66+
67+
use c012::c018::c024::c030::c036::c042::c048::c054::c060::c066::c072::c078::c084::{
68+
Foo,
69+
bar::Bar,
70+
bar::baz::Baz,
71+
Foo2,
72+
bar::Bar2,
73+
};
74+
}
75+
76+
use smithay::{
77+
backend::renderer::element::{
78+
default_primary_scanout_output_compare, utils::select_dmabuf_feedback, RenderElementStates,
79+
},
80+
delegate_compositor, delegate_data_control, delegate_data_device, delegate_fractional_scale,
81+
delegate_input_method_manager, delegate_keyboard_shortcuts_inhibit, delegate_layer_shell,
82+
delegate_output, delegate_pointer_constraints, delegate_pointer_gestures,
83+
delegate_presentation, delegate_primary_selection, delegate_relative_pointer, delegate_seat,
84+
delegate_security_context, delegate_shm, delegate_tablet_manager, delegate_text_input_manager,
85+
delegate_viewporter, delegate_virtual_keyboard_manager, delegate_xdg_activation,
86+
delegate_xdg_decoration, delegate_xdg_shell,
87+
desktop::{
88+
space::SpaceElement,
89+
utils::{
90+
surface_presentation_feedback_flags_from_states, surface_primary_scanout_output,
91+
update_surface_primary_scanout_output, OutputPresentationFeedback,
92+
},
93+
PopupKind, PopupManager, Space,
94+
},
95+
input::{
96+
keyboard::{Keysym, LedState, XkbConfig},
97+
pointer::{CursorImageStatus, PointerHandle},
98+
Seat, SeatHandler, SeatState,
99+
},
100+
output::Output,
101+
reexports::{
102+
calloop::{generic::Generic, Interest, LoopHandle, Mode, PostAction},
103+
wayland_protocols::xdg::decoration::{
104+
self as xdg_decoration,
105+
zv1::server::zxdg_toplevel_decoration_v1::Mode as DecorationMode,
106+
},
107+
wayland_server::{
108+
backend::{ClientData, ClientId, DisconnectReason},
109+
protocol::{wl_data_source::WlDataSource, wl_surface::WlSurface},
110+
Display, DisplayHandle, Resource,
111+
},
112+
},
113+
utils::{Clock, Monotonic, Rectangle},
114+
wayland::{
115+
compositor::{get_parent, with_states, CompositorClientState, CompositorState},
116+
dmabuf::DmabufFeedback,
117+
fractional_scale::{
118+
with_fractional_scale, FractionalScaleHandler, FractionalScaleManagerState,
119+
},
120+
input_method::{InputMethodHandler, InputMethodManagerState, PopupSurface},
121+
keyboard_shortcuts_inhibit::{
122+
KeyboardShortcutsInhibitHandler, KeyboardShortcutsInhibitState,
123+
KeyboardShortcutsInhibitor,
124+
},
125+
output::{OutputHandler, OutputManagerState},
126+
pointer_constraints::{
127+
with_pointer_constraint, PointerConstraintsHandler, PointerConstraintsState,
128+
},
129+
pointer_gestures::PointerGesturesState,
130+
presentation::PresentationState,
131+
relative_pointer::RelativePointerManagerState,
132+
seat::WaylandFocus,
133+
security_context::{
134+
SecurityContext, SecurityContextHandler, SecurityContextListenerSource,
135+
SecurityContextState,
136+
},
137+
selection::data_device::{
138+
set_data_device_focus, ClientDndGrabHandler, DataDeviceHandler, DataDeviceState,
139+
ServerDndGrabHandler,
140+
},
141+
selection::{
142+
primary_selection::{
143+
set_primary_focus, PrimarySelectionHandler, PrimarySelectionState,
144+
},
145+
wlr_data_control::{DataControlHandler, DataControlState},
146+
SelectionHandler,
147+
},
148+
shell::{
149+
wlr_layer::WlrLayerShellState,
150+
xdg::{
151+
decoration::{XdgDecorationHandler, XdgDecorationState},
152+
ToplevelSurface, XdgShellState, XdgToplevelSurfaceData,
153+
},
154+
},
155+
shm::{ShmHandler, ShmState},
156+
socket::ListeningSocketSource,
157+
tablet_manager::{TabletManagerState, TabletSeatTrait},
158+
text_input::TextInputManagerState,
159+
viewporter::ViewporterState,
160+
virtual_keyboard::VirtualKeyboardManagerState,
161+
xdg_activation::{
162+
XdgActivationHandler, XdgActivationState, XdgActivationToken, XdgActivationTokenData,
163+
},
164+
xdg_foreign::{XdgForeignHandler, XdgForeignState},
165+
},
166+
};

0 commit comments

Comments
 (0)