@@ -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,57 @@ 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
+ 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
+
392
438
let bcb_from_marker =
393
439
|marker : BlockMarkerId | basic_coverage_blocks. bcb_from_bb ( block_markers[ marker] ?) ;
394
440
@@ -406,12 +452,6 @@ pub(super) fn extract_branch_mappings(
406
452
Some ( ( span, true_bcb, false_bcb) )
407
453
} ;
408
454
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
455
let mcdc_branch_filter_map =
416
456
|& MCDCBranchSpan { span : raw_span, true_marker, false_marker, condition_info } | {
417
457
check_branch_bcb ( raw_span, true_marker, false_marker) . map (
@@ -446,10 +486,7 @@ pub(super) fn extract_branch_mappings(
446
486
} )
447
487
} ;
448
488
449
- branch_info
450
- . branch_spans
451
- . iter ( )
452
- . filter_map ( branch_filter_map)
489
+ std:: iter:: empty ( )
453
490
. chain ( branch_info. mcdc_branch_spans . iter ( ) . filter_map ( mcdc_branch_filter_map) )
454
491
. chain ( branch_info. mcdc_decision_spans . iter ( ) . filter_map ( decision_filter_map) )
455
492
. collect :: < Vec < _ > > ( )
0 commit comments