@@ -696,17 +696,19 @@ impl<'a> Iterator for CursorLines<'a> {
696
696
}
697
697
698
698
fn format_message (
699
- snippet:: Message {
699
+ message : snippet:: Message < ' _ > ,
700
+ term_width : usize ,
701
+ anonymized_line_numbers : bool ,
702
+ primary : bool ,
703
+ ) -> Vec < DisplaySet < ' _ > > {
704
+ let snippet:: Message {
700
705
level,
701
706
id,
702
707
title,
703
708
footer,
704
709
snippets,
705
- } : snippet:: Message < ' _ > ,
706
- term_width : usize ,
707
- anonymized_line_numbers : bool ,
708
- primary : bool ,
709
- ) -> Vec < DisplaySet < ' _ > > {
710
+ } = message;
711
+
710
712
let mut sets = vec ! [ ] ;
711
713
let body = if !snippets. is_empty ( ) || primary {
712
714
vec ! [ format_title( level, id, title) ]
@@ -715,6 +717,7 @@ fn format_message(
715
717
} ;
716
718
717
719
for ( idx, snippet) in snippets. into_iter ( ) . enumerate ( ) {
720
+ let snippet = fold_prefix_suffix ( snippet) ;
718
721
sets. push ( format_snippet (
719
722
snippet,
720
723
idx == 0 ,
@@ -876,6 +879,46 @@ fn format_header<'a>(
876
879
None
877
880
}
878
881
882
+ fn fold_prefix_suffix ( mut snippet : snippet:: Snippet < ' _ > ) -> snippet:: Snippet < ' _ > {
883
+ if !snippet. fold {
884
+ return snippet;
885
+ }
886
+
887
+ let ann_start = snippet
888
+ . annotations
889
+ . iter ( )
890
+ . map ( |ann| ann. range . start )
891
+ . min ( )
892
+ . unwrap_or ( 0 ) ;
893
+ if let Some ( before_new_start) = snippet. source [ 0 ..ann_start] . rfind ( '\n' ) {
894
+ let new_start = before_new_start + 1 ;
895
+
896
+ let line_offset = snippet. source [ ..new_start] . lines ( ) . count ( ) ;
897
+ snippet. line_start += line_offset;
898
+
899
+ snippet. source = & snippet. source [ new_start..] ;
900
+
901
+ for ann in & mut snippet. annotations {
902
+ let range_start = ann. range . start - new_start;
903
+ let range_end = ann. range . end - new_start;
904
+ ann. range = range_start..range_end;
905
+ }
906
+ }
907
+
908
+ let ann_end = snippet
909
+ . annotations
910
+ . iter ( )
911
+ . map ( |ann| ann. range . end )
912
+ . max ( )
913
+ . unwrap_or ( snippet. source . len ( ) ) ;
914
+ if let Some ( end_offset) = snippet. source [ ann_end..] . find ( '\n' ) {
915
+ let new_end = ann_end + end_offset;
916
+ snippet. source = & snippet. source [ ..new_end] ;
917
+ }
918
+
919
+ snippet
920
+ }
921
+
879
922
fn fold_body ( mut body : Vec < DisplayLine < ' _ > > ) -> Vec < DisplayLine < ' _ > > {
880
923
enum Line {
881
924
Fold ( usize ) ,
0 commit comments