1
Fork 0

Correctly escape hashtags when running invalid_rust_codeblocks lint

This commit is contained in:
Guillaume Gomez 2025-02-12 15:47:18 +01:00
parent 8c04e39595
commit 54f59c6dda
3 changed files with 12 additions and 4 deletions

View file

@ -786,6 +786,7 @@ impl IndividualTestOptions {
/// [`clean`]: crate::clean
/// [`run_merged_tests`]: crate::doctest::runner::DocTestRunner::run_merged_tests
/// [`generate_unique_doctest`]: crate::doctest::make::DocTestBuilder::generate_unique_doctest
#[derive(Debug)]
pub(crate) struct ScrapedDocTest {
filename: FileName,
line: usize,

View file

@ -140,7 +140,7 @@ impl ErrorCodes {
/// Controls whether a line will be hidden or shown in HTML output.
///
/// All lines are used in documentation tests.
enum Line<'a> {
pub(crate) enum Line<'a> {
Hidden(&'a str),
Shown(Cow<'a, str>),
}
@ -153,7 +153,7 @@ impl<'a> Line<'a> {
}
}
fn for_code(self) -> Cow<'a, str> {
pub(crate) fn for_code(self) -> Cow<'a, str> {
match self {
Line::Shown(l) => l,
Line::Hidden(l) => Cow::Borrowed(l),
@ -161,12 +161,14 @@ impl<'a> Line<'a> {
}
}
/// This function is used to handle the "hidden lines" (ie starting with `#`) in
/// doctests. It also transforms `##` back into `#`.
// FIXME: There is a minor inconsistency here. For lines that start with ##, we
// have no easy way of removing a potential single space after the hashes, which
// is done in the single # case. This inconsistency seems okay, if non-ideal. In
// order to fix it we'd have to iterate to find the first non-# character, and
// then reallocate to remove it; which would make us return a String.
fn map_line(s: &str) -> Line<'_> {
pub(crate) fn map_line(s: &str) -> Line<'_> {
let trimmed = s.trim();
if trimmed.starts_with("##") {
Line::Shown(Cow::Owned(s.replacen("##", "#", 1)))

View file

@ -1,5 +1,6 @@
//! Validates syntax inside Rust code blocks (\`\`\`rust).
use std::borrow::Cow;
use std::sync::Arc;
use rustc_data_structures::sync::Lock;
@ -43,7 +44,11 @@ fn check_rust_syntax(
let sm = Arc::new(SourceMap::new(FilePathMapping::empty()));
let dcx = DiagCtxt::new(Box::new(emitter)).disable_warnings();
let source = dox[code_block.code].to_owned();
let source = dox[code_block.code]
.lines()
.map(|line| crate::html::markdown::map_line(line).for_code())
.intersperse(Cow::Borrowed("\n"))
.collect::<String>();
let psess = ParseSess::with_dcx(dcx, sm);
let edition = code_block.lang_string.edition.unwrap_or_else(|| cx.tcx.sess.edition());