@@ -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 ,
@@ -1437,7 +1440,8 @@ fn format_tuple_struct(
14371440 let option = WhereClauseOption :: new ( true , WhereClauseSpace :: Newline ) ;
14381441 rewrite_where_clause (
14391442 context,
1440- & generics. where_clause ,
1443+ & generics. where_clause . predicates ,
1444+ generics. where_clause . span ,
14411445 context. config . brace_style ( ) ,
14421446 Shape :: legacy ( where_budget, offset. block_only ( ) ) ,
14431447 false ,
@@ -1503,6 +1507,8 @@ struct TyAliasRewriteInfo<'c, 'g>(
15031507 & ' c RewriteContext < ' c > ,
15041508 Indent ,
15051509 & ' g ast:: Generics ,
1510+ ( ast:: TyAliasWhereClause , ast:: TyAliasWhereClause ) ,
1511+ usize ,
15061512 symbol:: Ident ,
15071513 Span ,
15081514) ;
@@ -1521,14 +1527,24 @@ pub(crate) fn rewrite_type_alias<'a, 'b>(
15211527 ref generics,
15221528 ref bounds,
15231529 ref ty,
1530+ where_clauses,
1531+ where_predicates_split,
15241532 } = * ty_alias_kind;
15251533 let ty_opt = ty. as_ref ( ) ;
15261534 let ( ident, vis) = match visitor_kind {
15271535 Item ( i) => ( i. ident , & i. vis ) ,
15281536 AssocTraitItem ( i) | AssocImplItem ( i) => ( i. ident , & i. vis ) ,
15291537 ForeignItem ( i) => ( i. ident , & i. vis ) ,
15301538 } ;
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+ ) ;
15321548 let op_ty = opaque_ty ( ty) ;
15331549 // Type Aliases are formatted slightly differently depending on the context
15341550 // in which they appear, whether they are opaque, and whether they are associated.
@@ -1564,7 +1580,22 @@ fn rewrite_ty<R: Rewrite>(
15641580 vis : & ast:: Visibility ,
15651581) -> Option < String > {
15661582 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+ }
15681599 result. push_str ( & format ! ( "{}type " , format_visibility( context, vis) ) ) ;
15691600 let ident_str = rewrite_ident ( context, ident) ;
15701601
@@ -1595,7 +1626,8 @@ fn rewrite_ty<R: Rewrite>(
15951626 }
15961627 let where_clause_str = rewrite_where_clause (
15971628 context,
1598- & generics. where_clause ,
1629+ before_where_predicates,
1630+ where_clauses. 0 . 1 ,
15991631 context. config . brace_style ( ) ,
16001632 Shape :: legacy ( where_budget, indent) ,
16011633 false ,
@@ -1609,7 +1641,7 @@ fn rewrite_ty<R: Rewrite>(
16091641 if let Some ( ty) = rhs {
16101642 // If there's a where clause, add a newline before the assignment. Otherwise just add a
16111643 // space.
1612- let has_where = !generics . where_clause . predicates . is_empty ( ) ;
1644+ let has_where = !before_where_predicates . is_empty ( ) ;
16131645 if has_where {
16141646 result. push_str ( & indent. to_string_with_newline ( context. config ) ) ;
16151647 } else {
@@ -1619,7 +1651,7 @@ fn rewrite_ty<R: Rewrite>(
16191651 let comment_span = context
16201652 . snippet_provider
16211653 . 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) ) ;
16231655
16241656 let lhs = match comment_span {
16251657 Some ( comment_span)
@@ -2176,7 +2208,7 @@ fn rewrite_fn_base(
21762208 let generics_str = rewrite_generics (
21772209 context,
21782210 rewrite_ident ( context, ident) ,
2179- fn_sig. generics ,
2211+ & fn_sig. generics ,
21802212 shape,
21812213 ) ?;
21822214 result. push_str ( & generics_str) ;
@@ -2416,7 +2448,8 @@ fn rewrite_fn_base(
24162448 }
24172449 let where_clause_str = rewrite_where_clause (
24182450 context,
2419- where_clause,
2451+ & where_clause. predicates ,
2452+ where_clause. span ,
24202453 context. config . brace_style ( ) ,
24212454 Shape :: indented ( indent, context. config ) ,
24222455 true ,
@@ -2692,7 +2725,8 @@ fn generics_shape_from_config(config: &Config, shape: Shape, offset: usize) -> O
26922725
26932726fn rewrite_where_clause_rfc_style (
26942727 context : & RewriteContext < ' _ > ,
2695- where_clause : & ast:: WhereClause ,
2728+ predicates : & [ ast:: WherePredicate ] ,
2729+ where_span : Span ,
26962730 shape : Shape ,
26972731 terminator : & str ,
26982732 span_end : Option < BytePos > ,
@@ -2701,7 +2735,8 @@ fn rewrite_where_clause_rfc_style(
27012735) -> Option < String > {
27022736 let ( where_keyword, allow_single_line) = rewrite_where_keyword (
27032737 context,
2704- where_clause,
2738+ predicates,
2739+ where_span,
27052740 shape,
27062741 span_end_before_where,
27072742 where_clause_option,
@@ -2714,12 +2749,12 @@ fn rewrite_where_clause_rfc_style(
27142749 . block_left ( context. config . tab_spaces ( ) ) ?
27152750 . sub_width ( 1 ) ?;
27162751 let force_single_line = context. config . where_single_line ( )
2717- && where_clause . predicates . len ( ) == 1
2752+ && predicates. len ( ) == 1
27182753 && !where_clause_option. veto_single_line ;
27192754
27202755 let preds_str = rewrite_bounds_on_where_clause (
27212756 context,
2722- where_clause ,
2757+ predicates ,
27232758 clause_shape,
27242759 terminator,
27252760 span_end,
@@ -2743,7 +2778,8 @@ fn rewrite_where_clause_rfc_style(
27432778/// Rewrite `where` and comment around it.
27442779fn rewrite_where_keyword (
27452780 context : & RewriteContext < ' _ > ,
2746- where_clause : & ast:: WhereClause ,
2781+ predicates : & [ ast:: WherePredicate ] ,
2782+ where_span : Span ,
27472783 shape : Shape ,
27482784 span_end_before_where : BytePos ,
27492785 where_clause_option : WhereClauseOption ,
@@ -2763,7 +2799,7 @@ fn rewrite_where_keyword(
27632799 } ;
27642800
27652801 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 ) ;
27672803 let ( comment_before, comment_after) =
27682804 rewrite_comments_before_after_where ( context, span_before, span_after, shape) ?;
27692805
@@ -2789,22 +2825,22 @@ fn rewrite_where_keyword(
27892825/// Rewrite bounds on a where clause.
27902826fn rewrite_bounds_on_where_clause (
27912827 context : & RewriteContext < ' _ > ,
2792- where_clause : & ast:: WhereClause ,
2828+ predicates : & [ ast:: WherePredicate ] ,
27932829 shape : Shape ,
27942830 terminator : & str ,
27952831 span_end : Option < BytePos > ,
27962832 where_clause_option : WhereClauseOption ,
27972833 force_single_line : bool ,
27982834) -> Option < String > {
2799- let span_start = where_clause . predicates [ 0 ] . span ( ) . lo ( ) ;
2835+ let span_start = predicates[ 0 ] . span ( ) . lo ( ) ;
28002836 // If we don't have the start of the next span, then use the end of the
28012837 // 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 ( ) ;
28042840 let span_end = span_end. unwrap_or ( end_of_preds) ;
28052841 let items = itemize_list (
28062842 context. snippet_provider ,
2807- where_clause . predicates . iter ( ) ,
2843+ predicates. iter ( ) ,
28082844 terminator,
28092845 "," ,
28102846 |pred| pred. span ( ) . lo ( ) ,
@@ -2837,7 +2873,8 @@ fn rewrite_bounds_on_where_clause(
28372873
28382874fn rewrite_where_clause (
28392875 context : & RewriteContext < ' _ > ,
2840- where_clause : & ast:: WhereClause ,
2876+ predicates : & [ ast:: WherePredicate ] ,
2877+ where_span : Span ,
28412878 brace_style : BraceStyle ,
28422879 shape : Shape ,
28432880 on_new_line : bool ,
@@ -2846,14 +2883,15 @@ fn rewrite_where_clause(
28462883 span_end_before_where : BytePos ,
28472884 where_clause_option : WhereClauseOption ,
28482885) -> Option < String > {
2849- if where_clause . predicates . is_empty ( ) {
2886+ if predicates. is_empty ( ) {
28502887 return Some ( String :: new ( ) ) ;
28512888 }
28522889
28532890 if context. config . indent_style ( ) == IndentStyle :: Block {
28542891 return rewrite_where_clause_rfc_style (
28552892 context,
2856- where_clause,
2893+ predicates,
2894+ where_span,
28572895 shape,
28582896 terminator,
28592897 span_end,
@@ -2873,15 +2911,15 @@ fn rewrite_where_clause(
28732911 // be out by a char or two.
28742912
28752913 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 ( ) ;
28772915 // If we don't have the start of the next span, then use the end of the
28782916 // 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 ( ) ;
28812919 let span_end = span_end. unwrap_or ( end_of_preds) ;
28822920 let items = itemize_list (
28832921 context. snippet_provider ,
2884- where_clause . predicates . iter ( ) ,
2922+ predicates. iter ( ) ,
28852923 terminator,
28862924 "," ,
28872925 |pred| pred. span ( ) . lo ( ) ,
@@ -2936,12 +2974,13 @@ fn rewrite_where_clause(
29362974
29372975fn missing_span_before_after_where (
29382976 before_item_span_end : BytePos ,
2939- where_clause : & ast:: WhereClause ,
2977+ predicates : & [ ast:: WherePredicate ] ,
2978+ where_span : Span ,
29402979) -> ( 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 ( ) ) ;
29422981 // 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 ( ) ) ;
29452984 ( missing_span_before, missing_span_after)
29462985}
29472986
@@ -3030,7 +3069,8 @@ fn format_generics(
30303069 }
30313070 let where_clause_str = rewrite_where_clause (
30323071 context,
3033- & generics. where_clause ,
3072+ & generics. where_clause . predicates ,
3073+ generics. where_clause . span ,
30343074 brace_style,
30353075 Shape :: legacy ( budget, offset. block_only ( ) ) ,
30363076 true ,
0 commit comments