@@ -428,6 +428,27 @@ impl<'a, F: Write> TokenHandler<'a, '_, F> {
428428 }
429429 }
430430 }
431+
432+ /// Used when we're done with the current expansion "original code" (ie code before expansion).
433+ /// We close all tags inside `Class::Original` and only keep the ones that were not closed yet.
434+ fn close_original_tag ( & mut self ) {
435+ let mut classes_to_reopen = Vec :: new ( ) ;
436+ while let Some ( mut class_info) = self . class_stack . open_classes . pop ( ) {
437+ if class_info. class == Class :: Original {
438+ while let Some ( class_info) = classes_to_reopen. pop ( ) {
439+ self . class_stack . open_classes . push ( class_info) ;
440+ }
441+ class_info. close_tag ( self . out ) ;
442+ return ;
443+ }
444+ class_info. close_tag ( self . out ) ;
445+ if !class_info. pending_exit {
446+ class_info. closing_tag = None ;
447+ classes_to_reopen. push ( class_info) ;
448+ }
449+ }
450+ panic ! ( "Didn't find `Class::Original` to close" ) ;
451+ }
431452}
432453
433454impl < F : Write > Drop for TokenHandler < ' _ , ' _ , F > {
@@ -476,7 +497,9 @@ fn end_expansion<'a, W: Write>(
476497 expanded_codes : & ' a [ ExpandedCode ] ,
477498 span : Span ,
478499) -> Option < & ' a ExpandedCode > {
479- token_handler. class_stack . exit_elem ( ) ;
500+ // We close `Class::Original` and everything open inside it.
501+ token_handler. close_original_tag ( ) ;
502+ // Then we check if we have another macro expansion on the same line.
480503 let expansion = get_next_expansion ( expanded_codes, token_handler. line , span) ;
481504 if expansion. is_none ( ) {
482505 token_handler. close_expansion ( ) ;
0 commit comments