Skip to content

Commit 397a9a9

Browse files
committed
impl rewrite_result for ForeignItem
1 parent 6fb0210 commit 397a9a9

File tree

2 files changed

+76
-58
lines changed

2 files changed

+76
-58
lines changed

src/items.rs

Lines changed: 66 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ impl<'a> FmtVisitor<'a> {
434434

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

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

480-
Some(result)
480+
Ok(result)
481481
}
482482

483483
pub(crate) fn single_line_fn(
@@ -978,7 +978,7 @@ fn format_impl_ref_and_type(
978978
0,
979979
)?
980980
};
981-
let generics_str = rewrite_generics(context, "impl", generics, shape)?;
981+
let generics_str = rewrite_generics(context, "impl", generics, shape).ok()?;
982982
result.push_str(&generics_str);
983983
result.push_str(format_constness_right(constness));
984984

@@ -1186,7 +1186,7 @@ pub(crate) fn format_trait(
11861186

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

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

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

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

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

18071813
if let Some(ty) = rhs {
@@ -1821,13 +1827,20 @@ fn rewrite_ty<R: Rewrite>(
18211827

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

18331846
combine_strs_with_missing_comments(
@@ -1837,19 +1850,17 @@ fn rewrite_ty<R: Rewrite>(
18371850
comment_span,
18381851
comment_shape,
18391852
true,
1840-
)
1841-
.ok()?
1853+
)?
18421854
}
18431855
_ => format!("{result}="),
18441856
};
18451857

18461858
// 1 = `;`
1847-
let shape = Shape::indented(indent, context.config).sub_width(1)?;
1848-
rewrite_assign_rhs(context, lhs, &*ty, &RhsAssignKind::Ty, shape)
1849-
.map(|s| s + ";")
1850-
.ok()
1859+
let shape = Shape::indented(indent, context.config);
1860+
let shape = shape.sub_width(1).max_width_error(shape.width, span)?;
1861+
rewrite_assign_rhs(context, lhs, &*ty, &RhsAssignKind::Ty, shape).map(|s| s + ";")
18511862
} else {
1852-
Some(format!("{result};"))
1863+
Ok(format!("{result};"))
18531864
}
18541865
}
18551866

@@ -2393,7 +2404,7 @@ fn rewrite_fn_base(
23932404
fn_sig: &FnSig<'_>,
23942405
span: Span,
23952406
fn_brace_style: FnBraceStyle,
2396-
) -> Option<(String, bool, bool)> {
2407+
) -> Result<(String, bool, bool), RewriteError> {
23972408
let mut force_new_line_for_brace = false;
23982409

23992410
let where_clause = &fn_sig.generics.where_clause;
@@ -2437,7 +2448,7 @@ fn rewrite_fn_base(
24372448
// return type later anyway.
24382449
let ret_str = fd
24392450
.output
2440-
.rewrite(context, Shape::indented(indent, context.config))?;
2451+
.rewrite_result(context, Shape::indented(indent, context.config))?;
24412452

24422453
let multi_line_ret_str = ret_str.contains('\n');
24432454
let ret_str_len = if multi_line_ret_str { 0 } else { ret_str.len() };
@@ -2450,7 +2461,7 @@ fn rewrite_fn_base(
24502461
ret_str_len,
24512462
fn_brace_style,
24522463
multi_line_ret_str,
2453-
)?;
2464+
);
24542465

24552466
debug!(
24562467
"rewrite_fn_base: one_line_budget: {}, multi_line_budget: {}, param_indent: {:?}",
@@ -2612,7 +2623,7 @@ fn rewrite_fn_base(
26122623
if multi_line_ret_str || ret_should_indent {
26132624
// Now that we know the proper indent and width, we need to
26142625
// re-layout the return type.
2615-
let ret_str = fd.output.rewrite(context, ret_shape)?;
2626+
let ret_str = fd.output.rewrite_result(context, ret_shape)?;
26162627
result.push_str(&ret_str);
26172628
} else {
26182629
result.push_str(&ret_str);
@@ -2672,8 +2683,7 @@ fn rewrite_fn_base(
26722683
Some(span.hi()),
26732684
pos_before_where,
26742685
option,
2675-
)
2676-
.ok()?;
2686+
)?;
26772687
// If there are neither where-clause nor return type, we may be missing comments between
26782688
// params and `{`.
26792689
if where_clause_str.is_empty() {
@@ -2700,7 +2710,7 @@ fn rewrite_fn_base(
27002710
force_new_line_for_brace |= ends_with_comment;
27012711
force_new_line_for_brace |=
27022712
is_params_multi_lined && context.config.where_single_line() && !where_clause_str.is_empty();
2703-
Some((result, ends_with_comment, force_new_line_for_brace))
2713+
Ok((result, ends_with_comment, force_new_line_for_brace))
27042714
}
27052715

27062716
/// Kind of spaces to put before `where`.
@@ -2771,7 +2781,7 @@ fn rewrite_params(
27712781
param_indent: Indent,
27722782
span: Span,
27732783
variadic: bool,
2774-
) -> Option<String> {
2784+
) -> RewriteResult {
27752785
if params.is_empty() {
27762786
let comment = context
27772787
.snippet(mk_sp(
@@ -2780,7 +2790,7 @@ fn rewrite_params(
27802790
span.hi() - BytePos(1),
27812791
))
27822792
.trim();
2783-
return Some(comment.to_owned());
2793+
return Ok(comment.to_owned());
27842794
}
27852795
let param_items: Vec<_> = itemize_list(
27862796
context.snippet_provider,
@@ -2830,7 +2840,7 @@ fn rewrite_params(
28302840
.trailing_separator(trailing_separator)
28312841
.ends_with_newline(tactic.ends_with_newline(context.config.indent_style()))
28322842
.preserve_newline(true);
2833-
write_list(&param_items, &fmt).ok()
2843+
write_list(&param_items, &fmt)
28342844
}
28352845

28362846
fn compute_budgets_for_params(
@@ -2840,7 +2850,7 @@ fn compute_budgets_for_params(
28402850
ret_str_len: usize,
28412851
fn_brace_style: FnBraceStyle,
28422852
force_vertical_layout: bool,
2843-
) -> Option<(usize, usize, Indent)> {
2853+
) -> (usize, usize, Indent) {
28442854
debug!(
28452855
"compute_budgets_for_params {} {:?}, {}, {:?}",
28462856
result.len(),
@@ -2877,7 +2887,7 @@ fn compute_budgets_for_params(
28772887
}
28782888
};
28792889

2880-
return Some((one_line_budget, multi_line_budget, indent));
2890+
return (one_line_budget, multi_line_budget, indent);
28812891
}
28822892
}
28832893

@@ -2889,7 +2899,7 @@ fn compute_budgets_for_params(
28892899
// Account for `)` and possibly ` {`.
28902900
IndentStyle::Visual => new_indent.width() + if ret_str_len == 0 { 1 } else { 3 },
28912901
};
2892-
Some((0, context.budget(used_space), new_indent))
2902+
(0, context.budget(used_space), new_indent)
28932903
}
28942904

28952905
fn newline_for_brace(config: &Config, where_clause: &ast::WhereClause) -> FnBraceStyle {
@@ -2914,16 +2924,16 @@ fn rewrite_generics(
29142924
ident: &str,
29152925
generics: &ast::Generics,
29162926
shape: Shape,
2917-
) -> Option<String> {
2927+
) -> RewriteResult {
29182928
// FIXME: convert bounds to where-clauses where they get too big or if
29192929
// there is a where-clause at all.
29202930

29212931
if generics.params.is_empty() {
2922-
return Some(ident.to_owned());
2932+
return Ok(ident.to_owned());
29232933
}
29242934

29252935
let params = generics.params.iter();
2926-
overflow::rewrite_with_angle_brackets(context, ident, params, shape, generics.span).ok()
2936+
overflow::rewrite_with_angle_brackets(context, ident, params, shape, generics.span)
29272937
}
29282938

29292939
fn generics_shape_from_config(config: &Config, shape: Shape, offset: usize) -> Option<Shape> {
@@ -3273,7 +3283,7 @@ fn format_generics(
32733283
used_width: usize,
32743284
) -> Option<String> {
32753285
let shape = Shape::legacy(context.budget(used_width + offset.width()), offset);
3276-
let mut result = rewrite_generics(context, "", generics, shape)?;
3286+
let mut result = rewrite_generics(context, "", generics, shape).ok()?;
32773287

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

33683378
impl Rewrite for ast::ForeignItem {
33693379
fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
3370-
let attrs_str = self.attrs.rewrite(context, shape)?;
3380+
self.rewrite_result(context, shape).ok()
3381+
}
3382+
3383+
fn rewrite_result(&self, context: &RewriteContext<'_>, shape: Shape) -> RewriteResult {
3384+
let attrs_str = self.attrs.rewrite_result(context, shape)?;
33713385
// Drop semicolon or it will be interpreted as comment.
33723386
// FIXME: this may be a faulty span from libsyntax.
33733387
let span = mk_sp(self.span.lo(), self.span.hi() - BytePos(1));
@@ -3400,7 +3414,7 @@ impl Rewrite for ast::ForeignItem {
34003414
defaultness,
34013415
Some(&inner_attrs),
34023416
);
3403-
Some(visitor.buffer.to_owned())
3417+
Ok(visitor.buffer.to_owned())
34043418
} else {
34053419
rewrite_fn_base(
34063420
context,
@@ -3432,17 +3446,18 @@ impl Rewrite for ast::ForeignItem {
34323446
prefix,
34333447
&static_foreign_item.ty,
34343448
&RhsAssignKind::Ty,
3435-
shape.sub_width(1)?,
3449+
shape
3450+
.sub_width(1)
3451+
.max_width_error(shape.width, static_foreign_item.ty.span)?,
34363452
)
34373453
.map(|s| s + ";")
3438-
.ok()
34393454
}
34403455
ast::ForeignItemKind::TyAlias(ref ty_alias) => {
34413456
let (kind, span) = (&ItemVisitorKind::ForeignItem(self), self.span);
34423457
rewrite_type_alias(ty_alias, context, shape.indent, kind, span)
34433458
}
34443459
ast::ForeignItemKind::MacCall(ref mac) => {
3445-
rewrite_macro(mac, None, context, shape, MacroPosition::Item).ok()
3460+
rewrite_macro(mac, None, context, shape, MacroPosition::Item)
34463461
}
34473462
}?;
34483463

@@ -3459,7 +3474,6 @@ impl Rewrite for ast::ForeignItem {
34593474
shape,
34603475
false,
34613476
)
3462-
.ok()
34633477
}
34643478
}
34653479

0 commit comments

Comments
 (0)