Skip to content

Commit 3e2c614

Browse files
Fix invalid tag closing when leaving expansion "original code"
1 parent 23fced0 commit 3e2c614

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

src/librustdoc/html/highlight.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

433454
impl<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

Comments
 (0)