Skip to content

Commit 1313d61

Browse files
ding-youngytmimi
authored andcommitted
modfiy ListItem to hold RewriteResult as the item field
1 parent 6ccf539 commit 1313d61

14 files changed

+69
-56
lines changed

src/attr.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ fn format_derive(
147147
.tactic(tactic)
148148
.trailing_separator(trailing_separator)
149149
.ends_with_newline(false);
150-
let item_str = write_list(&all_items, &fmt)?;
150+
let item_str = write_list(&all_items, &fmt).ok()?;
151151

152152
debug!("item_str: '{}'", item_str);
153153

src/closures.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ fn rewrite_closure_fn_decl(
336336
let fmt = ListFormatting::new(param_shape, context.config)
337337
.tactic(tactic)
338338
.preserve_newline(true);
339-
let list_str = write_list(&item_vec, &fmt).unknown_error()?;
339+
let list_str = write_list(&item_vec, &fmt)?;
340340
let mut prefix = format!("{binder}{const_}{immovable}{coro}{mover}|{list_str}|");
341341

342342
if !ret_str.is_empty() {

src/expr.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1677,7 +1677,6 @@ fn rewrite_struct_lit<'a>(
16771677
v_shape.sub_width(1).max_width_error(v_shape.width, span)?,
16781678
0,
16791679
)
1680-
.unknown_error()
16811680
}
16821681
StructLitField::Base(expr) => {
16831682
// 2 = ..
@@ -1719,7 +1718,7 @@ fn rewrite_struct_lit<'a>(
17191718
force_no_trailing_comma || has_base_or_rest || !context.use_block_indent(),
17201719
);
17211720

1722-
write_list(&item_vec, &fmt).unknown_error()?
1721+
write_list(&item_vec, &fmt)?
17231722
};
17241723

17251724
let fields_str =
@@ -1868,7 +1867,7 @@ fn rewrite_tuple_in_visual_indent_style<'a, T: 'a + IntoOverflowableItem<'a>>(
18681867
let fmt = ListFormatting::new(nested_shape, context.config)
18691868
.tactic(tactic)
18701869
.ends_with_newline(false);
1871-
let list_str = write_list(&item_vec, &fmt)?;
1870+
let list_str = write_list(&item_vec, &fmt).ok()?;
18721871

18731872
Some(format!("({list_str})"))
18741873
}

src/imports.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ fn rewrite_nested_use_tree(
993993
};
994994
for use_tree in use_tree_list {
995995
if let Some(mut list_item) = use_tree.list_item.clone() {
996-
list_item.item = use_tree.rewrite(context, nested_shape);
996+
list_item.item = use_tree.rewrite_result(context, nested_shape);
997997
list_items.push(list_item);
998998
} else {
999999
list_items.push(ListItem::from_str(use_tree.rewrite(context, nested_shape)?));
@@ -1032,7 +1032,7 @@ fn rewrite_nested_use_tree(
10321032
.preserve_newline(true)
10331033
.nested(has_nested_list);
10341034

1035-
let list_str = write_list(&list_items, &fmt)?;
1035+
let list_str = write_list(&list_items, &fmt).ok()?;
10361036

10371037
let result = if (list_str.contains('\n')
10381038
|| list_str.len() > remaining_width

src/items.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ impl<'a> FmtVisitor<'a> {
653653
.trailing_separator(self.config.trailing_comma())
654654
.preserve_newline(true);
655655

656-
let list = write_list(&items, &fmt)?;
656+
let list = write_list(&items, &fmt).ok()?;
657657
result.push_str(&list);
658658
result.push_str(&original_offset.to_string_with_newline(self.config));
659659
result.push('}');
@@ -2819,7 +2819,7 @@ fn rewrite_params(
28192819
.trailing_separator(trailing_separator)
28202820
.ends_with_newline(tactic.ends_with_newline(context.config.indent_style()))
28212821
.preserve_newline(true);
2822-
write_list(&param_items, &fmt)
2822+
write_list(&param_items, &fmt).ok()
28232823
}
28242824

28252825
fn compute_budgets_for_params(
@@ -3076,7 +3076,7 @@ fn rewrite_bounds_on_where_clause(
30763076
.tactic(shape_tactic)
30773077
.trailing_separator(comma_tactic)
30783078
.preserve_newline(preserve_newline);
3079-
write_list(&items.collect::<Vec<_>>(), &fmt)
3079+
write_list(&items.collect::<Vec<_>>(), &fmt).ok()
30803080
}
30813081

30823082
fn rewrite_where_clause(
@@ -3152,7 +3152,7 @@ fn rewrite_where_clause(
31523152
.trailing_separator(comma_tactic)
31533153
.ends_with_newline(tactic.ends_with_newline(context.config.indent_style()))
31543154
.preserve_newline(true);
3155-
let preds_str = write_list(&item_vec, &fmt)?;
3155+
let preds_str = write_list(&item_vec, &fmt).ok()?;
31563156

31573157
let end_length = if terminator == "{" {
31583158
// If the brace is on the next line we don't need to count it otherwise it needs two

src/lists.rs

+24-17
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use rustc_span::BytePos;
88
use crate::comment::{find_comment_end, rewrite_comment, FindUncommented};
99
use crate::config::lists::*;
1010
use crate::config::{Config, IndentStyle};
11-
use crate::rewrite::{RewriteContext, RewriteResult};
11+
use crate::rewrite::{RewriteContext, RewriteError, RewriteErrorExt, RewriteResult};
1212
use crate::shape::{Indent, Shape};
1313
use crate::utils::{
1414
count_newlines, first_line_width, last_line_width, mk_sp, starts_with_newline,
@@ -125,18 +125,18 @@ pub(crate) struct ListItem {
125125
pub(crate) pre_comment_style: ListItemCommentStyle,
126126
// Item should include attributes and doc comments. None indicates a failed
127127
// rewrite.
128-
pub(crate) item: Option<String>,
128+
pub(crate) item: RewriteResult,
129129
pub(crate) post_comment: Option<String>,
130130
// Whether there is extra whitespace before this item.
131131
pub(crate) new_lines: bool,
132132
}
133133

134134
impl ListItem {
135-
pub(crate) fn empty() -> ListItem {
135+
pub(crate) fn from_item(item: RewriteResult) -> ListItem {
136136
ListItem {
137137
pre_comment: None,
138138
pre_comment_style: ListItemCommentStyle::None,
139-
item: None,
139+
item: item,
140140
post_comment: None,
141141
new_lines: false,
142142
}
@@ -185,7 +185,7 @@ impl ListItem {
185185
ListItem {
186186
pre_comment: None,
187187
pre_comment_style: ListItemCommentStyle::None,
188-
item: Some(s.into()),
188+
item: Ok(s.into()),
189189
post_comment: None,
190190
new_lines: false,
191191
}
@@ -197,7 +197,11 @@ impl ListItem {
197197
!matches!(*s, Some(ref s) if !s.is_empty())
198198
}
199199

200-
!(empty(&self.pre_comment) && empty(&self.item) && empty(&self.post_comment))
200+
fn empty_result(s: &RewriteResult) -> bool {
201+
!matches!(*s, Ok(ref s) if !s.is_empty())
202+
}
203+
204+
!(empty(&self.pre_comment) && empty_result(&self.item) && empty(&self.post_comment))
201205
}
202206
}
203207

@@ -257,7 +261,7 @@ where
257261
}
258262

259263
// Format a list of commented items into a string.
260-
pub(crate) fn write_list<I, T>(items: I, formatting: &ListFormatting<'_>) -> Option<String>
264+
pub(crate) fn write_list<I, T>(items: I, formatting: &ListFormatting<'_>) -> RewriteResult
261265
where
262266
I: IntoIterator<Item = T> + Clone,
263267
T: AsRef<ListItem>,
@@ -281,8 +285,7 @@ where
281285
let indent_str = &formatting.shape.indent.to_string(formatting.config);
282286
while let Some((i, item)) = iter.next() {
283287
let item = item.as_ref();
284-
// TODO here Is it possible to 실제로 list item이 없으면..
285-
let inner_item = item.item.as_ref()?;
288+
let inner_item = item.item.as_ref().or_else(|err| Err(err.clone()))?;
286289
let first = i == 0;
287290
let last = iter.peek().is_none();
288291
let mut separate = match sep_place {
@@ -363,8 +366,8 @@ where
363366
// Block style in non-vertical mode.
364367
let block_mode = tactic == DefinitiveListTactic::Horizontal;
365368
// Width restriction is only relevant in vertical mode.
366-
let comment =
367-
rewrite_comment(comment, block_mode, formatting.shape, formatting.config)?;
369+
let comment = rewrite_comment(comment, block_mode, formatting.shape, formatting.config)
370+
.unknown_error()?;
368371
result.push_str(&comment);
369372

370373
if !inner_item.is_empty() {
@@ -410,7 +413,8 @@ where
410413
true,
411414
Shape::legacy(formatting.shape.width, Indent::empty()),
412415
formatting.config,
413-
)?;
416+
)
417+
.unknown_error()?;
414418

415419
result.push(' ');
416420
result.push_str(&formatted_comment);
@@ -461,7 +465,8 @@ where
461465
)
462466
};
463467

464-
let mut formatted_comment = rewrite_post_comment(&mut item_max_width)?;
468+
let mut formatted_comment =
469+
rewrite_post_comment(&mut item_max_width).unknown_error()?;
465470

466471
if !starts_with_newline(comment) {
467472
if formatting.align_comments {
@@ -474,7 +479,8 @@ where
474479
> formatting.config.max_width()
475480
{
476481
item_max_width = None;
477-
formatted_comment = rewrite_post_comment(&mut item_max_width)?;
482+
formatted_comment =
483+
rewrite_post_comment(&mut item_max_width).unknown_error()?;
478484
comment_alignment =
479485
post_comment_alignment(item_max_width, unicode_str_width(inner_item));
480486
}
@@ -517,7 +523,7 @@ where
517523
prev_item_is_nested_import = inner_item.contains("::");
518524
}
519525

520-
Some(result)
526+
Ok(result)
521527
}
522528

523529
fn max_width_of_item_with_post_comment<I, T>(
@@ -776,10 +782,11 @@ where
776782
ListItem {
777783
pre_comment,
778784
pre_comment_style,
785+
// leave_last is set to true only for rewrite_items
779786
item: if self.inner.peek().is_none() && self.leave_last {
780-
None
787+
Err(RewriteError::SkipFormatting)
781788
} else {
782-
(self.get_item_string)(&item).ok()
789+
(self.get_item_string)(&item)
783790
},
784791
post_comment,
785792
new_lines,

src/macros.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,8 @@ pub(crate) fn rewrite_macro_def(
477477
}
478478

479479
match write_list(&branch_items, &fmt) {
480-
Some(ref s) => result += s,
481-
None => return snippet,
480+
Ok(ref s) => result += s,
481+
Err(_) => return snippet,
482482
}
483483

484484
if multi_branch_style {

src/matches.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ fn rewrite_match_arms(
236236
.separator("")
237237
.preserve_newline(true);
238238

239-
write_list(&arms_vec, &fmt).unknown_error()
239+
write_list(&arms_vec, &fmt)
240240
}
241241

242242
fn rewrite_match_arm(

src/overflow.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::lists::{
1919
};
2020
use crate::macros::MacroArg;
2121
use crate::patterns::{can_be_overflowed_pat, TuplePatField};
22-
use crate::rewrite::{Rewrite, RewriteContext};
22+
use crate::rewrite::{Rewrite, RewriteContext, RewriteErrorExt};
2323
use crate::shape::Shape;
2424
use crate::source_map::SpanUtils;
2525
use crate::spanned::Spanned;
@@ -456,7 +456,7 @@ impl<'a> Context<'a> {
456456

457457
if let Some(rewrite) = rewrite {
458458
// splitn(2, *).next().unwrap() is always safe.
459-
let rewrite_first_line = Some(rewrite.splitn(2, '\n').next().unwrap().to_owned());
459+
let rewrite_first_line = Ok(rewrite.splitn(2, '\n').next().unwrap().to_owned());
460460
last_list_item.item = rewrite_first_line;
461461
Some(rewrite)
462462
} else {
@@ -544,22 +544,23 @@ impl<'a> Context<'a> {
544544
.and_then(|last_item| last_item.rewrite(self.context, self.nested_shape));
545545
let no_newline = rw.as_ref().map_or(false, |s| !s.contains('\n'));
546546
if no_newline {
547-
list_items[self.items.len() - 1].item = rw;
547+
list_items[self.items.len() - 1].item = rw.unknown_error();
548548
} else {
549-
list_items[self.items.len() - 1].item = Some(overflowed.to_owned());
549+
list_items[self.items.len() - 1].item = Ok(overflowed.to_owned());
550550
}
551551
} else {
552-
list_items[self.items.len() - 1].item = Some(overflowed.to_owned());
552+
list_items[self.items.len() - 1].item = Ok(overflowed.to_owned());
553553
}
554554
}
555555
(true, DefinitiveListTactic::Horizontal, placeholder @ Some(..)) => {
556-
list_items[self.items.len() - 1].item = placeholder;
556+
list_items[self.items.len() - 1].item = placeholder.unknown_error();
557557
}
558558
_ if !self.items.is_empty() => {
559559
list_items[self.items.len() - 1].item = self
560560
.items
561561
.last()
562-
.and_then(|last_item| last_item.rewrite(self.context, self.nested_shape));
562+
.and_then(|last_item| last_item.rewrite(self.context, self.nested_shape))
563+
.unknown_error();
563564

564565
// Use horizontal layout for a function with a single argument as long as
565566
// everything fits in a single line.
@@ -656,6 +657,7 @@ impl<'a> Context<'a> {
656657
.ends_with_newline(ends_with_newline);
657658

658659
write_list(&list_items, &fmt)
660+
.ok()
659661
.map(|items_str| (tactic == DefinitiveListTactic::Horizontal, items_str))
660662
}
661663

src/patterns.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl Rewrite for Pat {
101101
.separator(" |")
102102
.separator_place(context.config.binop_separator())
103103
.ends_with_newline(false);
104-
write_list(&items, &fmt)
104+
write_list(&items, &fmt).ok()
105105
}
106106
PatKind::Box(ref pat) => rewrite_unary_prefix(context, "box ", &**pat, shape),
107107
PatKind::Ident(BindingMode(by_ref, mutability), ident, ref sub_pat) => {
@@ -354,7 +354,7 @@ fn rewrite_struct_pat(
354354
let nested_shape = shape_for_tactic(tactic, h_shape, v_shape);
355355
let fmt = struct_lit_formatting(nested_shape, tactic, context, false);
356356

357-
let mut fields_str = write_list(&item_vec, &fmt).unknown_error()?;
357+
let mut fields_str = write_list(&item_vec, &fmt)?;
358358
let one_line_width = h_shape.map_or(0, |shape| shape.width);
359359

360360
let has_trailing_comma = fmt.needs_trailing_separator();
@@ -561,7 +561,7 @@ fn count_wildcard_suffix_len(
561561
for item in items
562562
.iter()
563563
.rev()
564-
.take_while(|i| matches!(i.item, Some(ref internal_string) if internal_string == "_"))
564+
.take_while(|i| matches!(i.item, Ok(ref internal_string) if internal_string == "_"))
565565
{
566566
suffix_len += 1;
567567

src/reorder.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fn wrap_reorderable_items(
5959
let fmt = ListFormatting::new(shape, context.config)
6060
.separator("")
6161
.align_comments(false);
62-
write_list(list_items, &fmt)
62+
write_list(list_items, &fmt).ok()
6363
}
6464

6565
fn rewrite_reorderable_item(
@@ -131,9 +131,18 @@ fn rewrite_reorderable_or_regroupable_items(
131131
.map(|use_group| {
132132
let item_vec: Vec<_> = use_group
133133
.into_iter()
134-
.map(|use_tree| ListItem {
135-
item: use_tree.rewrite_top_level(context, nested_shape),
136-
..use_tree.list_item.unwrap_or_else(ListItem::empty)
134+
.map(|use_tree| {
135+
let item = use_tree
136+
.rewrite_top_level(context, nested_shape)
137+
.unknown_error();
138+
if let Some(list_item) = use_tree.list_item {
139+
ListItem {
140+
item: item,
141+
..list_item
142+
}
143+
} else {
144+
ListItem::from_item(item)
145+
}
137146
})
138147
.collect();
139148
wrap_reorderable_items(context, &item_vec, nested_shape)

src/rewrite.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ impl<T: Rewrite> Rewrite for ptr::P<T> {
3030
}
3131
}
3232

33-
#[derive(Error, Debug)]
33+
#[derive(Clone, Error, Debug)]
3434
pub(crate) enum RewriteError {
3535
#[error("Formatting was skipped due to skip attribute or out of file range.")]
3636
SkipFormatting,

src/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ where
407407
.trailing_separator(trailing_separator)
408408
.ends_with_newline(tactic.ends_with_newline(context.config.indent_style()))
409409
.preserve_newline(true);
410-
(write_list(&item_vec, &fmt).unknown_error()?, tactic)
410+
(write_list(&item_vec, &fmt)?, tactic)
411411
};
412412

413413
let args = if tactic == DefinitiveListTactic::Horizontal

0 commit comments

Comments
 (0)