@@ -433,7 +433,7 @@ impl<'a> FmtVisitor<'a> {
433
433
434
434
let mut fn_brace_style = newline_for_brace ( self . config , & fn_sig. generics . where_clause ) ;
435
435
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 ( ) ?;
437
437
438
438
// 2 = ` {`
439
439
if self . config . brace_style ( ) == BraceStyle :: AlwaysNextLine
@@ -454,7 +454,7 @@ impl<'a> FmtVisitor<'a> {
454
454
vis : & ast:: Visibility ,
455
455
generics : & ast:: Generics ,
456
456
span : Span ,
457
- ) -> Option < String > {
457
+ ) -> RewriteResult {
458
458
// Drop semicolon or it will be interpreted as comment.
459
459
let span = mk_sp ( span. lo ( ) , span. hi ( ) - BytePos ( 1 ) ) ;
460
460
let context = self . get_context ( ) ;
@@ -476,7 +476,7 @@ impl<'a> FmtVisitor<'a> {
476
476
// Re-attach semicolon
477
477
result. push ( ';' ) ;
478
478
479
- Some ( result)
479
+ Ok ( result)
480
480
}
481
481
482
482
pub ( crate ) fn single_line_fn (
@@ -977,7 +977,7 @@ fn format_impl_ref_and_type(
977
977
0 ,
978
978
) ?
979
979
} ;
980
- let generics_str = rewrite_generics ( context, "impl" , generics, shape) ?;
980
+ let generics_str = rewrite_generics ( context, "impl" , generics, shape) . ok ( ) ?;
981
981
result. push_str ( & generics_str) ;
982
982
result. push_str ( format_constness_right ( constness) ) ;
983
983
@@ -1185,7 +1185,7 @@ pub(crate) fn format_trait(
1185
1185
1186
1186
let shape = Shape :: indented ( offset, context. config ) . offset_left ( result. len ( ) ) ?;
1187
1187
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 ( ) ?;
1189
1189
result. push_str ( & generics_str) ;
1190
1190
1191
1191
// FIXME(#2055): rustfmt fails to format when there are comments between trait bounds.
@@ -1386,7 +1386,7 @@ pub(crate) fn format_trait_alias(
1386
1386
let alias = rewrite_ident ( context, ident) ;
1387
1387
// 6 = "trait ", 2 = " ="
1388
1388
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 ( ) ?;
1390
1390
let vis_str = format_visibility ( context, vis) ;
1391
1391
let lhs = format ! ( "{vis_str}trait {generics_str} =" ) ;
1392
1392
// 1 = ";"
@@ -1613,7 +1613,7 @@ fn format_tuple_struct(
1613
1613
Some ( generics) => {
1614
1614
let budget = context. budget ( last_line_width ( & header_str) ) ;
1615
1615
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 ( ) ?;
1617
1617
result. push_str ( & generics_str) ;
1618
1618
1619
1619
let where_budget = context. budget ( last_line_width ( & result) ) ;
@@ -1700,7 +1700,7 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
1700
1700
indent : Indent ,
1701
1701
visitor_kind : & ItemVisitorKind < ' b > ,
1702
1702
span : Span ,
1703
- ) -> Option < String > {
1703
+ ) -> RewriteResult {
1704
1704
use ItemVisitorKind :: * ;
1705
1705
1706
1706
let ast:: TyAlias {
@@ -1738,8 +1738,8 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
1738
1738
rewrite_ty ( rw_info, Some ( bounds) , ty_opt, vis)
1739
1739
} ?;
1740
1740
match defaultness {
1741
- ast:: Defaultness :: Default ( ..) => Some ( format ! ( "default {result}" ) ) ,
1742
- _ => Some ( result) ,
1741
+ ast:: Defaultness :: Default ( ..) => Ok ( format ! ( "default {result}" ) ) ,
1742
+ _ => Ok ( result) ,
1743
1743
}
1744
1744
}
1745
1745
}
@@ -1750,15 +1750,15 @@ fn rewrite_ty<R: Rewrite>(
1750
1750
generic_bounds_opt : Option < & ast:: GenericBounds > ,
1751
1751
rhs : Option < & R > ,
1752
1752
vis : & ast:: Visibility ,
1753
- ) -> Option < String > {
1753
+ ) -> RewriteResult {
1754
1754
let mut result = String :: with_capacity ( 128 ) ;
1755
1755
let TyAliasRewriteInfo ( context, indent, generics, where_clauses, ident, span) = * rw_info;
1756
1756
let ( before_where_predicates, after_where_predicates) = generics
1757
1757
. where_clause
1758
1758
. predicates
1759
1759
. split_at ( where_clauses. split ) ;
1760
1760
if !after_where_predicates. is_empty ( ) {
1761
- return None ;
1761
+ return Err ( RewriteError :: Unknown ) ;
1762
1762
}
1763
1763
result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
1764
1764
let ident_str = rewrite_ident ( context, ident) ;
@@ -1767,18 +1767,25 @@ fn rewrite_ty<R: Rewrite>(
1767
1767
result. push_str ( ident_str)
1768
1768
} else {
1769
1769
// 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) ?;
1773
1775
let generics_str = rewrite_generics ( context, ident_str, generics, g_shape) ?;
1774
1776
result. push_str ( & generics_str) ;
1775
1777
}
1776
1778
1777
1779
if let Some ( bounds) = generic_bounds_opt {
1778
1780
if !bounds. is_empty ( ) {
1779
1781
// 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) ) ?;
1782
1789
result. push_str ( & type_bounds) ;
1783
1790
}
1784
1791
}
@@ -1799,8 +1806,7 @@ fn rewrite_ty<R: Rewrite>(
1799
1806
None ,
1800
1807
generics. span . hi ( ) ,
1801
1808
option,
1802
- )
1803
- . ok ( ) ?;
1809
+ ) ?;
1804
1810
result. push_str ( & where_clause_str) ;
1805
1811
1806
1812
if let Some ( ty) = rhs {
@@ -1820,13 +1826,20 @@ fn rewrite_ty<R: Rewrite>(
1820
1826
1821
1827
let lhs = match comment_span {
1822
1828
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
+ ) =>
1824
1835
{
1825
1836
let comment_shape = if has_where {
1826
1837
Shape :: indented ( indent, context. config )
1827
1838
} 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) ?
1830
1843
} ;
1831
1844
1832
1845
combine_strs_with_missing_comments (
@@ -1836,19 +1849,17 @@ fn rewrite_ty<R: Rewrite>(
1836
1849
comment_span,
1837
1850
comment_shape,
1838
1851
true ,
1839
- )
1840
- . ok ( ) ?
1852
+ ) ?
1841
1853
}
1842
1854
_ => format ! ( "{result}=" ) ,
1843
1855
} ;
1844
1856
1845
1857
// 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 + ";" )
1850
1861
} else {
1851
- Some ( format ! ( "{result};" ) )
1862
+ Ok ( format ! ( "{result};" ) )
1852
1863
}
1853
1864
}
1854
1865
@@ -2392,7 +2403,7 @@ fn rewrite_fn_base(
2392
2403
fn_sig : & FnSig < ' _ > ,
2393
2404
span : Span ,
2394
2405
fn_brace_style : FnBraceStyle ,
2395
- ) -> Option < ( String , bool , bool ) > {
2406
+ ) -> Result < ( String , bool , bool ) , RewriteError > {
2396
2407
let mut force_new_line_for_brace = false ;
2397
2408
2398
2409
let where_clause = & fn_sig. generics . where_clause ;
@@ -2436,7 +2447,7 @@ fn rewrite_fn_base(
2436
2447
// return type later anyway.
2437
2448
let ret_str = fd
2438
2449
. output
2439
- . rewrite ( context, Shape :: indented ( indent, context. config ) ) ?;
2450
+ . rewrite_result ( context, Shape :: indented ( indent, context. config ) ) ?;
2440
2451
2441
2452
let multi_line_ret_str = ret_str. contains ( '\n' ) ;
2442
2453
let ret_str_len = if multi_line_ret_str { 0 } else { ret_str. len ( ) } ;
@@ -2449,7 +2460,7 @@ fn rewrite_fn_base(
2449
2460
ret_str_len,
2450
2461
fn_brace_style,
2451
2462
multi_line_ret_str,
2452
- ) ? ;
2463
+ ) ;
2453
2464
2454
2465
debug ! (
2455
2466
"rewrite_fn_base: one_line_budget: {}, multi_line_budget: {}, param_indent: {:?}" ,
@@ -2611,7 +2622,7 @@ fn rewrite_fn_base(
2611
2622
if multi_line_ret_str || ret_should_indent {
2612
2623
// Now that we know the proper indent and width, we need to
2613
2624
// 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) ?;
2615
2626
result. push_str ( & ret_str) ;
2616
2627
} else {
2617
2628
result. push_str ( & ret_str) ;
@@ -2671,8 +2682,7 @@ fn rewrite_fn_base(
2671
2682
Some ( span. hi ( ) ) ,
2672
2683
pos_before_where,
2673
2684
option,
2674
- )
2675
- . ok ( ) ?;
2685
+ ) ?;
2676
2686
// If there are neither where-clause nor return type, we may be missing comments between
2677
2687
// params and `{`.
2678
2688
if where_clause_str. is_empty ( ) {
@@ -2699,7 +2709,7 @@ fn rewrite_fn_base(
2699
2709
force_new_line_for_brace |= ends_with_comment;
2700
2710
force_new_line_for_brace |=
2701
2711
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) )
2703
2713
}
2704
2714
2705
2715
/// Kind of spaces to put before `where`.
@@ -2770,7 +2780,7 @@ fn rewrite_params(
2770
2780
param_indent : Indent ,
2771
2781
span : Span ,
2772
2782
variadic : bool ,
2773
- ) -> Option < String > {
2783
+ ) -> RewriteResult {
2774
2784
if params. is_empty ( ) {
2775
2785
let comment = context
2776
2786
. snippet ( mk_sp (
@@ -2779,7 +2789,7 @@ fn rewrite_params(
2779
2789
span. hi ( ) - BytePos ( 1 ) ,
2780
2790
) )
2781
2791
. trim ( ) ;
2782
- return Some ( comment. to_owned ( ) ) ;
2792
+ return Ok ( comment. to_owned ( ) ) ;
2783
2793
}
2784
2794
let param_items: Vec < _ > = itemize_list (
2785
2795
context. snippet_provider ,
@@ -2829,7 +2839,7 @@ fn rewrite_params(
2829
2839
. trailing_separator ( trailing_separator)
2830
2840
. ends_with_newline ( tactic. ends_with_newline ( context. config . indent_style ( ) ) )
2831
2841
. preserve_newline ( true ) ;
2832
- write_list ( & param_items, & fmt) . ok ( )
2842
+ write_list ( & param_items, & fmt)
2833
2843
}
2834
2844
2835
2845
fn compute_budgets_for_params (
@@ -2839,7 +2849,7 @@ fn compute_budgets_for_params(
2839
2849
ret_str_len : usize ,
2840
2850
fn_brace_style : FnBraceStyle ,
2841
2851
force_vertical_layout : bool ,
2842
- ) -> Option < ( usize , usize , Indent ) > {
2852
+ ) -> ( usize , usize , Indent ) {
2843
2853
debug ! (
2844
2854
"compute_budgets_for_params {} {:?}, {}, {:?}" ,
2845
2855
result. len( ) ,
@@ -2876,7 +2886,7 @@ fn compute_budgets_for_params(
2876
2886
}
2877
2887
} ;
2878
2888
2879
- return Some ( ( one_line_budget, multi_line_budget, indent) ) ;
2889
+ return ( one_line_budget, multi_line_budget, indent) ;
2880
2890
}
2881
2891
}
2882
2892
@@ -2888,7 +2898,7 @@ fn compute_budgets_for_params(
2888
2898
// Account for `)` and possibly ` {`.
2889
2899
IndentStyle :: Visual => new_indent. width ( ) + if ret_str_len == 0 { 1 } else { 3 } ,
2890
2900
} ;
2891
- Some ( ( 0 , context. budget ( used_space) , new_indent) )
2901
+ ( 0 , context. budget ( used_space) , new_indent)
2892
2902
}
2893
2903
2894
2904
fn newline_for_brace ( config : & Config , where_clause : & ast:: WhereClause ) -> FnBraceStyle {
@@ -2913,16 +2923,16 @@ fn rewrite_generics(
2913
2923
ident : & str ,
2914
2924
generics : & ast:: Generics ,
2915
2925
shape : Shape ,
2916
- ) -> Option < String > {
2926
+ ) -> RewriteResult {
2917
2927
// FIXME: convert bounds to where-clauses where they get too big or if
2918
2928
// there is a where-clause at all.
2919
2929
2920
2930
if generics. params . is_empty ( ) {
2921
- return Some ( ident. to_owned ( ) ) ;
2931
+ return Ok ( ident. to_owned ( ) ) ;
2922
2932
}
2923
2933
2924
2934
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 )
2926
2936
}
2927
2937
2928
2938
fn generics_shape_from_config ( config : & Config , shape : Shape , offset : usize ) -> Option < Shape > {
@@ -3272,7 +3282,7 @@ fn format_generics(
3272
3282
used_width : usize ,
3273
3283
) -> Option < String > {
3274
3284
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 ( ) ?;
3276
3286
3277
3287
// If the generics are not parameterized then generics.span.hi() == 0,
3278
3288
// so we use span.lo(), which is the position after `struct Foo`.
@@ -3366,7 +3376,11 @@ fn format_generics(
3366
3376
3367
3377
impl Rewrite for ast:: ForeignItem {
3368
3378
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) ?;
3370
3384
// Drop semicolon or it will be interpreted as comment.
3371
3385
// FIXME: this may be a faulty span from libsyntax.
3372
3386
let span = mk_sp ( self . span . lo ( ) , self . span . hi ( ) - BytePos ( 1 ) ) ;
@@ -3399,7 +3413,7 @@ impl Rewrite for ast::ForeignItem {
3399
3413
defaultness,
3400
3414
Some ( & inner_attrs) ,
3401
3415
) ;
3402
- Some ( visitor. buffer . to_owned ( ) )
3416
+ Ok ( visitor. buffer . to_owned ( ) )
3403
3417
} else {
3404
3418
rewrite_fn_base (
3405
3419
context,
@@ -3431,17 +3445,18 @@ impl Rewrite for ast::ForeignItem {
3431
3445
prefix,
3432
3446
& static_foreign_item. ty ,
3433
3447
& RhsAssignKind :: Ty ,
3434
- shape. sub_width ( 1 ) ?,
3448
+ shape
3449
+ . sub_width ( 1 )
3450
+ . max_width_error ( shape. width , static_foreign_item. ty . span ) ?,
3435
3451
)
3436
3452
. map ( |s| s + ";" )
3437
- . ok ( )
3438
3453
}
3439
3454
ast:: ForeignItemKind :: TyAlias ( ref ty_alias) => {
3440
3455
let ( kind, span) = ( & ItemVisitorKind :: ForeignItem ( self ) , self . span ) ;
3441
3456
rewrite_type_alias ( ty_alias, context, shape. indent , kind, span)
3442
3457
}
3443
3458
ast:: ForeignItemKind :: MacCall ( ref mac) => {
3444
- rewrite_macro ( mac, None , context, shape, MacroPosition :: Item ) . ok ( )
3459
+ rewrite_macro ( mac, None , context, shape, MacroPosition :: Item )
3445
3460
}
3446
3461
} ?;
3447
3462
@@ -3458,7 +3473,6 @@ impl Rewrite for ast::ForeignItem {
3458
3473
shape,
3459
3474
false ,
3460
3475
)
3461
- . ok ( )
3462
3476
}
3463
3477
}
3464
3478
0 commit comments