@@ -10,8 +10,9 @@ use syntax::visit;
10
10
use syntax:: { ast, ptr, symbol} ;
11
11
12
12
use crate :: comment:: {
13
- combine_strs_with_missing_comments, contains_comment, recover_comment_removed,
14
- recover_missing_comment_in_span, rewrite_missing_comment, FindUncommented ,
13
+ combine_strs_with_missing_comments, contains_comment, is_last_comment_block,
14
+ recover_comment_removed, recover_missing_comment_in_span, rewrite_missing_comment,
15
+ FindUncommented ,
15
16
} ;
16
17
use crate :: config:: lists:: * ;
17
18
use crate :: config:: { BraceStyle , Config , Density , IndentStyle , Version } ;
@@ -1173,11 +1174,7 @@ fn format_unit_struct(
1173
1174
) -> Option < String > {
1174
1175
let header_str = format_header ( context, p. prefix , p. ident , p. vis ) ;
1175
1176
let generics_str = if let Some ( generics) = p. generics {
1176
- let hi = if generics. where_clause . predicates . is_empty ( ) {
1177
- generics. span . hi ( )
1178
- } else {
1179
- generics. where_clause . span . hi ( )
1180
- } ;
1177
+ let hi = context. snippet_provider . span_before ( p. span , ";" ) ;
1181
1178
format_generics (
1182
1179
context,
1183
1180
generics,
@@ -2711,19 +2708,19 @@ fn format_generics(
2711
2708
let shape = Shape :: legacy ( context. budget ( used_width + offset. width ( ) ) , offset) ;
2712
2709
let mut result = rewrite_generics ( context, "" , generics, shape) ?;
2713
2710
2714
- let same_line_brace = if !generics. where_clause . predicates . is_empty ( ) || result. contains ( '\n' ) {
2711
+ // If the generics are not parameterized then generics.span.hi() == 0,
2712
+ // so we use span.lo(), which is the position after `struct Foo`.
2713
+ let span_end_before_where = if !generics. params . is_empty ( ) {
2714
+ generics. span . hi ( )
2715
+ } else {
2716
+ span. lo ( )
2717
+ } ;
2718
+ let ( same_line_brace, missed_comments) = if !generics. where_clause . predicates . is_empty ( ) {
2715
2719
let budget = context. budget ( last_line_used_width ( & result, offset. width ( ) ) ) ;
2716
2720
let mut option = WhereClauseOption :: snuggled ( & result) ;
2717
2721
if brace_pos == BracePos :: None {
2718
2722
option. suppress_comma = true ;
2719
2723
}
2720
- // If the generics are not parameterized then generics.span.hi() == 0,
2721
- // so we use span.lo(), which is the position after `struct Foo`.
2722
- let span_end_before_where = if !generics. params . is_empty ( ) {
2723
- generics. span . hi ( )
2724
- } else {
2725
- span. lo ( )
2726
- } ;
2727
2724
let where_clause_str = rewrite_where_clause (
2728
2725
context,
2729
2726
& generics. where_clause ,
@@ -2737,15 +2734,41 @@ fn format_generics(
2737
2734
false ,
2738
2735
) ?;
2739
2736
result. push_str ( & where_clause_str) ;
2740
- brace_pos == BracePos :: ForceSameLine
2741
- || brace_style == BraceStyle :: PreferSameLine
2742
- || ( generics. where_clause . predicates . is_empty ( )
2743
- && trimmed_last_line_width ( & result) == 1 )
2737
+ (
2738
+ brace_pos == BracePos :: ForceSameLine || brace_style == BraceStyle :: PreferSameLine ,
2739
+ // missed comments are taken care of in #rewrite_where_clause
2740
+ None ,
2741
+ )
2744
2742
} else {
2745
- brace_pos == BracePos :: ForceSameLine
2746
- || trimmed_last_line_width ( & result) == 1
2747
- || brace_style != BraceStyle :: AlwaysNextLine
2743
+ (
2744
+ brace_pos == BracePos :: ForceSameLine
2745
+ || ( result. contains ( '\n' ) && brace_style == BraceStyle :: PreferSameLine
2746
+ || brace_style != BraceStyle :: AlwaysNextLine )
2747
+ || trimmed_last_line_width ( & result) == 1 ,
2748
+ rewrite_missing_comment (
2749
+ mk_sp (
2750
+ span_end_before_where,
2751
+ if brace_pos == BracePos :: None {
2752
+ span. hi ( )
2753
+ } else {
2754
+ context. snippet_provider . span_before ( span, "{" )
2755
+ } ,
2756
+ ) ,
2757
+ shape,
2758
+ context,
2759
+ ) ,
2760
+ )
2748
2761
} ;
2762
+ // add missing comments
2763
+ let missed_line_comments = missed_comments
2764
+ . filter ( |missed_comments| !missed_comments. is_empty ( ) )
2765
+ . map_or ( false , |missed_comments| {
2766
+ let is_block = is_last_comment_block ( & missed_comments) ;
2767
+ let sep = if is_block { " " } else { "\n " } ;
2768
+ result. push_str ( sep) ;
2769
+ result. push_str ( & missed_comments) ;
2770
+ !is_block
2771
+ } ) ;
2749
2772
if brace_pos == BracePos :: None {
2750
2773
return Some ( result) ;
2751
2774
}
@@ -2761,7 +2784,7 @@ fn format_generics(
2761
2784
// 2 = ` {`
2762
2785
2
2763
2786
} ;
2764
- let forbid_same_line_brace = overhead > remaining_budget;
2787
+ let forbid_same_line_brace = missed_line_comments || overhead > remaining_budget;
2765
2788
if !forbid_same_line_brace && same_line_brace {
2766
2789
result. push ( ' ' ) ;
2767
2790
} else {
0 commit comments