Account for /// when rendering multiline spans

Don't consider `///` and `//!` docstrings to be empty for the purposes of multiline span rendering.
This commit is contained in:
Esteban Küber 2024-12-13 18:18:19 +00:00
parent ad82d9f698
commit 9f1044ef76
18 changed files with 144 additions and 43 deletions

View file

@ -3050,13 +3050,17 @@ impl FileWithAnnotatedLines {
// We'll show up to 4 lines past the beginning of the multispan start.
// We will *not* include the tail of lines that are only whitespace, a comment or
// a bare delimiter.
let filter = |s: &str| {
let s = s.trim();
// Consider comments as empty, but don't consider docstrings to be empty.
!(s.starts_with("//") && !(s.starts_with("///") || s.starts_with("//!")))
// Consider lines with nothing but whitespace, a single delimiter as empty.
&& !["", "{", "}", "(", ")", "[", "]"].contains(&s)
};
let until = (ann.line_start..middle)
.rev()
.filter_map(|line| file.get_line(line - 1).map(|s| (line + 1, s)))
.find(|(_, s)| {
let s = s.trim();
!["", "{", "}", "(", ")", "[", "]"].contains(&s) && !s.starts_with("//")
})
.find(|(_, s)| filter(s))
.map(|(line, _)| line)
.unwrap_or(ann.line_start);
for line in ann.line_start + 1..until {
@ -3064,10 +3068,7 @@ impl FileWithAnnotatedLines {
add_annotation_to_file(&mut output, Lrc::clone(&file), line, ann.as_line());
}
let line_end = ann.line_end - 1;
let end_is_empty = file.get_line(line_end - 1).map_or(false, |s| {
let s = s.trim();
["", "{", "}", "(", ")", "[", "]"].contains(&s) || s.starts_with("//")
});
let end_is_empty = file.get_line(line_end - 1).map_or(false, |s| !filter(&s));
if middle < line_end && !end_is_empty {
add_annotation_to_file(&mut output, Lrc::clone(&file), line_end, ann.as_line());
}