Skip to content

Commit 0199665

Browse files
Correctly handle multiple macro expansions on a same line
1 parent 7b818f8 commit 0199665

File tree

2 files changed

+49
-18
lines changed

2 files changed

+49
-18
lines changed

src/librustdoc/html/highlight.rs

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
275287
fn 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
}

src/librustdoc/html/static/css/rustdoc.css

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -970,10 +970,10 @@ ul.block, .block li, .block ul {
970970
display: none;
971971
}
972972

973-
.src .example-wrap [data-nosnippet] {
973+
.example-wrap [data-nosnippet] {
974974
width: calc(var(--example-wrap-digits-count) + var(--line-number-padding) * 2);
975975
}
976-
.src .example-wrap pre > code {
976+
.example-wrap pre > code {
977977
padding-left: calc(
978978
var(--example-wrap-digits-count) + var(--line-number-padding) * 2
979979
+ var(--line-number-right-margin));
@@ -999,11 +999,13 @@ ul.block, .block li, .block ul {
999999
}
10001000
.example-wrap pre > code {
10011001
position: relative;
1002-
word-break: break-all;
10031002
display: block;
1003+
}
1004+
:root.word-wrap-source-code .example-wrap pre > code {
1005+
word-break: break-all;
10041006
white-space: pre-wrap;
10051007
}
1006-
.example-wrap pre > code * {
1008+
:root.word-wrap-source-code .example-wrap pre > code * {
10071009
word-break: break-all;
10081010
}
10091011
.example-wrap [data-nosnippet]:target {

0 commit comments

Comments
 (0)