|
| 1 | +use std::collections::BTreeSet; |
| 2 | + |
1 | 3 | use rustc_data_structures::graph::DirectedGraph; |
2 | 4 | use rustc_index::bit_set::BitSet; |
3 | 5 | use rustc_middle::mir; |
4 | 6 | use rustc_middle::mir::coverage::ConditionInfo; |
5 | 7 | use rustc_span::{BytePos, Span}; |
6 | | -use std::collections::BTreeSet; |
7 | 8 |
|
8 | 9 | use crate::coverage::graph::{BasicCoverageBlock, CoverageGraph, START_BCB}; |
9 | | -use crate::coverage::spans::from_mir::SpanFromMir; |
| 10 | +use crate::coverage::spans::from_mir::{extract_branch_pairs, extract_mcdc_mappings, SpanFromMir}; |
10 | 11 | use crate::coverage::ExtractedHirInfo; |
11 | 12 |
|
12 | 13 | mod from_mir; |
@@ -91,28 +92,11 @@ pub(super) fn generate_coverage_spans( |
91 | 92 | mappings.push(BcbMapping { kind: BcbMappingKind::Code(START_BCB), span }); |
92 | 93 | } |
93 | 94 | } else { |
94 | | - let sorted_spans = from_mir::mir_to_initial_sorted_coverage_spans( |
95 | | - mir_body, |
96 | | - hir_info, |
97 | | - basic_coverage_blocks, |
98 | | - ); |
99 | | - let coverage_spans = SpansRefiner::refine_sorted_spans(sorted_spans); |
100 | | - mappings.extend(coverage_spans.into_iter().map(|RefinedCovspan { bcb, span, .. }| { |
101 | | - // Each span produced by the generator represents an ordinary code region. |
102 | | - BcbMapping { kind: BcbMappingKind::Code(bcb), span } |
103 | | - })); |
104 | | - |
105 | | - branch_pairs.extend(from_mir::extract_branch_pairs( |
106 | | - mir_body, |
107 | | - hir_info, |
108 | | - basic_coverage_blocks, |
109 | | - )); |
110 | | - |
111 | | - mappings.extend(from_mir::extract_mcdc_mappings( |
112 | | - mir_body, |
113 | | - hir_info.body_span, |
114 | | - basic_coverage_blocks, |
115 | | - )); |
| 95 | + extract_refined_covspans(mir_body, hir_info, basic_coverage_blocks, &mut mappings); |
| 96 | + |
| 97 | + branch_pairs.extend(extract_branch_pairs(mir_body, hir_info, basic_coverage_blocks)); |
| 98 | + |
| 99 | + mappings.extend(extract_mcdc_mappings(mir_body, hir_info.body_span, basic_coverage_blocks)); |
116 | 100 | } |
117 | 101 |
|
118 | 102 | if mappings.is_empty() && branch_pairs.is_empty() { |
@@ -149,6 +133,27 @@ pub(super) fn generate_coverage_spans( |
149 | 133 | Some(CoverageSpans { bcb_has_mappings, mappings, branch_pairs, test_vector_bitmap_bytes }) |
150 | 134 | } |
151 | 135 |
|
| 136 | +#[allow(unused_imports)] // Remove this line during the actual split. |
| 137 | +// FIXME(#124545) It's awkward that we have to re-export this, because it's an |
| 138 | +// internal detail of `from_mir` that is also needed when handling branch and |
| 139 | +// MC/DC spans. Ideally we would find a more natural home for it. |
| 140 | +pub(super) use from_mir::unexpand_into_body_span_with_visible_macro; |
| 141 | + |
| 142 | +pub(super) fn extract_refined_covspans( |
| 143 | + mir_body: &mir::Body<'_>, |
| 144 | + hir_info: &ExtractedHirInfo, |
| 145 | + basic_coverage_blocks: &CoverageGraph, |
| 146 | + mappings: &mut impl Extend<BcbMapping>, |
| 147 | +) { |
| 148 | + let sorted_spans = |
| 149 | + from_mir::mir_to_initial_sorted_coverage_spans(mir_body, hir_info, basic_coverage_blocks); |
| 150 | + let coverage_spans = SpansRefiner::refine_sorted_spans(sorted_spans); |
| 151 | + mappings.extend(coverage_spans.into_iter().map(|RefinedCovspan { bcb, span, .. }| { |
| 152 | + // Each span produced by the generator represents an ordinary code region. |
| 153 | + BcbMapping { kind: BcbMappingKind::Code(bcb), span } |
| 154 | + })); |
| 155 | +} |
| 156 | + |
152 | 157 | #[derive(Debug)] |
153 | 158 | struct CurrCovspan { |
154 | 159 | span: Span, |
|
0 commit comments