@@ -694,7 +694,8 @@ pub(crate) fn format_impl(
694694 let where_span_end = context. snippet_provider . opt_span_before ( missing_span, "{" ) ;
695695 let where_clause_str = rewrite_where_clause (
696696 context,
697- & generics. where_clause ,
697+ & generics. where_clause . predicates ,
698+ generics. where_clause . span ,
698699 context. config . brace_style ( ) ,
699700 Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
700701 false ,
@@ -1059,7 +1060,8 @@ pub(crate) fn format_trait(
10591060 let option = WhereClauseOption :: snuggled ( & generics_str) ;
10601061 let where_clause_str = rewrite_where_clause (
10611062 context,
1062- & generics. where_clause ,
1063+ & generics. where_clause . predicates ,
1064+ generics. where_clause . span ,
10631065 context. config . brace_style ( ) ,
10641066 Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
10651067 where_on_new_line,
@@ -1178,7 +1180,8 @@ impl<'a> Rewrite for TraitAliasBounds<'a> {
11781180
11791181 let where_str = rewrite_where_clause (
11801182 context,
1181- & self . generics . where_clause ,
1183+ & self . generics . where_clause . predicates ,
1184+ self . generics . where_clause . span ,
11821185 context. config . brace_style ( ) ,
11831186 shape,
11841187 false ,
@@ -1441,7 +1444,8 @@ fn format_tuple_struct(
14411444 let option = WhereClauseOption :: new ( true , WhereClauseSpace :: Newline ) ;
14421445 rewrite_where_clause (
14431446 context,
1444- & generics. where_clause ,
1447+ & generics. where_clause . predicates ,
1448+ generics. where_clause . span ,
14451449 context. config . brace_style ( ) ,
14461450 Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
14471451 false ,
@@ -1507,6 +1511,8 @@ struct TyAliasRewriteInfo<'c, 'g>(
15071511 & ' c RewriteContext < ' c > ,
15081512 Indent ,
15091513 & ' g ast:: Generics ,
1514+ ( ast:: TyAliasWhereClause , ast:: TyAliasWhereClause ) ,
1515+ usize ,
15101516 symbol:: Ident ,
15111517 Span ,
15121518) ;
@@ -1525,14 +1531,24 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
15251531 ref generics,
15261532 ref bounds,
15271533 ref ty,
1534+ where_clauses,
1535+ where_predicates_split,
15281536 } = * ty_alias_kind;
15291537 let ty_opt = ty. as_ref ( ) ;
15301538 let ( ident, vis) = match visitor_kind {
15311539 Item ( i) => ( i. ident , & i. vis ) ,
15321540 AssocTraitItem ( i) | AssocImplItem ( i) => ( i. ident , & i. vis ) ,
15331541 ForeignItem ( i) => ( i. ident , & i. vis ) ,
15341542 } ;
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+ ) ;
15361552 let op_ty = opaque_ty ( ty) ;
15371553 // Type Aliases are formatted slightly differently depending on the context
15381554 // in which they appear, whether they are opaque, and whether they are associated.
@@ -1568,7 +1584,22 @@ fn rewrite_ty<R: Rewrite>(
15681584 vis : & ast:: Visibility ,
15691585) -> Option < String > {
15701586 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+ }
15721603 result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
15731604 let ident_str = rewrite_ident ( context, ident) ;
15741605
@@ -1599,7 +1630,8 @@ fn rewrite_ty<R: Rewrite>(
15991630 }
16001631 let where_clause_str = rewrite_where_clause (
16011632 context,
1602- & generics. where_clause ,
1633+ before_where_predicates,
1634+ where_clauses. 0 . 1 ,
16031635 context. config . brace_style ( ) ,
16041636 Shape :: legacy ( where_budget, indent) ,
16051637 false ,
@@ -1613,7 +1645,7 @@ fn rewrite_ty<R: Rewrite>(
16131645 if let Some ( ty) = rhs {
16141646 // If there's a where clause, add a newline before the assignment. Otherwise just add a
16151647 // space.
1616- let has_where = !generics . where_clause . predicates . is_empty ( ) ;
1648+ let has_where = !before_where_predicates . is_empty ( ) ;
16171649 if has_where {
16181650 result. push_str ( & indent. to_string_with_newline ( context. config ) ) ;
16191651 } else {
@@ -1623,7 +1655,7 @@ fn rewrite_ty<R: Rewrite>(
16231655 let comment_span = context
16241656 . snippet_provider
16251657 . 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) ) ;
16271659
16281660 let lhs = match comment_span {
16291661 Some ( comment_span)
@@ -2186,7 +2218,7 @@ fn rewrite_fn_base(
21862218 let generics_str = rewrite_generics (
21872219 context,
21882220 rewrite_ident ( context, ident) ,
2189- fn_sig. generics ,
2221+ & fn_sig. generics ,
21902222 shape,
21912223 ) ?;
21922224 result. push_str ( & generics_str) ;
@@ -2426,7 +2458,8 @@ fn rewrite_fn_base(
24262458 }
24272459 let where_clause_str = rewrite_where_clause (
24282460 context,
2429- where_clause,
2461+ & where_clause. predicates ,
2462+ where_clause. span ,
24302463 context. config . brace_style ( ) ,
24312464 Shape :: indented ( indent, context. config ) ,
24322465 true ,
@@ -2702,7 +2735,8 @@ fn generics_shape_from_config(config: &Config, shape: Shape, offset: usize) -> O
27022735
27032736fn rewrite_where_clause_rfc_style (
27042737 context : & RewriteContext < ' _ > ,
2705- where_clause : & ast:: WhereClause ,
2738+ predicates : & [ ast:: WherePredicate ] ,
2739+ where_span : Span ,
27062740 shape : Shape ,
27072741 terminator : & str ,
27082742 span_end : Option < BytePos > ,
@@ -2711,7 +2745,8 @@ fn rewrite_where_clause_rfc_style(
27112745) -> Option < String > {
27122746 let ( where_keyword, allow_single_line) = rewrite_where_keyword (
27132747 context,
2714- where_clause,
2748+ predicates,
2749+ where_span,
27152750 shape,
27162751 span_end_before_where,
27172752 where_clause_option,
@@ -2724,12 +2759,12 @@ fn rewrite_where_clause_rfc_style(
27242759 . block_left ( context. config . tab_spaces ( ) ) ?
27252760 . sub_width ( 1 ) ?;
27262761 let force_single_line = context. config . where_single_line ( )
2727- && where_clause . predicates . len ( ) == 1
2762+ && predicates. len ( ) == 1
27282763 && !where_clause_option. veto_single_line ;
27292764
27302765 let preds_str = rewrite_bounds_on_where_clause (
27312766 context,
2732- where_clause ,
2767+ predicates ,
27332768 clause_shape,
27342769 terminator,
27352770 span_end,
@@ -2753,7 +2788,8 @@ fn rewrite_where_clause_rfc_style(
27532788/// Rewrite `where` and comment around it.
27542789fn rewrite_where_keyword (
27552790 context : & RewriteContext < ' _ > ,
2756- where_clause : & ast:: WhereClause ,
2791+ predicates : & [ ast:: WherePredicate ] ,
2792+ where_span : Span ,
27572793 shape : Shape ,
27582794 span_end_before_where : BytePos ,
27592795 where_clause_option : WhereClauseOption ,
@@ -2773,7 +2809,7 @@ fn rewrite_where_keyword(
27732809 } ;
27742810
27752811 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 ) ;
27772813 let ( comment_before, comment_after) =
27782814 rewrite_comments_before_after_where ( context, span_before, span_after, shape) ?;
27792815
@@ -2799,22 +2835,22 @@ fn rewrite_where_keyword(
27992835/// Rewrite bounds on a where clause.
28002836fn rewrite_bounds_on_where_clause (
28012837 context : & RewriteContext < ' _ > ,
2802- where_clause : & ast:: WhereClause ,
2838+ predicates : & [ ast:: WherePredicate ] ,
28032839 shape : Shape ,
28042840 terminator : & str ,
28052841 span_end : Option < BytePos > ,
28062842 where_clause_option : WhereClauseOption ,
28072843 force_single_line : bool ,
28082844) -> Option < String > {
2809- let span_start = where_clause . predicates [ 0 ] . span ( ) . lo ( ) ;
2845+ let span_start = predicates[ 0 ] . span ( ) . lo ( ) ;
28102846 // If we don't have the start of the next span, then use the end of the
28112847 // 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 ( ) ;
28142850 let span_end = span_end. unwrap_or ( end_of_preds) ;
28152851 let items = itemize_list (
28162852 context. snippet_provider ,
2817- where_clause . predicates . iter ( ) ,
2853+ predicates. iter ( ) ,
28182854 terminator,
28192855 "," ,
28202856 |pred| pred. span ( ) . lo ( ) ,
@@ -2847,7 +2883,8 @@ fn rewrite_bounds_on_where_clause(
28472883
28482884fn rewrite_where_clause (
28492885 context : & RewriteContext < ' _ > ,
2850- where_clause : & ast:: WhereClause ,
2886+ predicates : & [ ast:: WherePredicate ] ,
2887+ where_span : Span ,
28512888 brace_style : BraceStyle ,
28522889 shape : Shape ,
28532890 on_new_line : bool ,
@@ -2856,14 +2893,15 @@ fn rewrite_where_clause(
28562893 span_end_before_where : BytePos ,
28572894 where_clause_option : WhereClauseOption ,
28582895) -> Option < String > {
2859- if where_clause . predicates . is_empty ( ) {
2896+ if predicates. is_empty ( ) {
28602897 return Some ( String :: new ( ) ) ;
28612898 }
28622899
28632900 if context. config . indent_style ( ) == IndentStyle :: Block {
28642901 return rewrite_where_clause_rfc_style (
28652902 context,
2866- where_clause,
2903+ predicates,
2904+ where_span,
28672905 shape,
28682906 terminator,
28692907 span_end,
@@ -2883,15 +2921,15 @@ fn rewrite_where_clause(
28832921 // be out by a char or two.
28842922
28852923 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 ( ) ;
28872925 // If we don't have the start of the next span, then use the end of the
28882926 // 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 ( ) ;
28912929 let span_end = span_end. unwrap_or ( end_of_preds) ;
28922930 let items = itemize_list (
28932931 context. snippet_provider ,
2894- where_clause . predicates . iter ( ) ,
2932+ predicates. iter ( ) ,
28952933 terminator,
28962934 "," ,
28972935 |pred| pred. span ( ) . lo ( ) ,
@@ -2946,12 +2984,13 @@ fn rewrite_where_clause(
29462984
29472985fn missing_span_before_after_where (
29482986 before_item_span_end : BytePos ,
2949- where_clause : & ast:: WhereClause ,
2987+ predicates : & [ ast:: WherePredicate ] ,
2988+ where_span : Span ,
29502989) -> ( 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 ( ) ) ;
29522991 // 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 ( ) ) ;
29552994 ( missing_span_before, missing_span_after)
29562995}
29572996
@@ -3040,7 +3079,8 @@ fn format_generics(
30403079 }
30413080 let where_clause_str = rewrite_where_clause (
30423081 context,
3043- & generics. where_clause ,
3082+ & generics. where_clause . predicates ,
3083+ generics. where_clause . span ,
30443084 brace_style,
30453085 Shape :: legacy ( budget, offset. block_only ( ) ) ,
30463086 true ,
0 commit comments