@@ -366,15 +366,10 @@ impl SpanFromMir {
366
366
}
367
367
}
368
368
369
- pub ( super ) fn extract_branch_mappings (
369
+ fn resolve_block_markers (
370
+ branch_info : & mir:: coverage:: BranchInfo ,
370
371
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 > > {
378
373
let mut block_markers = IndexVec :: < BlockMarkerId , Option < BasicBlock > > :: from_elem_n (
379
374
None ,
380
375
branch_info. num_block_markers ,
@@ -389,6 +384,58 @@ pub(super) fn extract_branch_mappings(
389
384
}
390
385
}
391
386
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
+
392
439
let bcb_from_marker =
393
440
|marker : BlockMarkerId | basic_coverage_blocks. bcb_from_bb ( block_markers[ marker] ?) ;
394
441
@@ -406,12 +453,6 @@ pub(super) fn extract_branch_mappings(
406
453
Some ( ( span, true_bcb, false_bcb) )
407
454
} ;
408
455
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
-
415
456
let mcdc_branch_filter_map =
416
457
|& MCDCBranchSpan { span : raw_span, true_marker, false_marker, condition_info } | {
417
458
check_branch_bcb ( raw_span, true_marker, false_marker) . map (
@@ -446,10 +487,7 @@ pub(super) fn extract_branch_mappings(
446
487
} )
447
488
} ;
448
489
449
- branch_info
450
- . branch_spans
451
- . iter ( )
452
- . filter_map ( branch_filter_map)
490
+ std:: iter:: empty ( )
453
491
. chain ( branch_info. mcdc_branch_spans . iter ( ) . filter_map ( mcdc_branch_filter_map) )
454
492
. chain ( branch_info. mcdc_decision_spans . iter ( ) . filter_map ( decision_filter_map) )
455
493
. collect :: < Vec < _ > > ( )
0 commit comments