@@ -272,14 +272,25 @@ fn empty_line_number(out: &mut impl Write, _: u32, extra: &'static str) {
272
272
out. write_str ( extra) . unwrap ( ) ;
273
273
}
274
274
275
+ fn get_next_expansion < ' a > (
276
+ expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
277
+ line : u32 ,
278
+ span : Span ,
279
+ ) -> Option < & ' a ExpandedCode > {
280
+ if let Some ( expanded_codes) = expanded_codes {
281
+ expanded_codes. iter ( ) . find ( |code| code. start_line == line && code. span . lo ( ) >= span. lo ( ) )
282
+ } else {
283
+ None
284
+ }
285
+ }
286
+
275
287
fn get_expansion < ' a , W : Write > (
276
288
token_handler : & mut TokenHandler < ' _ , ' _ , W > ,
277
289
expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
278
290
line : u32 ,
291
+ span : Span ,
279
292
) -> Option < & ' a ExpandedCode > {
280
- if let Some ( expanded_codes) = expanded_codes
281
- && let Some ( expanded_code) = expanded_codes. iter ( ) . find ( |code| code. start_line == line)
282
- {
293
+ if let Some ( expanded_code) = get_next_expansion ( expanded_codes, line, span) {
283
294
let ( closing, reopening) = if let Some ( current_class) = token_handler. current_class
284
295
&& let class = current_class. as_html ( )
285
296
&& !class. is_empty ( )
@@ -314,10 +325,21 @@ fn start_expansion(out: &mut Vec<(Cow<'_, str>, Option<Class>)>, expanded_code:
314
325
) ) ;
315
326
}
316
327
317
- fn end_expansion < W : Write > ( token_handler : & mut TokenHandler < ' _ , ' _ , W > , level : usize ) {
328
+ fn end_expansion < ' a , W : Write > (
329
+ token_handler : & mut TokenHandler < ' _ , ' _ , W > ,
330
+ expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
331
+ level : usize ,
332
+ line : u32 ,
333
+ span : Span ,
334
+ ) -> Option < & ' a ExpandedCode > {
335
+ if let Some ( expanded_code) = get_next_expansion ( expanded_codes, line, span) {
336
+ // We close the current "original" content.
337
+ token_handler. pending_elems . push ( ( Cow :: Borrowed ( "</span>" ) , Some ( Class :: Expansion ) ) ) ;
338
+ return Some ( expanded_code) ;
339
+ }
318
340
if level == 0 {
319
341
token_handler. pending_elems . push ( ( Cow :: Borrowed ( "</span></span>" ) , Some ( Class :: Expansion ) ) ) ;
320
- return ;
342
+ return None ;
321
343
}
322
344
let mut out = String :: new ( ) ;
323
345
let mut end = String :: new ( ) ;
@@ -330,6 +352,7 @@ fn end_expansion<W: Write>(token_handler: &mut TokenHandler<'_, '_, W>, level: u
330
352
token_handler
331
353
. pending_elems
332
354
. push ( ( Cow :: Owned ( format ! ( "</span></span>{out}{end}" ) ) , Some ( Class :: Expansion ) ) ) ;
355
+ None
333
356
}
334
357
335
358
#[ derive( Clone , Copy ) ]
@@ -399,11 +422,14 @@ pub(super) fn write_code(
399
422
( 0 , u32:: MAX )
400
423
} ;
401
424
402
- let expanded_codes = token_handler
403
- . href_context
404
- . as_ref ( )
405
- . and_then ( |c| c. context . shared . expanded_codes . get ( & c. file_span . lo ( ) ) ) ;
406
- let mut current_expansion = get_expansion ( & mut token_handler, expanded_codes, line) ;
425
+ let ( expanded_codes, file_span) = match token_handler. href_context . as_ref ( ) . and_then ( |c| {
426
+ let expanded_codes = c. context . shared . expanded_codes . get ( & c. file_span . lo ( ) ) ?;
427
+ Some ( ( expanded_codes, c. file_span ) )
428
+ } ) {
429
+ Some ( ( expanded_codes, file_span) ) => ( Some ( expanded_codes) , file_span) ,
430
+ None => ( None , DUMMY_SP ) ,
431
+ } ;
432
+ let mut current_expansion = get_expansion ( & mut token_handler, expanded_codes, line, file_span) ;
407
433
token_handler. write_pending_elems ( None ) ;
408
434
let mut level = 0 ;
409
435
@@ -443,7 +469,8 @@ pub(super) fn write_code(
443
469
. push ( ( Cow :: Borrowed ( text) , Some ( Class :: Backline ( line) ) ) ) ;
444
470
}
445
471
if current_expansion. is_none ( ) {
446
- current_expansion = get_expansion ( & mut token_handler, expanded_codes, line) ;
472
+ current_expansion =
473
+ get_expansion ( & mut token_handler, expanded_codes, line, span) ;
447
474
}
448
475
} else {
449
476
token_handler. pending_elems . push ( ( Cow :: Borrowed ( text) , class) ) ;
@@ -459,9 +486,11 @@ pub(super) fn write_code(
459
486
}
460
487
}
461
488
if need_end {
462
- end_expansion ( & mut token_handler, level) ;
463
- current_expansion = None ;
464
- level = 0 ;
489
+ current_expansion =
490
+ end_expansion ( & mut token_handler, expanded_codes, level, line, span) ;
491
+ if current_expansion. is_none ( ) {
492
+ level = 0 ;
493
+ }
465
494
}
466
495
}
467
496
}
0 commit comments