diff --git a/src/doc.rs b/src/doc.rs index 6212a025c..cf32c1731 100644 --- a/src/doc.rs +++ b/src/doc.rs @@ -126,6 +126,7 @@ pub fn check_doc(cx: &EarlyContext, valid_idents: &[String], doc: &str, span: Sp span } + let mut new_line = true; let len = doc.len(); let mut chars = doc.char_indices().peekable(); let mut current_word_begin = 0; @@ -133,8 +134,8 @@ pub fn check_doc(cx: &EarlyContext, valid_idents: &[String], doc: &str, span: Sp match chars.next() { Some((_, c)) => { match c { - c if c.is_whitespace() => { - current_word_begin = jump_to!(@next_char, chars, len); + '#' if new_line => { // don’t warn on titles + current_word_begin = jump_to!(chars, '\n', len); } '`' => { current_word_begin = jump_to!(chars, '`', len); @@ -171,6 +172,10 @@ pub fn check_doc(cx: &EarlyContext, valid_idents: &[String], doc: &str, span: Sp None => return, } } + // anything that’s neither alphanumeric nor '_' is not part of an ident anyway + c if !c.is_alphanumeric() && c != '_' => { + current_word_begin = jump_to!(@next_char, chars, len); + } _ => { let end = match chars.find(|&(_, c)| !is_word_char(c)) { Some((end, _)) => end, @@ -181,6 +186,8 @@ pub fn check_doc(cx: &EarlyContext, valid_idents: &[String], doc: &str, span: Sp current_word_begin = jump_to!(@next_char, chars, len); } } + + new_line = c == '\n' || (new_line && c.is_whitespace()); } None => break, } diff --git a/tests/compile-fail/doc.rs b/tests/compile-fail/doc.rs index 7a150ba37..eca9d7935 100755 --- a/tests/compile-fail/doc.rs +++ b/tests/compile-fail/doc.rs @@ -107,3 +107,37 @@ fn main() { test_emphasis(); test_units(); } + +/// ## CamelCaseThing +/// Talks about `CamelCaseThing`. Titles should be ignored, see issue #897. +/// +/// # CamelCaseThing +/// +/// Not a title #897 CamelCaseThing +//~^ ERROR: you should put `CamelCaseThing` between ticks +/// be_sure_we_got_to_the_end_of_it +//~^ ERROR: you should put `be_sure_we_got_to_the_end_of_it` between ticks +fn issue897() { +} + +/// I am confused by brackets? (`x_y`) +/// I am confused by brackets? (foo `x_y`) +/// I am confused by brackets? (`x_y` foo) +/// be_sure_we_got_to_the_end_of_it +//~^ ERROR: you should put `be_sure_we_got_to_the_end_of_it` between ticks +fn issue900() { +} + +/// Diesel queries also have a similar problem to [Iterator][iterator], where +/// /// More talking +/// returning them from a function requires exposing the implementation of that +/// function. The [`helper_types`][helper_types] module exists to help with this, +/// but you might want to hide the return type or have it conditionally change. +/// Boxing can achieve both. +/// +/// [iterator]: https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html +/// [helper_types]: ../helper_types/index.html +/// be_sure_we_got_to_the_end_of_it +//~^ ERROR: you should put `be_sure_we_got_to_the_end_of_it` between ticks +fn issue883() { +}