@@ -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
28352845fn 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
28942904fn 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
29282938fn 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
33673377impl 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