mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-10 15:14:29 +00:00
doc_markdown: detect escaped `
`` when checking unmatched
Add explanatory comment to complex bounds check Format
This commit is contained in:
parent
2f80536e83
commit
70c8579e21
3 changed files with 46 additions and 2 deletions
|
@ -769,7 +769,18 @@ fn check_doc<'a, Events: Iterator<Item = (pulldown_cmark::Event<'a>, Range<usize
|
|||
TaskListMarker(_) | Code(_) | Rule => (),
|
||||
FootnoteReference(text) | Text(text) => {
|
||||
paragraph_range.end = range.end;
|
||||
ticks_unbalanced |= text.contains('`') && !in_code;
|
||||
let range_ = range.clone();
|
||||
ticks_unbalanced |= text.contains('`')
|
||||
&& !in_code
|
||||
&& doc[range.clone()].bytes().enumerate().any(|(i, c)| {
|
||||
// scan the markdown source code bytes for backquotes that aren't preceded by backslashes
|
||||
// - use bytes, instead of chars, to avoid utf8 decoding overhead (special chars are ascii)
|
||||
// - relevant backquotes are within doc[range], but backslashes are not, because they're not
|
||||
// actually part of the rendered text (pulldown-cmark doesn't emit any events for escapes)
|
||||
// - if `range_.start + i == 0`, then `range_.start + i - 1 == -1`, and since we're working in
|
||||
// usize, that would underflow and maybe panic
|
||||
c == b'`' && (range_.start + i == 0 || doc.as_bytes().get(range_.start + i - 1) != Some(&b'\\'))
|
||||
});
|
||||
if Some(&text) == in_link.as_ref() || ticks_unbalanced {
|
||||
// Probably a link of the form `<http://example.com>`
|
||||
// Which are represented as a link to "http://example.com" with
|
||||
|
|
|
@ -49,3 +49,20 @@ fn other_markdown() {}
|
|||
/// pub struct Struct;
|
||||
/// ```
|
||||
fn issue_7421() {}
|
||||
|
||||
/// `
|
||||
//~^ ERROR: backticks are unbalanced
|
||||
fn escape_0() {}
|
||||
|
||||
/// Escaped \` backticks don't count.
|
||||
fn escape_1() {}
|
||||
|
||||
/// Escaped \` \` backticks don't count.
|
||||
fn escape_2() {}
|
||||
|
||||
/// Escaped \` ` backticks don't count, but unescaped backticks do.
|
||||
//~^ ERROR: backticks are unbalanced
|
||||
fn escape_3() {}
|
||||
|
||||
/// Backslashes ` \` within code blocks don't count.
|
||||
fn escape_4() {}
|
||||
|
|
|
@ -78,5 +78,21 @@ help: try
|
|||
LL | /// - This item needs `backticks_here`
|
||||
| ~~~~~~~~~~~~~~~~
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
error: backticks are unbalanced
|
||||
--> tests/ui/doc/unbalanced_ticks.rs:53:5
|
||||
|
|
||||
LL | /// `
|
||||
| ^
|
||||
|
|
||||
= help: a backtick may be missing a pair
|
||||
|
||||
error: backticks are unbalanced
|
||||
--> tests/ui/doc/unbalanced_ticks.rs:63:5
|
||||
|
|
||||
LL | /// Escaped \` ` backticks don't count, but unescaped backticks do.
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: a backtick may be missing a pair
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
|
|
Loading…
Reference in a new issue