Skip to content

Commit 63119a2

Browse files
committed
update rewrite functions in imports.rs
1 parent b8a5b21 commit 63119a2

File tree

2 files changed

+61
-27
lines changed

2 files changed

+61
-27
lines changed

src/imports.rs

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::config::{Edition, IndentStyle, StyleEdition};
1919
use crate::lists::{
2020
definitive_tactic, itemize_list, write_list, ListFormatting, ListItem, Separator,
2121
};
22-
use crate::rewrite::{Rewrite, RewriteContext};
22+
use crate::rewrite::{Rewrite, RewriteContext, RewriteErrorExt, RewriteResult};
2323
use crate::shape::Shape;
2424
use crate::source_map::SpanUtils;
2525
use crate::spanned::Spanned;
@@ -44,7 +44,8 @@ impl<'a> FmtVisitor<'a> {
4444
Some(item.span.lo()),
4545
Some(item.attrs.clone()),
4646
)
47-
.rewrite_top_level(&self.get_context(), shape);
47+
.rewrite_top_level(&self.get_context(), shape)
48+
.ok();
4849
match rw {
4950
Some(ref s) if s.is_empty() => {
5051
// Format up to last newline
@@ -331,12 +332,17 @@ impl UseTree {
331332
&self,
332333
context: &RewriteContext<'_>,
333334
shape: Shape,
334-
) -> Option<String> {
335+
) -> RewriteResult {
335336
let vis = self.visibility.as_ref().map_or(Cow::from(""), |vis| {
336337
crate::utils::format_visibility(context, vis)
337338
});
338339
let use_str = self
339-
.rewrite(context, shape.offset_left(vis.len())?)
340+
.rewrite_result(
341+
context,
342+
shape
343+
.offset_left(vis.len())
344+
.max_width_error(shape.width, self.span())?,
345+
)
340346
.map(|s| {
341347
if s.is_empty() {
342348
s
@@ -346,8 +352,8 @@ impl UseTree {
346352
})?;
347353
match self.attrs {
348354
Some(ref attrs) if !attrs.is_empty() => {
349-
let attr_str = attrs.rewrite(context, shape)?;
350-
let lo = attrs.last().as_ref()?.span.hi();
355+
let attr_str = attrs.rewrite_result(context, shape)?;
356+
let lo = attrs.last().unknown_error()?.span.hi();
351357
let hi = self.span.lo();
352358
let span = mk_sp(lo, hi);
353359

@@ -367,9 +373,8 @@ impl UseTree {
367373
shape,
368374
allow_extend,
369375
)
370-
.ok()
371376
}
372-
_ => Some(use_str),
377+
_ => Ok(use_str),
373378
}
374379
}
375380

@@ -1006,22 +1011,26 @@ impl Ord for UseTree {
10061011
fn rewrite_nested_use_tree(
10071012
context: &RewriteContext<'_>,
10081013
use_tree_list: &[UseTree],
1014+
span: Span,
10091015
shape: Shape,
1010-
) -> Option<String> {
1016+
) -> RewriteResult {
10111017
let mut list_items = Vec::with_capacity(use_tree_list.len());
10121018
let nested_shape = match context.config.imports_indent() {
10131019
IndentStyle::Block => shape
10141020
.block_indent(context.config.tab_spaces())
10151021
.with_max_width(context.config)
1016-
.sub_width(1)?,
1022+
.sub_width(1)
1023+
.max_width_error(shape.width, span)?,
10171024
IndentStyle::Visual => shape.visual_indent(0),
10181025
};
10191026
for use_tree in use_tree_list {
10201027
if let Some(mut list_item) = use_tree.list_item.clone() {
10211028
list_item.item = use_tree.rewrite_result(context, nested_shape);
10221029
list_items.push(list_item);
10231030
} else {
1024-
list_items.push(ListItem::from_str(use_tree.rewrite(context, nested_shape)?));
1031+
list_items.push(ListItem::from_str(
1032+
use_tree.rewrite_result(context, nested_shape)?,
1033+
));
10251034
}
10261035
}
10271036
let has_nested_list = use_tree_list.iter().any(|use_segment| {
@@ -1057,7 +1066,7 @@ fn rewrite_nested_use_tree(
10571066
.preserve_newline(true)
10581067
.nested(has_nested_list);
10591068

1060-
let list_str = write_list(&list_items, &fmt).ok()?;
1069+
let list_str = write_list(&list_items, &fmt)?;
10611070

10621071
let result = if (list_str.contains('\n')
10631072
|| list_str.len() > remaining_width
@@ -1074,12 +1083,16 @@ fn rewrite_nested_use_tree(
10741083
format!("{{{list_str}}}")
10751084
};
10761085

1077-
Some(result)
1086+
Ok(result)
10781087
}
10791088

10801089
impl Rewrite for UseSegment {
10811090
fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
1082-
Some(match self.kind {
1091+
self.rewrite_result(context, shape).ok()
1092+
}
1093+
1094+
fn rewrite_result(&self, context: &RewriteContext<'_>, shape: Shape) -> RewriteResult {
1095+
Ok(match self.kind {
10831096
UseSegmentKind::Ident(ref ident, Some(ref rename)) => {
10841097
format!("{ident} as {rename}")
10851098
}
@@ -1091,31 +1104,54 @@ impl Rewrite for UseSegment {
10911104
UseSegmentKind::Crate(Some(ref rename)) => format!("crate as {rename}"),
10921105
UseSegmentKind::Crate(None) => "crate".to_owned(),
10931106
UseSegmentKind::Glob => "*".to_owned(),
1094-
UseSegmentKind::List(ref use_tree_list) => rewrite_nested_use_tree(
1095-
context,
1096-
use_tree_list,
1097-
// 1 = "{" and "}"
1098-
shape.offset_left(1)?.sub_width(1)?,
1099-
)?,
1107+
UseSegmentKind::List(ref use_tree_list) => {
1108+
let lo = use_tree_list
1109+
.iter()
1110+
.map(|use_tree| use_tree.span().lo())
1111+
.min()
1112+
.unknown_error()?;
1113+
let hi = use_tree_list
1114+
.iter()
1115+
.map(|use_tree| use_tree.span().hi())
1116+
.max()
1117+
.unknown_error()?;
1118+
let span = mk_sp(lo, hi);
1119+
rewrite_nested_use_tree(
1120+
context,
1121+
use_tree_list,
1122+
span,
1123+
// 1 = "{" and "}"
1124+
shape
1125+
.offset_left(1)
1126+
.and_then(|s| s.sub_width(1))
1127+
.max_width_error(shape.width, span)?,
1128+
)?
1129+
}
11001130
})
11011131
}
11021132
}
11031133

11041134
impl Rewrite for UseTree {
1135+
fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
1136+
self.rewrite_result(context, shape).ok()
1137+
}
1138+
11051139
// This does NOT format attributes and visibility or add a trailing `;`.
1106-
fn rewrite(&self, context: &RewriteContext<'_>, mut shape: Shape) -> Option<String> {
1140+
fn rewrite_result(&self, context: &RewriteContext<'_>, mut shape: Shape) -> RewriteResult {
11071141
let mut result = String::with_capacity(256);
11081142
let mut iter = self.path.iter().peekable();
11091143
while let Some(segment) = iter.next() {
1110-
let segment_str = segment.rewrite(context, shape)?;
1144+
let segment_str = segment.rewrite_result(context, shape)?;
11111145
result.push_str(&segment_str);
11121146
if iter.peek().is_some() {
11131147
result.push_str("::");
11141148
// 2 = "::"
1115-
shape = shape.offset_left(2 + segment_str.len())?;
1149+
shape = shape
1150+
.offset_left(2 + segment_str.len())
1151+
.max_width_error(shape.width, self.span())?;
11161152
}
11171153
}
1118-
Some(result)
1154+
Ok(result)
11191155
}
11201156
}
11211157

src/reorder.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,7 @@ fn rewrite_reorderable_or_regroupable_items(
132132
let item_vec: Vec<_> = use_group
133133
.into_iter()
134134
.map(|use_tree| {
135-
let item = use_tree
136-
.rewrite_top_level(context, nested_shape)
137-
.unknown_error();
135+
let item = use_tree.rewrite_top_level(context, nested_shape);
138136
if let Some(list_item) = use_tree.list_item {
139137
ListItem {
140138
item: item,

0 commit comments

Comments
 (0)