Skip to content

Commit b40c3cc

Browse files
ding-youngytmimi
authored andcommitted
impl rewrite_result for ForeignItem
1 parent 2639370 commit b40c3cc

File tree

2 files changed

+76
-58
lines changed

2 files changed

+76
-58
lines changed

Diff for: src/items.rs

+66-52
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ impl<'a> FmtVisitor<'a> {
433433

434434
let mut fn_brace_style = newline_for_brace(self.config, &fn_sig.generics.where_clause);
435435
let (result, _, force_newline_brace) =
436-
rewrite_fn_base(&context, indent, ident, fn_sig, span, fn_brace_style)?;
436+
rewrite_fn_base(&context, indent, ident, fn_sig, span, fn_brace_style).ok()?;
437437

438438
// 2 = ` {`
439439
if self.config.brace_style() == BraceStyle::AlwaysNextLine
@@ -454,7 +454,7 @@ impl<'a> FmtVisitor<'a> {
454454
vis: &ast::Visibility,
455455
generics: &ast::Generics,
456456
span: Span,
457-
) -> Option<String> {
457+
) -> RewriteResult {
458458
// Drop semicolon or it will be interpreted as comment.
459459
let span = mk_sp(span.lo(), span.hi() - BytePos(1));
460460
let context = self.get_context();
@@ -476,7 +476,7 @@ impl<'a> FmtVisitor<'a> {
476476
// Re-attach semicolon
477477
result.push(';');
478478

479-
Some(result)
479+
Ok(result)
480480
}
481481

482482
pub(crate) fn single_line_fn(
@@ -977,7 +977,7 @@ fn format_impl_ref_and_type(
977977
0,
978978
)?
979979
};
980-
let generics_str = rewrite_generics(context, "impl", generics, shape)?;
980+
let generics_str = rewrite_generics(context, "impl", generics, shape).ok()?;
981981
result.push_str(&generics_str);
982982
result.push_str(format_constness_right(constness));
983983

@@ -1185,7 +1185,7 @@ pub(crate) fn format_trait(
11851185

11861186
let shape = Shape::indented(offset, context.config).offset_left(result.len())?;
11871187
let generics_str =
1188-
rewrite_generics(context, rewrite_ident(context, item.ident), generics, shape)?;
1188+
rewrite_generics(context, rewrite_ident(context, item.ident), generics, shape).ok()?;
11891189
result.push_str(&generics_str);
11901190

11911191
// FIXME(#2055): rustfmt fails to format when there are comments between trait bounds.
@@ -1386,7 +1386,7 @@ pub(crate) fn format_trait_alias(
13861386
let alias = rewrite_ident(context, ident);
13871387
// 6 = "trait ", 2 = " ="
13881388
let g_shape = shape.offset_left(6)?.sub_width(2)?;
1389-
let generics_str = rewrite_generics(context, alias, generics, g_shape)?;
1389+
let generics_str = rewrite_generics(context, alias, generics, g_shape).ok()?;
13901390
let vis_str = format_visibility(context, vis);
13911391
let lhs = format!("{vis_str}trait {generics_str} =");
13921392
// 1 = ";"
@@ -1613,7 +1613,7 @@ fn format_tuple_struct(
16131613
Some(generics) => {
16141614
let budget = context.budget(last_line_width(&header_str));
16151615
let shape = Shape::legacy(budget, offset);
1616-
let generics_str = rewrite_generics(context, "", generics, shape)?;
1616+
let generics_str = rewrite_generics(context, "", generics, shape).ok()?;
16171617
result.push_str(&generics_str);
16181618

16191619
let where_budget = context.budget(last_line_width(&result));
@@ -1700,7 +1700,7 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
17001700
indent: Indent,
17011701
visitor_kind: &ItemVisitorKind<'b>,
17021702
span: Span,
1703-
) -> Option<String> {
1703+
) -> RewriteResult {
17041704
use ItemVisitorKind::*;
17051705

17061706
let ast::TyAlias {
@@ -1738,8 +1738,8 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
17381738
rewrite_ty(rw_info, Some(bounds), ty_opt, vis)
17391739
}?;
17401740
match defaultness {
1741-
ast::Defaultness::Default(..) => Some(format!("default {result}")),
1742-
_ => Some(result),
1741+
ast::Defaultness::Default(..) => Ok(format!("default {result}")),
1742+
_ => Ok(result),
17431743
}
17441744
}
17451745
}
@@ -1750,15 +1750,15 @@ fn rewrite_ty<R: Rewrite>(
17501750
generic_bounds_opt: Option<&ast::GenericBounds>,
17511751
rhs: Option<&R>,
17521752
vis: &ast::Visibility,
1753-
) -> Option<String> {
1753+
) -> RewriteResult {
17541754
let mut result = String::with_capacity(128);
17551755
let TyAliasRewriteInfo(context, indent, generics, where_clauses, ident, span) = *rw_info;
17561756
let (before_where_predicates, after_where_predicates) = generics
17571757
.where_clause
17581758
.predicates
17591759
.split_at(where_clauses.split);
17601760
if !after_where_predicates.is_empty() {
1761-
return None;
1761+
return Err(RewriteError::Unknown);
17621762
}
17631763
result.push_str(&format!("{}type ", format_visibility(context, vis)));
17641764
let ident_str = rewrite_ident(context, ident);
@@ -1767,18 +1767,25 @@ fn rewrite_ty<R: Rewrite>(
17671767
result.push_str(ident_str)
17681768
} else {
17691769
// 2 = `= `
1770-
let g_shape = Shape::indented(indent, context.config)
1771-
.offset_left(result.len())?
1772-
.sub_width(2)?;
1770+
let g_shape = Shape::indented(indent, context.config);
1771+
let g_shape = g_shape
1772+
.offset_left(result.len())
1773+
.and_then(|s| s.sub_width(2))
1774+
.max_width_error(g_shape.width, span)?;
17731775
let generics_str = rewrite_generics(context, ident_str, generics, g_shape)?;
17741776
result.push_str(&generics_str);
17751777
}
17761778

17771779
if let Some(bounds) = generic_bounds_opt {
17781780
if !bounds.is_empty() {
17791781
// 2 = `: `
1780-
let shape = Shape::indented(indent, context.config).offset_left(result.len() + 2)?;
1781-
let type_bounds = bounds.rewrite(context, shape).map(|s| format!(": {}", s))?;
1782+
let shape = Shape::indented(indent, context.config);
1783+
let shape = shape
1784+
.offset_left(result.len() + 2)
1785+
.max_width_error(shape.width, span)?;
1786+
let type_bounds = bounds
1787+
.rewrite_result(context, shape)
1788+
.map(|s| format!(": {}", s))?;
17821789
result.push_str(&type_bounds);
17831790
}
17841791
}
@@ -1799,8 +1806,7 @@ fn rewrite_ty<R: Rewrite>(
17991806
None,
18001807
generics.span.hi(),
18011808
option,
1802-
)
1803-
.ok()?;
1809+
)?;
18041810
result.push_str(&where_clause_str);
18051811

18061812
if let Some(ty) = rhs {
@@ -1820,13 +1826,20 @@ fn rewrite_ty<R: Rewrite>(
18201826

18211827
let lhs = match comment_span {
18221828
Some(comment_span)
1823-
if contains_comment(context.snippet_provider.span_to_snippet(comment_span)?) =>
1829+
if contains_comment(
1830+
context
1831+
.snippet_provider
1832+
.span_to_snippet(comment_span)
1833+
.unknown_error()?,
1834+
) =>
18241835
{
18251836
let comment_shape = if has_where {
18261837
Shape::indented(indent, context.config)
18271838
} else {
1828-
Shape::indented(indent, context.config)
1829-
.block_left(context.config.tab_spaces())?
1839+
let shape = Shape::indented(indent, context.config);
1840+
shape
1841+
.block_left(context.config.tab_spaces())
1842+
.max_width_error(shape.width, span)?
18301843
};
18311844

18321845
combine_strs_with_missing_comments(
@@ -1836,19 +1849,17 @@ fn rewrite_ty<R: Rewrite>(
18361849
comment_span,
18371850
comment_shape,
18381851
true,
1839-
)
1840-
.ok()?
1852+
)?
18411853
}
18421854
_ => format!("{result}="),
18431855
};
18441856

18451857
// 1 = `;`
1846-
let shape = Shape::indented(indent, context.config).sub_width(1)?;
1847-
rewrite_assign_rhs(context, lhs, &*ty, &RhsAssignKind::Ty, shape)
1848-
.map(|s| s + ";")
1849-
.ok()
1858+
let shape = Shape::indented(indent, context.config);
1859+
let shape = shape.sub_width(1).max_width_error(shape.width, span)?;
1860+
rewrite_assign_rhs(context, lhs, &*ty, &RhsAssignKind::Ty, shape).map(|s| s + ";")
18501861
} else {
1851-
Some(format!("{result};"))
1862+
Ok(format!("{result};"))
18521863
}
18531864
}
18541865

@@ -2392,7 +2403,7 @@ fn rewrite_fn_base(
23922403
fn_sig: &FnSig<'_>,
23932404
span: Span,
23942405
fn_brace_style: FnBraceStyle,
2395-
) -> Option<(String, bool, bool)> {
2406+
) -> Result<(String, bool, bool), RewriteError> {
23962407
let mut force_new_line_for_brace = false;
23972408

23982409
let where_clause = &fn_sig.generics.where_clause;
@@ -2436,7 +2447,7 @@ fn rewrite_fn_base(
24362447
// return type later anyway.
24372448
let ret_str = fd
24382449
.output
2439-
.rewrite(context, Shape::indented(indent, context.config))?;
2450+
.rewrite_result(context, Shape::indented(indent, context.config))?;
24402451

24412452
let multi_line_ret_str = ret_str.contains('\n');
24422453
let ret_str_len = if multi_line_ret_str { 0 } else { ret_str.len() };
@@ -2449,7 +2460,7 @@ fn rewrite_fn_base(
24492460
ret_str_len,
24502461
fn_brace_style,
24512462
multi_line_ret_str,
2452-
)?;
2463+
);
24532464

24542465
debug!(
24552466
"rewrite_fn_base: one_line_budget: {}, multi_line_budget: {}, param_indent: {:?}",
@@ -2611,7 +2622,7 @@ fn rewrite_fn_base(
26112622
if multi_line_ret_str || ret_should_indent {
26122623
// Now that we know the proper indent and width, we need to
26132624
// re-layout the return type.
2614-
let ret_str = fd.output.rewrite(context, ret_shape)?;
2625+
let ret_str = fd.output.rewrite_result(context, ret_shape)?;
26152626
result.push_str(&ret_str);
26162627
} else {
26172628
result.push_str(&ret_str);
@@ -2671,8 +2682,7 @@ fn rewrite_fn_base(
26712682
Some(span.hi()),
26722683
pos_before_where,
26732684
option,
2674-
)
2675-
.ok()?;
2685+
)?;
26762686
// If there are neither where-clause nor return type, we may be missing comments between
26772687
// params and `{`.
26782688
if where_clause_str.is_empty() {
@@ -2699,7 +2709,7 @@ fn rewrite_fn_base(
26992709
force_new_line_for_brace |= ends_with_comment;
27002710
force_new_line_for_brace |=
27012711
is_params_multi_lined && context.config.where_single_line() && !where_clause_str.is_empty();
2702-
Some((result, ends_with_comment, force_new_line_for_brace))
2712+
Ok((result, ends_with_comment, force_new_line_for_brace))
27032713
}
27042714

27052715
/// Kind of spaces to put before `where`.
@@ -2770,7 +2780,7 @@ fn rewrite_params(
27702780
param_indent: Indent,
27712781
span: Span,
27722782
variadic: bool,
2773-
) -> Option<String> {
2783+
) -> RewriteResult {
27742784
if params.is_empty() {
27752785
let comment = context
27762786
.snippet(mk_sp(
@@ -2779,7 +2789,7 @@ fn rewrite_params(
27792789
span.hi() - BytePos(1),
27802790
))
27812791
.trim();
2782-
return Some(comment.to_owned());
2792+
return Ok(comment.to_owned());
27832793
}
27842794
let param_items: Vec<_> = itemize_list(
27852795
context.snippet_provider,
@@ -2829,7 +2839,7 @@ fn rewrite_params(
28292839
.trailing_separator(trailing_separator)
28302840
.ends_with_newline(tactic.ends_with_newline(context.config.indent_style()))
28312841
.preserve_newline(true);
2832-
write_list(&param_items, &fmt).ok()
2842+
write_list(&param_items, &fmt)
28332843
}
28342844

28352845
fn compute_budgets_for_params(
@@ -2839,7 +2849,7 @@ fn compute_budgets_for_params(
28392849
ret_str_len: usize,
28402850
fn_brace_style: FnBraceStyle,
28412851
force_vertical_layout: bool,
2842-
) -> Option<(usize, usize, Indent)> {
2852+
) -> (usize, usize, Indent) {
28432853
debug!(
28442854
"compute_budgets_for_params {} {:?}, {}, {:?}",
28452855
result.len(),
@@ -2876,7 +2886,7 @@ fn compute_budgets_for_params(
28762886
}
28772887
};
28782888

2879-
return Some((one_line_budget, multi_line_budget, indent));
2889+
return (one_line_budget, multi_line_budget, indent);
28802890
}
28812891
}
28822892

@@ -2888,7 +2898,7 @@ fn compute_budgets_for_params(
28882898
// Account for `)` and possibly ` {`.
28892899
IndentStyle::Visual => new_indent.width() + if ret_str_len == 0 { 1 } else { 3 },
28902900
};
2891-
Some((0, context.budget(used_space), new_indent))
2901+
(0, context.budget(used_space), new_indent)
28922902
}
28932903

28942904
fn newline_for_brace(config: &Config, where_clause: &ast::WhereClause) -> FnBraceStyle {
@@ -2913,16 +2923,16 @@ fn rewrite_generics(
29132923
ident: &str,
29142924
generics: &ast::Generics,
29152925
shape: Shape,
2916-
) -> Option<String> {
2926+
) -> RewriteResult {
29172927
// FIXME: convert bounds to where-clauses where they get too big or if
29182928
// there is a where-clause at all.
29192929

29202930
if generics.params.is_empty() {
2921-
return Some(ident.to_owned());
2931+
return Ok(ident.to_owned());
29222932
}
29232933

29242934
let params = generics.params.iter();
2925-
overflow::rewrite_with_angle_brackets(context, ident, params, shape, generics.span).ok()
2935+
overflow::rewrite_with_angle_brackets(context, ident, params, shape, generics.span)
29262936
}
29272937

29282938
fn generics_shape_from_config(config: &Config, shape: Shape, offset: usize) -> Option<Shape> {
@@ -3272,7 +3282,7 @@ fn format_generics(
32723282
used_width: usize,
32733283
) -> Option<String> {
32743284
let shape = Shape::legacy(context.budget(used_width + offset.width()), offset);
3275-
let mut result = rewrite_generics(context, "", generics, shape)?;
3285+
let mut result = rewrite_generics(context, "", generics, shape).ok()?;
32763286

32773287
// If the generics are not parameterized then generics.span.hi() == 0,
32783288
// so we use span.lo(), which is the position after `struct Foo`.
@@ -3366,7 +3376,11 @@ fn format_generics(
33663376

33673377
impl Rewrite for ast::ForeignItem {
33683378
fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
3369-
let attrs_str = self.attrs.rewrite(context, shape)?;
3379+
self.rewrite_result(context, shape).ok()
3380+
}
3381+
3382+
fn rewrite_result(&self, context: &RewriteContext<'_>, shape: Shape) -> RewriteResult {
3383+
let attrs_str = self.attrs.rewrite_result(context, shape)?;
33703384
// Drop semicolon or it will be interpreted as comment.
33713385
// FIXME: this may be a faulty span from libsyntax.
33723386
let span = mk_sp(self.span.lo(), self.span.hi() - BytePos(1));
@@ -3399,7 +3413,7 @@ impl Rewrite for ast::ForeignItem {
33993413
defaultness,
34003414
Some(&inner_attrs),
34013415
);
3402-
Some(visitor.buffer.to_owned())
3416+
Ok(visitor.buffer.to_owned())
34033417
} else {
34043418
rewrite_fn_base(
34053419
context,
@@ -3431,17 +3445,18 @@ impl Rewrite for ast::ForeignItem {
34313445
prefix,
34323446
&static_foreign_item.ty,
34333447
&RhsAssignKind::Ty,
3434-
shape.sub_width(1)?,
3448+
shape
3449+
.sub_width(1)
3450+
.max_width_error(shape.width, static_foreign_item.ty.span)?,
34353451
)
34363452
.map(|s| s + ";")
3437-
.ok()
34383453
}
34393454
ast::ForeignItemKind::TyAlias(ref ty_alias) => {
34403455
let (kind, span) = (&ItemVisitorKind::ForeignItem(self), self.span);
34413456
rewrite_type_alias(ty_alias, context, shape.indent, kind, span)
34423457
}
34433458
ast::ForeignItemKind::MacCall(ref mac) => {
3444-
rewrite_macro(mac, None, context, shape, MacroPosition::Item).ok()
3459+
rewrite_macro(mac, None, context, shape, MacroPosition::Item)
34453460
}
34463461
}?;
34473462

@@ -3458,7 +3473,6 @@ impl Rewrite for ast::ForeignItem {
34583473
shape,
34593474
false,
34603475
)
3461-
.ok()
34623476
}
34633477
}
34643478

0 commit comments

Comments
 (0)