@@ -102,13 +102,6 @@ impl CurrCovspan {
102
102
let Self { span, bcb, is_closure } = self ;
103
103
PrevCovspan { span, bcb, merged_spans : vec ! [ span] , is_closure }
104
104
}
105
-
106
- fn into_refined ( self ) -> RefinedCovspan {
107
- // This is only called in cases where `curr` is a closure span that has
108
- // been carved out of `prev`.
109
- debug_assert ! ( self . is_closure) ;
110
- self . into_prev ( ) . into_refined ( )
111
- }
112
105
}
113
106
114
107
#[ derive( Debug ) ]
@@ -138,15 +131,15 @@ impl PrevCovspan {
138
131
self . span = self . span . with_hi ( max_hi) ;
139
132
}
140
133
141
- if self . merged_spans . is_empty ( ) { None } else { Some ( self . into_refined ( ) ) }
134
+ if self . merged_spans . is_empty ( ) { None } else { self . into_refined ( ) }
142
135
}
143
136
144
- fn refined_copy ( & self ) -> RefinedCovspan {
137
+ fn refined_copy ( & self ) -> Option < RefinedCovspan > {
145
138
let & Self { span, bcb, merged_spans : _, is_closure } = self ;
146
- RefinedCovspan { span, bcb, is_closure }
139
+ ( !is_closure ) . then_some ( RefinedCovspan { span, bcb } )
147
140
}
148
141
149
- fn into_refined ( self ) -> RefinedCovspan {
142
+ fn into_refined ( self ) -> Option < RefinedCovspan > {
150
143
// Even though we consume self, we can just reuse the copying impl.
151
144
self . refined_copy ( )
152
145
}
@@ -156,7 +149,6 @@ impl PrevCovspan {
156
149
struct RefinedCovspan {
157
150
span : Span ,
158
151
bcb : BasicCoverageBlock ,
159
- is_closure : bool ,
160
152
}
161
153
162
154
/// Converts the initial set of coverage spans (one per MIR `Statement` or `Terminator`) into a
@@ -225,7 +217,7 @@ impl SpansRefiner {
225
217
" different bcbs and disjoint spans, so keep curr for next iter, and add prev={prev:?}" ,
226
218
) ;
227
219
let prev = self . take_prev ( ) . into_refined ( ) ;
228
- self . refined_spans . push ( prev) ;
220
+ self . refined_spans . extend ( prev) ;
229
221
} else if prev. is_closure {
230
222
// drop any equal or overlapping span (`curr`) and keep `prev` to test again in the
231
223
// next iter
@@ -244,13 +236,9 @@ impl SpansRefiner {
244
236
// so add it to the output as well.
245
237
if let Some ( prev) = self . some_prev . take ( ) {
246
238
debug ! ( " AT END, adding last prev={prev:?}" ) ;
247
- self . refined_spans . push ( prev. into_refined ( ) ) ;
239
+ self . refined_spans . extend ( prev. into_refined ( ) ) ;
248
240
}
249
241
250
- // Remove spans derived from closures, originally added to ensure the coverage
251
- // regions for the current function leave room for the closure's own coverage regions
252
- // (injected separately, from the closure's own MIR).
253
- self . refined_spans . retain ( |covspan| !covspan. is_closure ) ;
254
242
self . refined_spans
255
243
}
256
244
@@ -313,14 +301,15 @@ impl SpansRefiner {
313
301
fn carve_out_span_for_closure ( & mut self ) {
314
302
let prev = self . prev ( ) ;
315
303
let curr = self . curr ( ) ;
304
+ assert ! ( !prev. is_closure && curr. is_closure) ;
316
305
317
306
let left_cutoff = curr. span . lo ( ) ;
318
307
let right_cutoff = curr. span . hi ( ) ;
319
308
let has_pre_closure_span = prev. span . lo ( ) < right_cutoff;
320
309
let has_post_closure_span = prev. span . hi ( ) > right_cutoff;
321
310
322
311
if has_pre_closure_span {
323
- let mut pre_closure = self . prev ( ) . refined_copy ( ) ;
312
+ let mut pre_closure = prev. refined_copy ( ) . expect ( "prev is not a closure span" ) ;
324
313
pre_closure. span = pre_closure. span . with_hi ( left_cutoff) ;
325
314
debug ! ( " prev overlaps a closure. Adding span for pre_closure={:?}" , pre_closure) ;
326
315
self . refined_spans . push ( pre_closure) ;
@@ -331,9 +320,9 @@ impl SpansRefiner {
331
320
self . prev_mut ( ) . span = self . prev ( ) . span . with_lo ( right_cutoff) ;
332
321
debug ! ( " Mutated prev.span to start after the closure. prev={:?}" , self . prev( ) ) ;
333
322
334
- // Prevent this curr from becoming prev .
335
- let closure_covspan = self . take_curr ( ) . into_refined ( ) ;
336
- self . refined_spans . push ( closure_covspan ) ; // since self.prev() was already updated
323
+ // Discard this curr, since it's a closure span .
324
+ let curr = self . take_curr ( ) ;
325
+ assert ! ( curr . is_closure ) ;
337
326
}
338
327
}
339
328
0 commit comments