mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-30 16:43:41 +00:00
Auto merge of #87489 - bdalrhm:rustdoc-line-num, r=CraftSpider
`rustdoc`: compute correct line number for indented rust code blocks. This PR fixes a bug in `rustdoc` where it computes the wrong line number for indented rust code blocks (and subsequent blocks) it finds in markdown strings. To fix this issue, we decrement the line number if we find characters between the code block and the preceding line ending. I noticed this issue as I was trying to use `rustdoc` to extract examples from The Rust Reference and run them through the [Rust Model Checker](https://github.com/model-checking/rmc).
This commit is contained in:
commit
c9db3e0fbc
@ -692,6 +692,12 @@ crate fn find_testable_code<T: doctest::Tester>(
|
||||
.join("\n");
|
||||
|
||||
nb_lines += doc[prev_offset..offset.start].lines().count();
|
||||
// If there are characters between the preceding line ending and
|
||||
// this code block, `str::lines` will return an additional line,
|
||||
// which we subtract here.
|
||||
if nb_lines != 0 && !&doc[prev_offset..offset.start].ends_with("\n") {
|
||||
nb_lines -= 1;
|
||||
}
|
||||
let line = tests.get_line() + nb_lines + 1;
|
||||
tests.add_test(text, block_info, line);
|
||||
prev_offset = offset.start;
|
||||
|
@ -1,4 +1,4 @@
|
||||
use super::{plain_text_summary, short_markdown_summary};
|
||||
use super::{find_testable_code, plain_text_summary, short_markdown_summary};
|
||||
use super::{ErrorCodes, IdMap, Ignore, LangString, Markdown, MarkdownHtml};
|
||||
use rustc_span::edition::{Edition, DEFAULT_EDITION};
|
||||
|
||||
@ -300,3 +300,25 @@ fn test_markdown_html_escape() {
|
||||
t("Struct<'a, T>", "<p>Struct<’a, T></p>\n");
|
||||
t("Struct<br>", "<p>Struct<br></p>\n");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_find_testable_code_line() {
|
||||
fn t(input: &str, expect: &[usize]) {
|
||||
impl crate::doctest::Tester for Vec<usize> {
|
||||
fn add_test(&mut self, _test: String, _config: LangString, line: usize) {
|
||||
self.push(line);
|
||||
}
|
||||
}
|
||||
let mut lines = Vec::<usize>::new();
|
||||
find_testable_code(input, &mut lines, ErrorCodes::No, false, None);
|
||||
assert_eq!(lines, expect);
|
||||
}
|
||||
|
||||
t("", &[]);
|
||||
t("```rust\n```", &[1]);
|
||||
t(" ```rust\n```", &[1]);
|
||||
t("\n```rust\n```", &[2]);
|
||||
t("\n ```rust\n```", &[2]);
|
||||
t("```rust\n```\n```rust\n```", &[1, 3]);
|
||||
t("```rust\n```\n ```rust\n```", &[1, 3]);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user