|
1 | 1 | use super::*;
|
2 | 2 |
|
| 3 | +use rustc_data_structures::captures::Captures; |
3 | 4 | use rustc_middle::mir::coverage::*;
|
4 | 5 | use rustc_middle::mir::{self, Body, Coverage, CoverageInfo};
|
5 | 6 | use rustc_middle::query::Providers;
|
@@ -66,15 +67,8 @@ impl CoverageVisitor {
|
66 | 67 | }
|
67 | 68 |
|
68 | 69 | 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); |
78 | 72 | }
|
79 | 73 | }
|
80 | 74 |
|
@@ -115,23 +109,25 @@ fn coverageinfo<'tcx>(tcx: TyCtxt<'tcx>, instance_def: ty::InstanceDef<'tcx>) ->
|
115 | 109 |
|
116 | 110 | fn covered_code_regions(tcx: TyCtxt<'_>, def_id: DefId) -> Vec<&CodeRegion> {
|
117 | 111 | 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()) |
132 | 115 | .collect()
|
133 | 116 | }
|
134 | 117 |
|
| 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 | + |
135 | 131 | fn is_inlined(body: &Body<'_>, statement: &Statement<'_>) -> bool {
|
136 | 132 | let scope_data = &body.source_scopes[statement.source_info.scope];
|
137 | 133 | scope_data.inlined.is_some() || scope_data.inlined_parent_scope.is_some()
|
|
0 commit comments