|
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