@@ -435,7 +435,7 @@ impl<'a> FmtVisitor<'a> {
435
435
436
436
let mut fn_brace_style = newline_for_brace ( self . config , & fn_sig. generics . where_clause ) ;
437
437
let ( result, _, force_newline_brace) =
438
- rewrite_fn_base ( & context, indent, ident, fn_sig, span, fn_brace_style) ?;
438
+ rewrite_fn_base ( & context, indent, ident, fn_sig, span, fn_brace_style) . ok ( ) ?;
439
439
440
440
// 2 = ` {`
441
441
if self . config . brace_style ( ) == BraceStyle :: AlwaysNextLine
@@ -456,7 +456,7 @@ impl<'a> FmtVisitor<'a> {
456
456
vis : & ast:: Visibility ,
457
457
generics : & ast:: Generics ,
458
458
span : Span ,
459
- ) -> Option < String > {
459
+ ) -> RewriteResult {
460
460
// Drop semicolon or it will be interpreted as comment.
461
461
let span = mk_sp ( span. lo ( ) , span. hi ( ) - BytePos ( 1 ) ) ;
462
462
let context = self . get_context ( ) ;
@@ -478,7 +478,7 @@ impl<'a> FmtVisitor<'a> {
478
478
// Re-attach semicolon
479
479
result. push ( ';' ) ;
480
480
481
- Some ( result)
481
+ Ok ( result)
482
482
}
483
483
484
484
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.
@@ -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 = ";"
@@ -1612,7 +1612,7 @@ fn format_tuple_struct(
1612
1612
Some ( generics) => {
1613
1613
let budget = context. budget ( last_line_width ( & header_str) ) ;
1614
1614
let shape = Shape :: legacy ( budget, offset) ;
1615
- let generics_str = rewrite_generics ( context, "" , generics, shape) ?;
1615
+ let generics_str = rewrite_generics ( context, "" , generics, shape) . ok ( ) ?;
1616
1616
result. push_str ( & generics_str) ;
1617
1617
1618
1618
let where_budget = context. budget ( last_line_width ( & result) ) ;
@@ -1699,7 +1699,7 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
1699
1699
indent : Indent ,
1700
1700
visitor_kind : & ItemVisitorKind < ' b > ,
1701
1701
span : Span ,
1702
- ) -> Option < String > {
1702
+ ) -> RewriteResult {
1703
1703
use ItemVisitorKind :: * ;
1704
1704
1705
1705
let ast:: TyAlias {
@@ -1737,8 +1737,8 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
1737
1737
rewrite_ty ( rw_info, Some ( bounds) , ty_opt, vis)
1738
1738
} ?;
1739
1739
match defaultness {
1740
- ast:: Defaultness :: Default ( ..) => Some ( format ! ( "default {result}" ) ) ,
1741
- _ => Some ( result) ,
1740
+ ast:: Defaultness :: Default ( ..) => Ok ( format ! ( "default {result}" ) ) ,
1741
+ _ => Ok ( result) ,
1742
1742
}
1743
1743
}
1744
1744
}
@@ -1749,15 +1749,15 @@ fn rewrite_ty<R: Rewrite>(
1749
1749
generic_bounds_opt : Option < & ast:: GenericBounds > ,
1750
1750
rhs : Option < & R > ,
1751
1751
vis : & ast:: Visibility ,
1752
- ) -> Option < String > {
1752
+ ) -> RewriteResult {
1753
1753
let mut result = String :: with_capacity ( 128 ) ;
1754
1754
let TyAliasRewriteInfo ( context, indent, generics, where_clauses, ident, span) = * rw_info;
1755
1755
let ( before_where_predicates, after_where_predicates) = generics
1756
1756
. where_clause
1757
1757
. predicates
1758
1758
. split_at ( where_clauses. split ) ;
1759
1759
if !after_where_predicates. is_empty ( ) {
1760
- return None ;
1760
+ return Err ( RewriteError :: Unknown ) ;
1761
1761
}
1762
1762
result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
1763
1763
let ident_str = rewrite_ident ( context, ident) ;
@@ -1766,18 +1766,25 @@ fn rewrite_ty<R: Rewrite>(
1766
1766
result. push_str ( ident_str)
1767
1767
} else {
1768
1768
// 2 = `= `
1769
- let g_shape = Shape :: indented ( indent, context. config )
1770
- . offset_left ( result. len ( ) ) ?
1771
- . sub_width ( 2 ) ?;
1769
+ let g_shape = Shape :: indented ( indent, context. config ) ;
1770
+ let g_shape = g_shape
1771
+ . offset_left ( result. len ( ) )
1772
+ . and_then ( |s| s. sub_width ( 2 ) )
1773
+ . max_width_error ( g_shape. width , span) ?;
1772
1774
let generics_str = rewrite_generics ( context, ident_str, generics, g_shape) ?;
1773
1775
result. push_str ( & generics_str) ;
1774
1776
}
1775
1777
1776
1778
if let Some ( bounds) = generic_bounds_opt {
1777
1779
if !bounds. is_empty ( ) {
1778
1780
// 2 = `: `
1779
- let shape = Shape :: indented ( indent, context. config ) . offset_left ( result. len ( ) + 2 ) ?;
1780
- let type_bounds = bounds. rewrite ( context, shape) . map ( |s| format ! ( ": {}" , s) ) ?;
1781
+ let shape = Shape :: indented ( indent, context. config ) ;
1782
+ let shape = shape
1783
+ . offset_left ( result. len ( ) + 2 )
1784
+ . max_width_error ( shape. width , span) ?;
1785
+ let type_bounds = bounds
1786
+ . rewrite_result ( context, shape)
1787
+ . map ( |s| format ! ( ": {}" , s) ) ?;
1781
1788
result. push_str ( & type_bounds) ;
1782
1789
}
1783
1790
}
@@ -1798,8 +1805,7 @@ fn rewrite_ty<R: Rewrite>(
1798
1805
None ,
1799
1806
generics. span . hi ( ) ,
1800
1807
option,
1801
- )
1802
- . ok ( ) ?;
1808
+ ) ?;
1803
1809
result. push_str ( & where_clause_str) ;
1804
1810
1805
1811
if let Some ( ty) = rhs {
@@ -1819,13 +1825,20 @@ fn rewrite_ty<R: Rewrite>(
1819
1825
1820
1826
let lhs = match comment_span {
1821
1827
Some ( comment_span)
1822
- if contains_comment ( context. snippet_provider . span_to_snippet ( comment_span) ?) =>
1828
+ if contains_comment (
1829
+ context
1830
+ . snippet_provider
1831
+ . span_to_snippet ( comment_span)
1832
+ . unknown_error ( ) ?,
1833
+ ) =>
1823
1834
{
1824
1835
let comment_shape = if has_where {
1825
1836
Shape :: indented ( indent, context. config )
1826
1837
} else {
1827
- Shape :: indented ( indent, context. config )
1828
- . block_left ( context. config . tab_spaces ( ) ) ?
1838
+ let shape = Shape :: indented ( indent, context. config ) ;
1839
+ shape
1840
+ . block_left ( context. config . tab_spaces ( ) )
1841
+ . max_width_error ( shape. width , span) ?
1829
1842
} ;
1830
1843
1831
1844
combine_strs_with_missing_comments (
@@ -1835,17 +1848,19 @@ fn rewrite_ty<R: Rewrite>(
1835
1848
comment_span,
1836
1849
comment_shape,
1837
1850
true ,
1838
- )
1839
- . ok ( ) ?
1851
+ ) ?
1840
1852
}
1841
1853
_ => format ! ( "{result}=" ) ,
1842
1854
} ;
1843
1855
1844
1856
// 1 = `;`
1845
- let shape = Shape :: indented ( indent, context. config ) . sub_width ( 1 ) ?;
1846
- rewrite_assign_rhs ( context, lhs, & * ty, & RhsAssignKind :: Ty , shape) . map ( |s| s + ";" )
1857
+ let shape = Shape :: indented ( indent, context. config ) ;
1858
+ let shape = shape. sub_width ( 1 ) . max_width_error ( shape. width , span) ?;
1859
+ rewrite_assign_rhs ( context, lhs, & * ty, & RhsAssignKind :: Ty , shape)
1860
+ . map ( |s| s + ";" )
1861
+ . unknown_error ( )
1847
1862
} else {
1848
- Some ( format ! ( "{result};" ) )
1863
+ Ok ( format ! ( "{result};" ) )
1849
1864
}
1850
1865
}
1851
1866
@@ -2390,7 +2405,7 @@ fn rewrite_fn_base(
2390
2405
fn_sig : & FnSig < ' _ > ,
2391
2406
span : Span ,
2392
2407
fn_brace_style : FnBraceStyle ,
2393
- ) -> Option < ( String , bool , bool ) > {
2408
+ ) -> Result < ( String , bool , bool ) , RewriteError > {
2394
2409
let mut force_new_line_for_brace = false ;
2395
2410
2396
2411
let where_clause = & fn_sig. generics . where_clause ;
@@ -2434,7 +2449,7 @@ fn rewrite_fn_base(
2434
2449
// return type later anyway.
2435
2450
let ret_str = fd
2436
2451
. output
2437
- . rewrite ( context, Shape :: indented ( indent, context. config ) ) ?;
2452
+ . rewrite_result ( context, Shape :: indented ( indent, context. config ) ) ?;
2438
2453
2439
2454
let multi_line_ret_str = ret_str. contains ( '\n' ) ;
2440
2455
let ret_str_len = if multi_line_ret_str { 0 } else { ret_str. len ( ) } ;
@@ -2447,7 +2462,7 @@ fn rewrite_fn_base(
2447
2462
ret_str_len,
2448
2463
fn_brace_style,
2449
2464
multi_line_ret_str,
2450
- ) ? ;
2465
+ ) ;
2451
2466
2452
2467
debug ! (
2453
2468
"rewrite_fn_base: one_line_budget: {}, multi_line_budget: {}, param_indent: {:?}" ,
@@ -2609,7 +2624,7 @@ fn rewrite_fn_base(
2609
2624
if multi_line_ret_str || ret_should_indent {
2610
2625
// Now that we know the proper indent and width, we need to
2611
2626
// re-layout the return type.
2612
- let ret_str = fd. output . rewrite ( context, ret_shape) ?;
2627
+ let ret_str = fd. output . rewrite_result ( context, ret_shape) ?;
2613
2628
result. push_str ( & ret_str) ;
2614
2629
} else {
2615
2630
result. push_str ( & ret_str) ;
@@ -2669,8 +2684,7 @@ fn rewrite_fn_base(
2669
2684
Some ( span. hi ( ) ) ,
2670
2685
pos_before_where,
2671
2686
option,
2672
- )
2673
- . ok ( ) ?;
2687
+ ) ?;
2674
2688
// If there are neither where-clause nor return type, we may be missing comments between
2675
2689
// params and `{`.
2676
2690
if where_clause_str. is_empty ( ) {
@@ -2697,7 +2711,7 @@ fn rewrite_fn_base(
2697
2711
force_new_line_for_brace |= ends_with_comment;
2698
2712
force_new_line_for_brace |=
2699
2713
is_params_multi_lined && context. config . where_single_line ( ) && !where_clause_str. is_empty ( ) ;
2700
- Some ( ( result, ends_with_comment, force_new_line_for_brace) )
2714
+ Ok ( ( result, ends_with_comment, force_new_line_for_brace) )
2701
2715
}
2702
2716
2703
2717
/// Kind of spaces to put before `where`.
@@ -2768,7 +2782,7 @@ fn rewrite_params(
2768
2782
param_indent : Indent ,
2769
2783
span : Span ,
2770
2784
variadic : bool ,
2771
- ) -> Option < String > {
2785
+ ) -> RewriteResult {
2772
2786
if params. is_empty ( ) {
2773
2787
let comment = context
2774
2788
. snippet ( mk_sp (
@@ -2777,7 +2791,7 @@ fn rewrite_params(
2777
2791
span. hi ( ) - BytePos ( 1 ) ,
2778
2792
) )
2779
2793
. trim ( ) ;
2780
- return Some ( comment. to_owned ( ) ) ;
2794
+ return Ok ( comment. to_owned ( ) ) ;
2781
2795
}
2782
2796
let param_items: Vec < _ > = itemize_list (
2783
2797
context. snippet_provider ,
@@ -2827,7 +2841,7 @@ fn rewrite_params(
2827
2841
. trailing_separator ( trailing_separator)
2828
2842
. ends_with_newline ( tactic. ends_with_newline ( context. config . indent_style ( ) ) )
2829
2843
. preserve_newline ( true ) ;
2830
- write_list ( & param_items, & fmt) . ok ( )
2844
+ write_list ( & param_items, & fmt)
2831
2845
}
2832
2846
2833
2847
fn compute_budgets_for_params (
@@ -2837,7 +2851,7 @@ fn compute_budgets_for_params(
2837
2851
ret_str_len : usize ,
2838
2852
fn_brace_style : FnBraceStyle ,
2839
2853
force_vertical_layout : bool ,
2840
- ) -> Option < ( usize , usize , Indent ) > {
2854
+ ) -> ( usize , usize , Indent ) {
2841
2855
debug ! (
2842
2856
"compute_budgets_for_params {} {:?}, {}, {:?}" ,
2843
2857
result. len( ) ,
@@ -2874,7 +2888,7 @@ fn compute_budgets_for_params(
2874
2888
}
2875
2889
} ;
2876
2890
2877
- return Some ( ( one_line_budget, multi_line_budget, indent) ) ;
2891
+ return ( one_line_budget, multi_line_budget, indent) ;
2878
2892
}
2879
2893
}
2880
2894
@@ -2886,7 +2900,7 @@ fn compute_budgets_for_params(
2886
2900
// Account for `)` and possibly ` {`.
2887
2901
IndentStyle :: Visual => new_indent. width ( ) + if ret_str_len == 0 { 1 } else { 3 } ,
2888
2902
} ;
2889
- Some ( ( 0 , context. budget ( used_space) , new_indent) )
2903
+ ( 0 , context. budget ( used_space) , new_indent)
2890
2904
}
2891
2905
2892
2906
fn newline_for_brace ( config : & Config , where_clause : & ast:: WhereClause ) -> FnBraceStyle {
@@ -2911,16 +2925,16 @@ fn rewrite_generics(
2911
2925
ident : & str ,
2912
2926
generics : & ast:: Generics ,
2913
2927
shape : Shape ,
2914
- ) -> Option < String > {
2928
+ ) -> RewriteResult {
2915
2929
// FIXME: convert bounds to where-clauses where they get too big or if
2916
2930
// there is a where-clause at all.
2917
2931
2918
2932
if generics. params . is_empty ( ) {
2919
- return Some ( ident. to_owned ( ) ) ;
2933
+ return Ok ( ident. to_owned ( ) ) ;
2920
2934
}
2921
2935
2922
2936
let params = generics. params . iter ( ) ;
2923
- overflow:: rewrite_with_angle_brackets ( context, ident, params, shape, generics. span ) . ok ( )
2937
+ overflow:: rewrite_with_angle_brackets ( context, ident, params, shape, generics. span )
2924
2938
}
2925
2939
2926
2940
fn generics_shape_from_config ( config : & Config , shape : Shape , offset : usize ) -> Option < Shape > {
@@ -3270,7 +3284,7 @@ fn format_generics(
3270
3284
used_width : usize ,
3271
3285
) -> Option < String > {
3272
3286
let shape = Shape :: legacy ( context. budget ( used_width + offset. width ( ) ) , offset) ;
3273
- let mut result = rewrite_generics ( context, "" , generics, shape) ?;
3287
+ let mut result = rewrite_generics ( context, "" , generics, shape) . ok ( ) ?;
3274
3288
3275
3289
// If the generics are not parameterized then generics.span.hi() == 0,
3276
3290
// so we use span.lo(), which is the position after `struct Foo`.
@@ -3364,7 +3378,11 @@ fn format_generics(
3364
3378
3365
3379
impl Rewrite for ast:: ForeignItem {
3366
3380
fn rewrite ( & self , context : & RewriteContext < ' _ > , shape : Shape ) -> Option < String > {
3367
- let attrs_str = self . attrs . rewrite ( context, shape) ?;
3381
+ self . rewrite_result ( context, shape) . ok ( )
3382
+ }
3383
+
3384
+ fn rewrite_result ( & self , context : & RewriteContext < ' _ > , shape : Shape ) -> RewriteResult {
3385
+ let attrs_str = self . attrs . rewrite_result ( context, shape) ?;
3368
3386
// Drop semicolon or it will be interpreted as comment.
3369
3387
// FIXME: this may be a faulty span from libsyntax.
3370
3388
let span = mk_sp ( self . span . lo ( ) , self . span . hi ( ) - BytePos ( 1 ) ) ;
@@ -3397,7 +3415,7 @@ impl Rewrite for ast::ForeignItem {
3397
3415
defaultness,
3398
3416
Some ( & inner_attrs) ,
3399
3417
) ;
3400
- Some ( visitor. buffer . to_owned ( ) )
3418
+ Ok ( visitor. buffer . to_owned ( ) )
3401
3419
} else {
3402
3420
rewrite_fn_base (
3403
3421
context,
@@ -3429,16 +3447,19 @@ impl Rewrite for ast::ForeignItem {
3429
3447
prefix,
3430
3448
& static_foreign_item. ty ,
3431
3449
& RhsAssignKind :: Ty ,
3432
- shape. sub_width ( 1 ) ?,
3450
+ shape
3451
+ . sub_width ( 1 )
3452
+ . max_width_error ( shape. width , static_foreign_item. ty . span ) ?, // TODO
3433
3453
)
3454
+ . unknown_error ( )
3434
3455
. map ( |s| s + ";" )
3435
3456
}
3436
3457
ast:: ForeignItemKind :: TyAlias ( ref ty_alias) => {
3437
3458
let ( kind, span) = ( & ItemVisitorKind :: ForeignItem ( self ) , self . span ) ;
3438
3459
rewrite_type_alias ( ty_alias, context, shape. indent , kind, span)
3439
3460
}
3440
3461
ast:: ForeignItemKind :: MacCall ( ref mac) => {
3441
- rewrite_macro ( mac, None , context, shape, MacroPosition :: Item ) . ok ( )
3462
+ rewrite_macro ( mac, None , context, shape, MacroPosition :: Item )
3442
3463
}
3443
3464
} ?;
3444
3465
@@ -3455,7 +3476,6 @@ impl Rewrite for ast::ForeignItem {
3455
3476
shape,
3456
3477
false ,
3457
3478
)
3458
- . ok ( )
3459
3479
}
3460
3480
}
3461
3481
0 commit comments