@@ -554,9 +554,7 @@ impl<'a, I: Iterator<Item = Event<'a>>> Iterator for Footnotes<'a, I> {
554554pub fn find_testable_code < T : test:: Tester > ( doc : & str , tests : & mut T , error_codes : ErrorCodes ,
555555 enable_per_target_ignores : bool ) {
556556 let mut parser = Parser :: new ( doc) . into_offset_iter ( ) ;
557- let mut nb_lines = 0 ;
558557 let mut register_header = None ;
559- let mut prev_offset = 0 ;
560558 while let Some ( ( event, offset) ) = parser. next ( ) {
561559 match event {
562560 Event :: Start ( Tag :: CodeBlock ( s) ) => {
@@ -578,10 +576,10 @@ pub fn find_testable_code<T: test::Tester>(doc: &str, tests: &mut T, error_codes
578576 . map ( |l| map_line ( l) . for_code ( ) )
579577 . collect :: < Vec < Cow < ' _ , str > > > ( )
580578 . join ( "\n " ) ;
581- nb_lines += doc[ prev_offset..offset. end ] . lines ( ) . count ( ) ;
579+ // "+ 1" is to take into account the start of the code block
580+ let nb_lines = doc[ ..offset. start ] . lines ( ) . count ( ) + 1 ;
582581 let line = tests. get_line ( ) + nb_lines;
583582 tests. add_test ( text, block_info, line) ;
584- prev_offset = offset. start ;
585583 }
586584 Event :: Start ( Tag :: Heading ( level) ) => {
587585 register_header = Some ( level as u32 ) ;
@@ -927,8 +925,8 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
927925 let mut code_block = None ;
928926 let mut code_start = 0 ;
929927 let mut is_fenced = false ;
930- let mut previous_offset = Range { start : 0 , end : 0 } ;
931928 let mut in_rust_code_block = false ;
929+ let mut previous_offset = Range { start : 0 , end : 0 } ;
932930 while let Some ( ( event, offset_range) ) = p. next ( ) {
933931 match event {
934932 Event :: Start ( Tag :: CodeBlock ( syntax) ) => {
@@ -942,35 +940,31 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
942940 in_rust_code_block = true ;
943941 code_block = Some ( offset_range. clone ( ) ) ;
944942
945- code_start = match md[ offset_range. clone ( ) ] . find ( "```" ) {
946- Some ( _) => {
947- is_fenced = true ;
948- offset_range. start + md[ offset_range. clone ( ) ]
949- . lines ( )
950- . next ( )
951- . map_or ( 0 , |x| x. len ( ) + 1 )
952- }
953- None => {
954- is_fenced = false ;
955- offset_range. start
956- }
943+ code_start = if !md[ previous_offset. end ..offset_range. start ] . ends_with ( " " ) {
944+ is_fenced = true ;
945+ offset_range. start + md[ offset_range. clone ( ) ]
946+ . lines ( )
947+ . next ( )
948+ . map_or ( 0 , |x| x. len ( ) + 1 )
949+ } else {
950+ is_fenced = false ;
951+ offset_range. start
957952 } ;
958- previous_offset = Range { start : code_start, end : offset_range. end } ;
959953 }
960954 }
961955 Event :: End ( Tag :: CodeBlock ( syntax) ) if in_rust_code_block => {
962956 in_rust_code_block = false ;
963957
964958 let code_end = if is_fenced {
965- let last_len = md[ previous_offset . clone ( ) ]
959+ let last_len = md[ offset_range . clone ( ) ]
966960 . lines ( )
967961 . last ( )
962+ . filter ( |l| l. ends_with ( "```" ) )
968963 . map_or ( 0 , |l| l. len ( ) ) ;
969- previous_offset . end - last_len
964+ offset_range . end - last_len
970965 } else {
971- previous_offset . end
966+ offset_range . end
972967 } ;
973-
974968 code_blocks. push ( RustCodeBlock {
975969 is_fenced,
976970 range : code_block. clone ( ) . unwrap ( ) ,
@@ -987,6 +981,7 @@ crate fn rust_code_blocks(md: &str) -> Vec<RustCodeBlock> {
987981 }
988982 _ => ( ) ,
989983 }
984+ previous_offset = offset_range;
990985 }
991986
992987 code_blocks
0 commit comments