@@ -272,14 +272,25 @@ fn empty_line_number(out: &mut impl Write, _: u32, extra: &'static str) {
272272 out. write_str ( extra) . unwrap ( ) ;
273273}
274274
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+
275287fn get_expansion < ' a , W : Write > (
276288 token_handler : & mut TokenHandler < ' _ , ' _ , W > ,
277289 expanded_codes : Option < & ' a Vec < ExpandedCode > > ,
278290 line : u32 ,
291+ span : Span ,
279292) -> 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) {
283294 let ( closing, reopening) = if let Some ( current_class) = token_handler. current_class
284295 && let class = current_class. as_html ( )
285296 && !class. is_empty ( )
@@ -314,10 +325,21 @@ fn start_expansion(out: &mut Vec<(Cow<'_, str>, Option<Class>)>, expanded_code:
314325 ) ) ;
315326}
316327
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+ }
318340 if level == 0 {
319341 token_handler. pending_elems . push ( ( Cow :: Borrowed ( "</span></span>" ) , Some ( Class :: Expansion ) ) ) ;
320- return ;
342+ return None ;
321343 }
322344 let mut out = String :: new ( ) ;
323345 let mut end = String :: new ( ) ;
@@ -330,6 +352,7 @@ fn end_expansion<W: Write>(token_handler: &mut TokenHandler<'_, '_, W>, level: u
330352 token_handler
331353 . pending_elems
332354 . push ( ( Cow :: Owned ( format ! ( "</span></span>{out}{end}" ) ) , Some ( Class :: Expansion ) ) ) ;
355+ None
333356}
334357
335358#[ derive( Clone , Copy ) ]
@@ -399,11 +422,14 @@ pub(super) fn write_code(
399422 ( 0 , u32:: MAX )
400423 } ;
401424
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) ;
407433 token_handler. write_pending_elems ( None ) ;
408434 let mut level = 0 ;
409435
@@ -443,7 +469,8 @@ pub(super) fn write_code(
443469 . push ( ( Cow :: Borrowed ( text) , Some ( Class :: Backline ( line) ) ) ) ;
444470 }
445471 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) ;
447474 }
448475 } else {
449476 token_handler. pending_elems . push ( ( Cow :: Borrowed ( text) , class) ) ;
@@ -459,9 +486,11 @@ pub(super) fn write_code(
459486 }
460487 }
461488 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+ }
465494 }
466495 }
467496 }
0 commit comments