@@ -694,7 +694,8 @@ pub(crate) fn format_impl(
694
694
let where_span_end = context. snippet_provider . opt_span_before ( missing_span, "{" ) ;
695
695
let where_clause_str = rewrite_where_clause (
696
696
context,
697
- & generics. where_clause ,
697
+ & generics. where_clause . predicates ,
698
+ generics. where_clause . span ,
698
699
context. config . brace_style ( ) ,
699
700
Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
700
701
false ,
@@ -1059,7 +1060,8 @@ pub(crate) fn format_trait(
1059
1060
let option = WhereClauseOption :: snuggled ( & generics_str) ;
1060
1061
let where_clause_str = rewrite_where_clause (
1061
1062
context,
1062
- & generics. where_clause ,
1063
+ & generics. where_clause . predicates ,
1064
+ generics. where_clause . span ,
1063
1065
context. config . brace_style ( ) ,
1064
1066
Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
1065
1067
where_on_new_line,
@@ -1178,7 +1180,8 @@ impl<'a> Rewrite for TraitAliasBounds<'a> {
1178
1180
1179
1181
let where_str = rewrite_where_clause (
1180
1182
context,
1181
- & self . generics . where_clause ,
1183
+ & self . generics . where_clause . predicates ,
1184
+ self . generics . where_clause . span ,
1182
1185
context. config . brace_style ( ) ,
1183
1186
shape,
1184
1187
false ,
@@ -1441,7 +1444,8 @@ fn format_tuple_struct(
1441
1444
let option = WhereClauseOption :: new ( true , WhereClauseSpace :: Newline ) ;
1442
1445
rewrite_where_clause (
1443
1446
context,
1444
- & generics. where_clause ,
1447
+ & generics. where_clause . predicates ,
1448
+ generics. where_clause . span ,
1445
1449
context. config . brace_style ( ) ,
1446
1450
Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
1447
1451
false ,
@@ -1507,6 +1511,8 @@ struct TyAliasRewriteInfo<'c, 'g>(
1507
1511
& ' c RewriteContext < ' c > ,
1508
1512
Indent ,
1509
1513
& ' g ast:: Generics ,
1514
+ ( ast:: TyAliasWhereClause , ast:: TyAliasWhereClause ) ,
1515
+ usize ,
1510
1516
symbol:: Ident ,
1511
1517
Span ,
1512
1518
) ;
@@ -1525,14 +1531,24 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
1525
1531
ref generics,
1526
1532
ref bounds,
1527
1533
ref ty,
1534
+ where_clauses,
1535
+ where_predicates_split,
1528
1536
} = * ty_alias_kind;
1529
1537
let ty_opt = ty. as_ref ( ) ;
1530
1538
let ( ident, vis) = match visitor_kind {
1531
1539
Item ( i) => ( i. ident , & i. vis ) ,
1532
1540
AssocTraitItem ( i) | AssocImplItem ( i) => ( i. ident , & i. vis ) ,
1533
1541
ForeignItem ( i) => ( i. ident , & i. vis ) ,
1534
1542
} ;
1535
- let rw_info = & TyAliasRewriteInfo ( context, indent, generics, ident, span) ;
1543
+ let rw_info = & TyAliasRewriteInfo (
1544
+ context,
1545
+ indent,
1546
+ generics,
1547
+ where_clauses,
1548
+ where_predicates_split,
1549
+ ident,
1550
+ span,
1551
+ ) ;
1536
1552
let op_ty = opaque_ty ( ty) ;
1537
1553
// Type Aliases are formatted slightly differently depending on the context
1538
1554
// in which they appear, whether they are opaque, and whether they are associated.
@@ -1568,7 +1584,22 @@ fn rewrite_ty<R: Rewrite>(
1568
1584
vis : & ast:: Visibility ,
1569
1585
) -> Option < String > {
1570
1586
let mut result = String :: with_capacity ( 128 ) ;
1571
- let TyAliasRewriteInfo ( context, indent, generics, ident, span) = * rw_info;
1587
+ let TyAliasRewriteInfo (
1588
+ context,
1589
+ indent,
1590
+ generics,
1591
+ where_clauses,
1592
+ where_predicates_split,
1593
+ ident,
1594
+ span,
1595
+ ) = * rw_info;
1596
+ let ( before_where_predicates, after_where_predicates) = generics
1597
+ . where_clause
1598
+ . predicates
1599
+ . split_at ( where_predicates_split) ;
1600
+ if !after_where_predicates. is_empty ( ) {
1601
+ return None ;
1602
+ }
1572
1603
result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
1573
1604
let ident_str = rewrite_ident ( context, ident) ;
1574
1605
@@ -1599,7 +1630,8 @@ fn rewrite_ty<R: Rewrite>(
1599
1630
}
1600
1631
let where_clause_str = rewrite_where_clause (
1601
1632
context,
1602
- & generics. where_clause ,
1633
+ before_where_predicates,
1634
+ where_clauses. 0 . 1 ,
1603
1635
context. config . brace_style ( ) ,
1604
1636
Shape :: legacy ( where_budget, indent) ,
1605
1637
false ,
@@ -1613,7 +1645,7 @@ fn rewrite_ty<R: Rewrite>(
1613
1645
if let Some ( ty) = rhs {
1614
1646
// If there's a where clause, add a newline before the assignment. Otherwise just add a
1615
1647
// space.
1616
- let has_where = !generics . where_clause . predicates . is_empty ( ) ;
1648
+ let has_where = !before_where_predicates . is_empty ( ) ;
1617
1649
if has_where {
1618
1650
result. push_str ( & indent. to_string_with_newline ( context. config ) ) ;
1619
1651
} else {
@@ -1623,7 +1655,7 @@ fn rewrite_ty<R: Rewrite>(
1623
1655
let comment_span = context
1624
1656
. snippet_provider
1625
1657
. opt_span_before ( span, "=" )
1626
- . map ( |op_lo| mk_sp ( generics . where_clause . span . hi ( ) , op_lo) ) ;
1658
+ . map ( |op_lo| mk_sp ( where_clauses . 0 . 1 . hi ( ) , op_lo) ) ;
1627
1659
1628
1660
let lhs = match comment_span {
1629
1661
Some ( comment_span)
@@ -2186,7 +2218,7 @@ fn rewrite_fn_base(
2186
2218
let generics_str = rewrite_generics (
2187
2219
context,
2188
2220
rewrite_ident ( context, ident) ,
2189
- fn_sig. generics ,
2221
+ & fn_sig. generics ,
2190
2222
shape,
2191
2223
) ?;
2192
2224
result. push_str ( & generics_str) ;
@@ -2426,7 +2458,8 @@ fn rewrite_fn_base(
2426
2458
}
2427
2459
let where_clause_str = rewrite_where_clause (
2428
2460
context,
2429
- where_clause,
2461
+ & where_clause. predicates ,
2462
+ where_clause. span ,
2430
2463
context. config . brace_style ( ) ,
2431
2464
Shape :: indented ( indent, context. config ) ,
2432
2465
true ,
@@ -2702,7 +2735,8 @@ fn generics_shape_from_config(config: &Config, shape: Shape, offset: usize) -> O
2702
2735
2703
2736
fn rewrite_where_clause_rfc_style (
2704
2737
context : & RewriteContext < ' _ > ,
2705
- where_clause : & ast:: WhereClause ,
2738
+ predicates : & [ ast:: WherePredicate ] ,
2739
+ where_span : Span ,
2706
2740
shape : Shape ,
2707
2741
terminator : & str ,
2708
2742
span_end : Option < BytePos > ,
@@ -2711,7 +2745,8 @@ fn rewrite_where_clause_rfc_style(
2711
2745
) -> Option < String > {
2712
2746
let ( where_keyword, allow_single_line) = rewrite_where_keyword (
2713
2747
context,
2714
- where_clause,
2748
+ predicates,
2749
+ where_span,
2715
2750
shape,
2716
2751
span_end_before_where,
2717
2752
where_clause_option,
@@ -2724,12 +2759,12 @@ fn rewrite_where_clause_rfc_style(
2724
2759
. block_left ( context. config . tab_spaces ( ) ) ?
2725
2760
. sub_width ( 1 ) ?;
2726
2761
let force_single_line = context. config . where_single_line ( )
2727
- && where_clause . predicates . len ( ) == 1
2762
+ && predicates. len ( ) == 1
2728
2763
&& !where_clause_option. veto_single_line ;
2729
2764
2730
2765
let preds_str = rewrite_bounds_on_where_clause (
2731
2766
context,
2732
- where_clause ,
2767
+ predicates ,
2733
2768
clause_shape,
2734
2769
terminator,
2735
2770
span_end,
@@ -2753,7 +2788,8 @@ fn rewrite_where_clause_rfc_style(
2753
2788
/// Rewrite `where` and comment around it.
2754
2789
fn rewrite_where_keyword (
2755
2790
context : & RewriteContext < ' _ > ,
2756
- where_clause : & ast:: WhereClause ,
2791
+ predicates : & [ ast:: WherePredicate ] ,
2792
+ where_span : Span ,
2757
2793
shape : Shape ,
2758
2794
span_end_before_where : BytePos ,
2759
2795
where_clause_option : WhereClauseOption ,
@@ -2773,7 +2809,7 @@ fn rewrite_where_keyword(
2773
2809
} ;
2774
2810
2775
2811
let ( span_before, span_after) =
2776
- missing_span_before_after_where ( span_end_before_where, where_clause ) ;
2812
+ missing_span_before_after_where ( span_end_before_where, predicates , where_span ) ;
2777
2813
let ( comment_before, comment_after) =
2778
2814
rewrite_comments_before_after_where ( context, span_before, span_after, shape) ?;
2779
2815
@@ -2799,22 +2835,22 @@ fn rewrite_where_keyword(
2799
2835
/// Rewrite bounds on a where clause.
2800
2836
fn rewrite_bounds_on_where_clause (
2801
2837
context : & RewriteContext < ' _ > ,
2802
- where_clause : & ast:: WhereClause ,
2838
+ predicates : & [ ast:: WherePredicate ] ,
2803
2839
shape : Shape ,
2804
2840
terminator : & str ,
2805
2841
span_end : Option < BytePos > ,
2806
2842
where_clause_option : WhereClauseOption ,
2807
2843
force_single_line : bool ,
2808
2844
) -> Option < String > {
2809
- let span_start = where_clause . predicates [ 0 ] . span ( ) . lo ( ) ;
2845
+ let span_start = predicates[ 0 ] . span ( ) . lo ( ) ;
2810
2846
// If we don't have the start of the next span, then use the end of the
2811
2847
// predicates, but that means we miss comments.
2812
- let len = where_clause . predicates . len ( ) ;
2813
- let end_of_preds = where_clause . predicates [ len - 1 ] . span ( ) . hi ( ) ;
2848
+ let len = predicates. len ( ) ;
2849
+ let end_of_preds = predicates[ len - 1 ] . span ( ) . hi ( ) ;
2814
2850
let span_end = span_end. unwrap_or ( end_of_preds) ;
2815
2851
let items = itemize_list (
2816
2852
context. snippet_provider ,
2817
- where_clause . predicates . iter ( ) ,
2853
+ predicates. iter ( ) ,
2818
2854
terminator,
2819
2855
"," ,
2820
2856
|pred| pred. span ( ) . lo ( ) ,
@@ -2847,7 +2883,8 @@ fn rewrite_bounds_on_where_clause(
2847
2883
2848
2884
fn rewrite_where_clause (
2849
2885
context : & RewriteContext < ' _ > ,
2850
- where_clause : & ast:: WhereClause ,
2886
+ predicates : & [ ast:: WherePredicate ] ,
2887
+ where_span : Span ,
2851
2888
brace_style : BraceStyle ,
2852
2889
shape : Shape ,
2853
2890
on_new_line : bool ,
@@ -2856,14 +2893,15 @@ fn rewrite_where_clause(
2856
2893
span_end_before_where : BytePos ,
2857
2894
where_clause_option : WhereClauseOption ,
2858
2895
) -> Option < String > {
2859
- if where_clause . predicates . is_empty ( ) {
2896
+ if predicates. is_empty ( ) {
2860
2897
return Some ( String :: new ( ) ) ;
2861
2898
}
2862
2899
2863
2900
if context. config . indent_style ( ) == IndentStyle :: Block {
2864
2901
return rewrite_where_clause_rfc_style (
2865
2902
context,
2866
- where_clause,
2903
+ predicates,
2904
+ where_span,
2867
2905
shape,
2868
2906
terminator,
2869
2907
span_end,
@@ -2883,15 +2921,15 @@ fn rewrite_where_clause(
2883
2921
// be out by a char or two.
2884
2922
2885
2923
let budget = context. config . max_width ( ) - offset. width ( ) ;
2886
- let span_start = where_clause . predicates [ 0 ] . span ( ) . lo ( ) ;
2924
+ let span_start = predicates[ 0 ] . span ( ) . lo ( ) ;
2887
2925
// If we don't have the start of the next span, then use the end of the
2888
2926
// predicates, but that means we miss comments.
2889
- let len = where_clause . predicates . len ( ) ;
2890
- let end_of_preds = where_clause . predicates [ len - 1 ] . span ( ) . hi ( ) ;
2927
+ let len = predicates. len ( ) ;
2928
+ let end_of_preds = predicates[ len - 1 ] . span ( ) . hi ( ) ;
2891
2929
let span_end = span_end. unwrap_or ( end_of_preds) ;
2892
2930
let items = itemize_list (
2893
2931
context. snippet_provider ,
2894
- where_clause . predicates . iter ( ) ,
2932
+ predicates. iter ( ) ,
2895
2933
terminator,
2896
2934
"," ,
2897
2935
|pred| pred. span ( ) . lo ( ) ,
@@ -2946,12 +2984,13 @@ fn rewrite_where_clause(
2946
2984
2947
2985
fn missing_span_before_after_where (
2948
2986
before_item_span_end : BytePos ,
2949
- where_clause : & ast:: WhereClause ,
2987
+ predicates : & [ ast:: WherePredicate ] ,
2988
+ where_span : Span ,
2950
2989
) -> ( Span , Span ) {
2951
- let missing_span_before = mk_sp ( before_item_span_end, where_clause . span . lo ( ) ) ;
2990
+ let missing_span_before = mk_sp ( before_item_span_end, where_span . lo ( ) ) ;
2952
2991
// 5 = `where`
2953
- let pos_after_where = where_clause . span . lo ( ) + BytePos ( 5 ) ;
2954
- let missing_span_after = mk_sp ( pos_after_where, where_clause . predicates [ 0 ] . span ( ) . lo ( ) ) ;
2992
+ let pos_after_where = where_span . lo ( ) + BytePos ( 5 ) ;
2993
+ let missing_span_after = mk_sp ( pos_after_where, predicates[ 0 ] . span ( ) . lo ( ) ) ;
2955
2994
( missing_span_before, missing_span_after)
2956
2995
}
2957
2996
@@ -3040,7 +3079,8 @@ fn format_generics(
3040
3079
}
3041
3080
let where_clause_str = rewrite_where_clause (
3042
3081
context,
3043
- & generics. where_clause ,
3082
+ & generics. where_clause . predicates ,
3083
+ generics. where_clause . span ,
3044
3084
brace_style,
3045
3085
Shape :: legacy ( budget, offset. block_only ( ) ) ,
3046
3086
true ,
0 commit comments