@@ -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 ,
@@ -1437,7 +1440,8 @@ fn format_tuple_struct(
1437
1440
let option = WhereClauseOption :: new ( true , WhereClauseSpace :: Newline ) ;
1438
1441
rewrite_where_clause (
1439
1442
context,
1440
- & generics. where_clause ,
1443
+ & generics. where_clause . predicates ,
1444
+ generics. where_clause . span ,
1441
1445
context. config . brace_style ( ) ,
1442
1446
Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
1443
1447
false ,
@@ -1503,6 +1507,8 @@ struct TyAliasRewriteInfo<'c, 'g>(
1503
1507
& ' c RewriteContext < ' c > ,
1504
1508
Indent ,
1505
1509
& ' g ast:: Generics ,
1510
+ ( ast:: TyAliasWhereClause , ast:: TyAliasWhereClause ) ,
1511
+ usize ,
1506
1512
symbol:: Ident ,
1507
1513
Span ,
1508
1514
) ;
@@ -1521,14 +1527,24 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
1521
1527
ref generics,
1522
1528
ref bounds,
1523
1529
ref ty,
1530
+ where_clauses,
1531
+ where_predicates_split,
1524
1532
} = * ty_alias_kind;
1525
1533
let ty_opt = ty. as_ref ( ) ;
1526
1534
let ( ident, vis) = match visitor_kind {
1527
1535
Item ( i) => ( i. ident , & i. vis ) ,
1528
1536
AssocTraitItem ( i) | AssocImplItem ( i) => ( i. ident , & i. vis ) ,
1529
1537
ForeignItem ( i) => ( i. ident , & i. vis ) ,
1530
1538
} ;
1531
- let rw_info = & TyAliasRewriteInfo ( context, indent, generics, ident, span) ;
1539
+ let rw_info = & TyAliasRewriteInfo (
1540
+ context,
1541
+ indent,
1542
+ generics,
1543
+ where_clauses,
1544
+ where_predicates_split,
1545
+ ident,
1546
+ span,
1547
+ ) ;
1532
1548
let op_ty = opaque_ty ( ty) ;
1533
1549
// Type Aliases are formatted slightly differently depending on the context
1534
1550
// in which they appear, whether they are opaque, and whether they are associated.
@@ -1564,7 +1580,22 @@ fn rewrite_ty<R: Rewrite>(
1564
1580
vis : & ast:: Visibility ,
1565
1581
) -> Option < String > {
1566
1582
let mut result = String :: with_capacity ( 128 ) ;
1567
- let TyAliasRewriteInfo ( context, indent, generics, ident, span) = * rw_info;
1583
+ let TyAliasRewriteInfo (
1584
+ context,
1585
+ indent,
1586
+ generics,
1587
+ where_clauses,
1588
+ where_predicates_split,
1589
+ ident,
1590
+ span,
1591
+ ) = * rw_info;
1592
+ let ( before_where_predicates, after_where_predicates) = generics
1593
+ . where_clause
1594
+ . predicates
1595
+ . split_at ( where_predicates_split) ;
1596
+ if !after_where_predicates. is_empty ( ) {
1597
+ return None ;
1598
+ }
1568
1599
result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
1569
1600
let ident_str = rewrite_ident ( context, ident) ;
1570
1601
@@ -1595,7 +1626,8 @@ fn rewrite_ty<R: Rewrite>(
1595
1626
}
1596
1627
let where_clause_str = rewrite_where_clause (
1597
1628
context,
1598
- & generics. where_clause ,
1629
+ before_where_predicates,
1630
+ where_clauses. 0 . 1 ,
1599
1631
context. config . brace_style ( ) ,
1600
1632
Shape :: legacy ( where_budget, indent) ,
1601
1633
false ,
@@ -1609,7 +1641,7 @@ fn rewrite_ty<R: Rewrite>(
1609
1641
if let Some ( ty) = rhs {
1610
1642
// If there's a where clause, add a newline before the assignment. Otherwise just add a
1611
1643
// space.
1612
- let has_where = !generics . where_clause . predicates . is_empty ( ) ;
1644
+ let has_where = !before_where_predicates . is_empty ( ) ;
1613
1645
if has_where {
1614
1646
result. push_str ( & indent. to_string_with_newline ( context. config ) ) ;
1615
1647
} else {
@@ -1619,7 +1651,7 @@ fn rewrite_ty<R: Rewrite>(
1619
1651
let comment_span = context
1620
1652
. snippet_provider
1621
1653
. opt_span_before ( span, "=" )
1622
- . map ( |op_lo| mk_sp ( generics . where_clause . span . hi ( ) , op_lo) ) ;
1654
+ . map ( |op_lo| mk_sp ( where_clauses . 0 . 1 . hi ( ) , op_lo) ) ;
1623
1655
1624
1656
let lhs = match comment_span {
1625
1657
Some ( comment_span)
@@ -2176,7 +2208,7 @@ fn rewrite_fn_base(
2176
2208
let generics_str = rewrite_generics (
2177
2209
context,
2178
2210
rewrite_ident ( context, ident) ,
2179
- fn_sig. generics ,
2211
+ & fn_sig. generics ,
2180
2212
shape,
2181
2213
) ?;
2182
2214
result. push_str ( & generics_str) ;
@@ -2416,7 +2448,8 @@ fn rewrite_fn_base(
2416
2448
}
2417
2449
let where_clause_str = rewrite_where_clause (
2418
2450
context,
2419
- where_clause,
2451
+ & where_clause. predicates ,
2452
+ where_clause. span ,
2420
2453
context. config . brace_style ( ) ,
2421
2454
Shape :: indented ( indent, context. config ) ,
2422
2455
true ,
@@ -2692,7 +2725,8 @@ fn generics_shape_from_config(config: &Config, shape: Shape, offset: usize) -> O
2692
2725
2693
2726
fn rewrite_where_clause_rfc_style (
2694
2727
context : & RewriteContext < ' _ > ,
2695
- where_clause : & ast:: WhereClause ,
2728
+ predicates : & [ ast:: WherePredicate ] ,
2729
+ where_span : Span ,
2696
2730
shape : Shape ,
2697
2731
terminator : & str ,
2698
2732
span_end : Option < BytePos > ,
@@ -2701,7 +2735,8 @@ fn rewrite_where_clause_rfc_style(
2701
2735
) -> Option < String > {
2702
2736
let ( where_keyword, allow_single_line) = rewrite_where_keyword (
2703
2737
context,
2704
- where_clause,
2738
+ predicates,
2739
+ where_span,
2705
2740
shape,
2706
2741
span_end_before_where,
2707
2742
where_clause_option,
@@ -2714,12 +2749,12 @@ fn rewrite_where_clause_rfc_style(
2714
2749
. block_left ( context. config . tab_spaces ( ) ) ?
2715
2750
. sub_width ( 1 ) ?;
2716
2751
let force_single_line = context. config . where_single_line ( )
2717
- && where_clause . predicates . len ( ) == 1
2752
+ && predicates. len ( ) == 1
2718
2753
&& !where_clause_option. veto_single_line ;
2719
2754
2720
2755
let preds_str = rewrite_bounds_on_where_clause (
2721
2756
context,
2722
- where_clause ,
2757
+ predicates ,
2723
2758
clause_shape,
2724
2759
terminator,
2725
2760
span_end,
@@ -2743,7 +2778,8 @@ fn rewrite_where_clause_rfc_style(
2743
2778
/// Rewrite `where` and comment around it.
2744
2779
fn rewrite_where_keyword (
2745
2780
context : & RewriteContext < ' _ > ,
2746
- where_clause : & ast:: WhereClause ,
2781
+ predicates : & [ ast:: WherePredicate ] ,
2782
+ where_span : Span ,
2747
2783
shape : Shape ,
2748
2784
span_end_before_where : BytePos ,
2749
2785
where_clause_option : WhereClauseOption ,
@@ -2763,7 +2799,7 @@ fn rewrite_where_keyword(
2763
2799
} ;
2764
2800
2765
2801
let ( span_before, span_after) =
2766
- missing_span_before_after_where ( span_end_before_where, where_clause ) ;
2802
+ missing_span_before_after_where ( span_end_before_where, predicates , where_span ) ;
2767
2803
let ( comment_before, comment_after) =
2768
2804
rewrite_comments_before_after_where ( context, span_before, span_after, shape) ?;
2769
2805
@@ -2789,22 +2825,22 @@ fn rewrite_where_keyword(
2789
2825
/// Rewrite bounds on a where clause.
2790
2826
fn rewrite_bounds_on_where_clause (
2791
2827
context : & RewriteContext < ' _ > ,
2792
- where_clause : & ast:: WhereClause ,
2828
+ predicates : & [ ast:: WherePredicate ] ,
2793
2829
shape : Shape ,
2794
2830
terminator : & str ,
2795
2831
span_end : Option < BytePos > ,
2796
2832
where_clause_option : WhereClauseOption ,
2797
2833
force_single_line : bool ,
2798
2834
) -> Option < String > {
2799
- let span_start = where_clause . predicates [ 0 ] . span ( ) . lo ( ) ;
2835
+ let span_start = predicates[ 0 ] . span ( ) . lo ( ) ;
2800
2836
// If we don't have the start of the next span, then use the end of the
2801
2837
// predicates, but that means we miss comments.
2802
- let len = where_clause . predicates . len ( ) ;
2803
- let end_of_preds = where_clause . predicates [ len - 1 ] . span ( ) . hi ( ) ;
2838
+ let len = predicates. len ( ) ;
2839
+ let end_of_preds = predicates[ len - 1 ] . span ( ) . hi ( ) ;
2804
2840
let span_end = span_end. unwrap_or ( end_of_preds) ;
2805
2841
let items = itemize_list (
2806
2842
context. snippet_provider ,
2807
- where_clause . predicates . iter ( ) ,
2843
+ predicates. iter ( ) ,
2808
2844
terminator,
2809
2845
"," ,
2810
2846
|pred| pred. span ( ) . lo ( ) ,
@@ -2837,7 +2873,8 @@ fn rewrite_bounds_on_where_clause(
2837
2873
2838
2874
fn rewrite_where_clause (
2839
2875
context : & RewriteContext < ' _ > ,
2840
- where_clause : & ast:: WhereClause ,
2876
+ predicates : & [ ast:: WherePredicate ] ,
2877
+ where_span : Span ,
2841
2878
brace_style : BraceStyle ,
2842
2879
shape : Shape ,
2843
2880
on_new_line : bool ,
@@ -2846,14 +2883,15 @@ fn rewrite_where_clause(
2846
2883
span_end_before_where : BytePos ,
2847
2884
where_clause_option : WhereClauseOption ,
2848
2885
) -> Option < String > {
2849
- if where_clause . predicates . is_empty ( ) {
2886
+ if predicates. is_empty ( ) {
2850
2887
return Some ( String :: new ( ) ) ;
2851
2888
}
2852
2889
2853
2890
if context. config . indent_style ( ) == IndentStyle :: Block {
2854
2891
return rewrite_where_clause_rfc_style (
2855
2892
context,
2856
- where_clause,
2893
+ predicates,
2894
+ where_span,
2857
2895
shape,
2858
2896
terminator,
2859
2897
span_end,
@@ -2873,15 +2911,15 @@ fn rewrite_where_clause(
2873
2911
// be out by a char or two.
2874
2912
2875
2913
let budget = context. config . max_width ( ) - offset. width ( ) ;
2876
- let span_start = where_clause . predicates [ 0 ] . span ( ) . lo ( ) ;
2914
+ let span_start = predicates[ 0 ] . span ( ) . lo ( ) ;
2877
2915
// If we don't have the start of the next span, then use the end of the
2878
2916
// predicates, but that means we miss comments.
2879
- let len = where_clause . predicates . len ( ) ;
2880
- let end_of_preds = where_clause . predicates [ len - 1 ] . span ( ) . hi ( ) ;
2917
+ let len = predicates. len ( ) ;
2918
+ let end_of_preds = predicates[ len - 1 ] . span ( ) . hi ( ) ;
2881
2919
let span_end = span_end. unwrap_or ( end_of_preds) ;
2882
2920
let items = itemize_list (
2883
2921
context. snippet_provider ,
2884
- where_clause . predicates . iter ( ) ,
2922
+ predicates. iter ( ) ,
2885
2923
terminator,
2886
2924
"," ,
2887
2925
|pred| pred. span ( ) . lo ( ) ,
@@ -2936,12 +2974,13 @@ fn rewrite_where_clause(
2936
2974
2937
2975
fn missing_span_before_after_where (
2938
2976
before_item_span_end : BytePos ,
2939
- where_clause : & ast:: WhereClause ,
2977
+ predicates : & [ ast:: WherePredicate ] ,
2978
+ where_span : Span ,
2940
2979
) -> ( Span , Span ) {
2941
- let missing_span_before = mk_sp ( before_item_span_end, where_clause . span . lo ( ) ) ;
2980
+ let missing_span_before = mk_sp ( before_item_span_end, where_span . lo ( ) ) ;
2942
2981
// 5 = `where`
2943
- let pos_after_where = where_clause . span . lo ( ) + BytePos ( 5 ) ;
2944
- let missing_span_after = mk_sp ( pos_after_where, where_clause . predicates [ 0 ] . span ( ) . lo ( ) ) ;
2982
+ let pos_after_where = where_span . lo ( ) + BytePos ( 5 ) ;
2983
+ let missing_span_after = mk_sp ( pos_after_where, predicates[ 0 ] . span ( ) . lo ( ) ) ;
2945
2984
( missing_span_before, missing_span_after)
2946
2985
}
2947
2986
@@ -3030,7 +3069,8 @@ fn format_generics(
3030
3069
}
3031
3070
let where_clause_str = rewrite_where_clause (
3032
3071
context,
3033
- & generics. where_clause ,
3072
+ & generics. where_clause . predicates ,
3073
+ generics. where_clause . span ,
3034
3074
brace_style,
3035
3075
Shape :: legacy ( budget, offset. block_only ( ) ) ,
3036
3076
true ,
0 commit comments