Skip to content

Commit 3f54946

Browse files
committed
coverage: Extract a common iterator over a function's coverage statements
Both of the coverage queries can now use this one helper function to iterate over all of the `mir::Coverage` payloads in the statements of a `mir::Body`.
1 parent d5573d7 commit 3f54946

File tree

1 file changed

+19
-23
lines changed
  • compiler/rustc_mir_transform/src/coverage

1 file changed

+19
-23
lines changed

compiler/rustc_mir_transform/src/coverage/query.rs

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::*;
22

3+
use rustc_data_structures::captures::Captures;
34
use rustc_middle::mir::coverage::*;
45
use rustc_middle::mir::{self, Body, Coverage, CoverageInfo};
56
use rustc_middle::query::Providers;
@@ -66,15 +67,8 @@ impl CoverageVisitor {
6667
}
6768

6869
fn visit_body(&mut self, body: &Body<'_>) {
69-
for bb_data in body.basic_blocks.iter() {
70-
for statement in bb_data.statements.iter() {
71-
if let StatementKind::Coverage(box ref coverage) = statement.kind {
72-
if is_inlined(body, statement) {
73-
continue;
74-
}
75-
self.visit_coverage(coverage);
76-
}
77-
}
70+
for coverage in all_coverage_in_mir_body(body) {
71+
self.visit_coverage(coverage);
7872
}
7973
}
8074

@@ -115,23 +109,25 @@ fn coverageinfo<'tcx>(tcx: TyCtxt<'tcx>, instance_def: ty::InstanceDef<'tcx>) ->
115109

116110
fn covered_code_regions(tcx: TyCtxt<'_>, def_id: DefId) -> Vec<&CodeRegion> {
117111
let body = mir_body(tcx, def_id);
118-
body.basic_blocks
119-
.iter()
120-
.flat_map(|data| {
121-
data.statements.iter().filter_map(|statement| match statement.kind {
122-
StatementKind::Coverage(box ref coverage) => {
123-
if is_inlined(body, statement) {
124-
None
125-
} else {
126-
coverage.code_region.as_ref() // may be None
127-
}
128-
}
129-
_ => None,
130-
})
131-
})
112+
all_coverage_in_mir_body(body)
113+
// Not all coverage statements have an attached code region.
114+
.filter_map(|coverage| coverage.code_region.as_ref())
132115
.collect()
133116
}
134117

118+
fn all_coverage_in_mir_body<'a, 'tcx>(
119+
body: &'a Body<'tcx>,
120+
) -> impl Iterator<Item = &'a Coverage> + Captures<'tcx> {
121+
body.basic_blocks.iter().flat_map(|bb_data| &bb_data.statements).filter_map(|statement| {
122+
match statement.kind {
123+
StatementKind::Coverage(box ref coverage) if !is_inlined(body, statement) => {
124+
Some(coverage)
125+
}
126+
_ => None,
127+
}
128+
})
129+
}
130+
135131
fn is_inlined(body: &Body<'_>, statement: &Statement<'_>) -> bool {
136132
let scope_data = &body.source_scopes[statement.source_info.scope];
137133
scope_data.inlined.is_some() || scope_data.inlined_parent_scope.is_some()

0 commit comments

Comments
 (0)