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