@@ -366,15 +366,10 @@ impl SpanFromMir {
366366 }
367367}
368368
369- pub ( super ) fn extract_branch_mappings (
369+ fn resolve_block_markers (
370+ branch_info : & mir:: coverage:: BranchInfo ,
370371 mir_body : & mir:: Body < ' _ > ,
371- body_span : Span ,
372- basic_coverage_blocks : & CoverageGraph ,
373- ) -> Vec < BcbMapping > {
374- let Some ( branch_info) = mir_body. coverage_branch_info . as_deref ( ) else {
375- return vec ! [ ] ;
376- } ;
377-
372+ ) -> IndexVec < BlockMarkerId , Option < BasicBlock > > {
378373 let mut block_markers = IndexVec :: < BlockMarkerId , Option < BasicBlock > > :: from_elem_n (
379374 None ,
380375 branch_info. num_block_markers ,
@@ -389,6 +384,58 @@ pub(super) fn extract_branch_mappings(
389384 }
390385 }
391386
387+ block_markers
388+ }
389+
390+ // FIXME: There is currently a lot of redundancy between
391+ // `extract_branch_mappings` and `extract_mcdc_mappings`. This is needed so
392+ // that they can each be modified without interfering with the other, but in
393+ // the long term we should try to bring them together again when branch coverage
394+ // and MC/DC coverage support are more mature.
395+
396+ pub ( super ) fn extract_branch_mappings (
397+ mir_body : & mir:: Body < ' _ > ,
398+ hir_info : & ExtractedHirInfo ,
399+ basic_coverage_blocks : & CoverageGraph ,
400+ ) -> Vec < BcbMapping > {
401+ let Some ( branch_info) = mir_body. coverage_branch_info . as_deref ( ) else { return vec ! [ ] } ;
402+
403+ let block_markers = resolve_block_markers ( branch_info, mir_body) ;
404+
405+ branch_info
406+ . branch_spans
407+ . iter ( )
408+ . filter_map ( |& BranchSpan { span : raw_span, true_marker, false_marker } | {
409+ // For now, ignore any branch span that was introduced by
410+ // expansion. This makes things like assert macros less noisy.
411+ if !raw_span. ctxt ( ) . outer_expn_data ( ) . is_root ( ) {
412+ return None ;
413+ }
414+ let ( span, _) =
415+ unexpand_into_body_span_with_visible_macro ( raw_span, hir_info. body_span ) ?;
416+
417+ let bcb_from_marker =
418+ |marker : BlockMarkerId | basic_coverage_blocks. bcb_from_bb ( block_markers[ marker] ?) ;
419+
420+ let true_bcb = bcb_from_marker ( true_marker) ?;
421+ let false_bcb = bcb_from_marker ( false_marker) ?;
422+
423+ Some ( BcbMapping { kind : BcbMappingKind :: Branch { true_bcb, false_bcb } , span } )
424+ } )
425+ . collect :: < Vec < _ > > ( )
426+ }
427+
428+ pub ( super ) fn extract_mcdc_mappings (
429+ mir_body : & mir:: Body < ' _ > ,
430+ body_span : Span ,
431+ basic_coverage_blocks : & CoverageGraph ,
432+ ) -> Vec < BcbMapping > {
433+ let Some ( branch_info) = mir_body. coverage_branch_info . as_deref ( ) else {
434+ return vec ! [ ] ;
435+ } ;
436+
437+ let block_markers = resolve_block_markers ( branch_info, mir_body) ;
438+
392439 let bcb_from_marker =
393440 |marker : BlockMarkerId | basic_coverage_blocks. bcb_from_bb ( block_markers[ marker] ?) ;
394441
@@ -406,12 +453,6 @@ pub(super) fn extract_branch_mappings(
406453 Some ( ( span, true_bcb, false_bcb) )
407454 } ;
408455
409- let branch_filter_map = |& BranchSpan { span : raw_span, true_marker, false_marker } | {
410- check_branch_bcb ( raw_span, true_marker, false_marker) . map ( |( span, true_bcb, false_bcb) | {
411- BcbMapping { kind : BcbMappingKind :: Branch { true_bcb, false_bcb } , span }
412- } )
413- } ;
414-
415456 let mcdc_branch_filter_map =
416457 |& MCDCBranchSpan { span : raw_span, true_marker, false_marker, condition_info } | {
417458 check_branch_bcb ( raw_span, true_marker, false_marker) . map (
@@ -446,10 +487,7 @@ pub(super) fn extract_branch_mappings(
446487 } )
447488 } ;
448489
449- branch_info
450- . branch_spans
451- . iter ( )
452- . filter_map ( branch_filter_map)
490+ std:: iter:: empty ( )
453491 . chain ( branch_info. mcdc_branch_spans . iter ( ) . filter_map ( mcdc_branch_filter_map) )
454492 . chain ( branch_info. mcdc_decision_spans . iter ( ) . filter_map ( decision_filter_map) )
455493 . collect :: < Vec < _ > > ( )
0 commit comments