@@ -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,57 @@ 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+ body_span : Span ,
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, _) = unexpand_into_body_span_with_visible_macro ( raw_span, body_span) ?;
415+
416+ let bcb_from_marker =
417+ |marker : BlockMarkerId | basic_coverage_blocks. bcb_from_bb ( block_markers[ marker] ?) ;
418+
419+ let true_bcb = bcb_from_marker ( true_marker) ?;
420+ let false_bcb = bcb_from_marker ( false_marker) ?;
421+
422+ Some ( BcbMapping { kind : BcbMappingKind :: Branch { true_bcb, false_bcb } , span } )
423+ } )
424+ . collect :: < Vec < _ > > ( )
425+ }
426+
427+ pub ( super ) fn extract_mcdc_mappings (
428+ mir_body : & mir:: Body < ' _ > ,
429+ body_span : Span ,
430+ basic_coverage_blocks : & CoverageGraph ,
431+ ) -> Vec < BcbMapping > {
432+ let Some ( branch_info) = mir_body. coverage_branch_info . as_deref ( ) else {
433+ return vec ! [ ] ;
434+ } ;
435+
436+ let block_markers = resolve_block_markers ( branch_info, mir_body) ;
437+
392438 let bcb_from_marker =
393439 |marker : BlockMarkerId | basic_coverage_blocks. bcb_from_bb ( block_markers[ marker] ?) ;
394440
@@ -406,12 +452,6 @@ pub(super) fn extract_branch_mappings(
406452 Some ( ( span, true_bcb, false_bcb) )
407453 } ;
408454
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-
415455 let mcdc_branch_filter_map =
416456 |& MCDCBranchSpan { span : raw_span, true_marker, false_marker, condition_info } | {
417457 check_branch_bcb ( raw_span, true_marker, false_marker) . map (
@@ -446,10 +486,7 @@ pub(super) fn extract_branch_mappings(
446486 } )
447487 } ;
448488
449- branch_info
450- . branch_spans
451- . iter ( )
452- . filter_map ( branch_filter_map)
489+ std:: iter:: empty ( )
453490 . chain ( branch_info. mcdc_branch_spans . iter ( ) . filter_map ( mcdc_branch_filter_map) )
454491 . chain ( branch_info. mcdc_decision_spans . iter ( ) . filter_map ( decision_filter_map) )
455492 . collect :: < Vec < _ > > ( )
0 commit comments