@@ -265,14 +265,25 @@ fn empty_line_number(out: &mut impl Write, _: u32, extra: &'static str) {
265
265
out. write_str ( extra) . unwrap ( ) ;
266
266
}
267
267
268
+ fn get_next_expansion < ' a > (
269
+ expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
270
+ line : u32 ,
271
+ span : Span ,
272
+ ) -> Option < & ' a ExpandedCode > {
273
+ if let Some ( expanded_codes) = expanded_codes {
274
+ expanded_codes. iter ( ) . find ( |code| code. start_line == line && code. span . lo ( ) >= span. lo ( ) )
275
+ } else {
276
+ None
277
+ }
278
+ }
279
+
268
280
fn get_expansion < ' a , W : Write > (
269
281
token_handler : & mut TokenHandler < ' _ , ' _ , W > ,
270
282
expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
271
283
line : u32 ,
284
+ span : Span ,
272
285
) -> Option < & ' a ExpandedCode > {
273
- if let Some ( expanded_codes) = expanded_codes
274
- && let Some ( expanded_code) = expanded_codes. iter ( ) . find ( |code| code. start_line == line)
275
- {
286
+ if let Some ( expanded_code) = get_next_expansion ( expanded_codes, line, span) {
276
287
let ( closing, reopening) = if let Some ( current_class) = token_handler. current_class
277
288
&& let class = current_class. as_html ( )
278
289
&& !class. is_empty ( )
@@ -307,10 +318,21 @@ fn start_expansion(out: &mut Vec<(Cow<'_, str>, Option<Class>)>, expanded_code:
307
318
) ) ;
308
319
}
309
320
310
- fn end_expansion < W : Write > ( token_handler : & mut TokenHandler < ' _ , ' _ , W > , level : usize ) {
321
+ fn end_expansion < ' a , W : Write > (
322
+ token_handler : & mut TokenHandler < ' _ , ' _ , W > ,
323
+ expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
324
+ level : usize ,
325
+ line : u32 ,
326
+ span : Span ,
327
+ ) -> Option < & ' a ExpandedCode > {
328
+ if let Some ( expanded_code) = get_next_expansion ( expanded_codes, line, span) {
329
+ // We close the current "original" content.
330
+ token_handler. pending_elems . push ( ( Cow :: Borrowed ( "</span>" ) , Some ( Class :: Expansion ) ) ) ;
331
+ return Some ( expanded_code) ;
332
+ }
311
333
if level == 0 {
312
334
token_handler. pending_elems . push ( ( Cow :: Borrowed ( "</span></span>" ) , Some ( Class :: Expansion ) ) ) ;
313
- return ;
335
+ return None ;
314
336
}
315
337
let mut out = String :: new ( ) ;
316
338
let mut end = String :: new ( ) ;
@@ -323,6 +345,7 @@ fn end_expansion<W: Write>(token_handler: &mut TokenHandler<'_, '_, W>, level: u
323
345
token_handler
324
346
. pending_elems
325
347
. push ( ( Cow :: Owned ( format ! ( "</span></span>{out}{end}" ) ) , Some ( Class :: Expansion ) ) ) ;
348
+ None
326
349
}
327
350
328
351
#[ derive( Clone , Copy ) ]
@@ -392,11 +415,14 @@ pub(super) fn write_code(
392
415
( 0 , u32:: MAX )
393
416
} ;
394
417
395
- let expanded_codes = token_handler
396
- . href_context
397
- . as_ref ( )
398
- . and_then ( |c| c. context . shared . expanded_codes . get ( & c. file_span . lo ( ) ) ) ;
399
- let mut current_expansion = get_expansion ( & mut token_handler, expanded_codes, line) ;
418
+ let ( expanded_codes, file_span) = match token_handler. href_context . as_ref ( ) . and_then ( |c| {
419
+ let expanded_codes = c. context . shared . expanded_codes . get ( & c. file_span . lo ( ) ) ?;
420
+ Some ( ( expanded_codes, c. file_span ) )
421
+ } ) {
422
+ Some ( ( expanded_codes, file_span) ) => ( Some ( expanded_codes) , file_span) ,
423
+ None => ( None , DUMMY_SP ) ,
424
+ } ;
425
+ let mut current_expansion = get_expansion ( & mut token_handler, expanded_codes, line, file_span) ;
400
426
token_handler. write_pending_elems ( None ) ;
401
427
let mut level = 0 ;
402
428
@@ -436,7 +462,8 @@ pub(super) fn write_code(
436
462
. push ( ( Cow :: Borrowed ( text) , Some ( Class :: Backline ( line) ) ) ) ;
437
463
}
438
464
if current_expansion. is_none ( ) {
439
- current_expansion = get_expansion ( & mut token_handler, expanded_codes, line) ;
465
+ current_expansion =
466
+ get_expansion ( & mut token_handler, expanded_codes, line, span) ;
440
467
}
441
468
} else {
442
469
token_handler. pending_elems . push ( ( Cow :: Borrowed ( text) , class) ) ;
@@ -452,9 +479,11 @@ pub(super) fn write_code(
452
479
}
453
480
}
454
481
if need_end {
455
- end_expansion ( & mut token_handler, level) ;
456
- current_expansion = None ;
457
- level = 0 ;
482
+ current_expansion =
483
+ end_expansion ( & mut token_handler, expanded_codes, level, line, span) ;
484
+ if current_expansion. is_none ( ) {
485
+ level = 0 ;
486
+ }
458
487
}
459
488
}
460
489
}
0 commit comments