librustdoc: warn on empty doc test

This commit is contained in:
Tom Milligan 2019-08-19 15:19:26 +01:00
parent ea52be482a
commit 0ec2e9fceb
No known key found for this signature in database
GPG Key ID: BFF10895C45328D2
3 changed files with 59 additions and 10 deletions

View File

@ -32,27 +32,39 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
dox[code_block.code].to_owned(),
);
let has_errors = {
let mut has_errors = false;
let validation_status = {
let mut has_syntax_errors = false;
let mut only_whitespace = true;
// even if there is a syntax error, we need to run the lexer over the whole file
let mut lexer = Lexer::new(&sess, source_file, None);
loop {
match lexer.next_token().kind {
token::Eof => break,
token::Unknown(..) => has_errors = true,
_ => (),
token::Whitespace => (),
token::Unknown(..) => has_syntax_errors = true,
_ => only_whitespace = false,
}
}
has_errors
if has_syntax_errors {
Some(CodeBlockInvalid::SyntaxError)
} else if only_whitespace {
Some(CodeBlockInvalid::Empty)
} else {
None
}
};
if has_errors {
if let Some(code_block_invalid) = validation_status {
let mut diag = if let Some(sp) =
super::source_span_for_markdown_range(self.cx, &dox, &code_block.range, &item.attrs)
{
let mut diag = self
.cx
.sess()
.struct_span_warn(sp, "could not parse code block as Rust code");
let warning_message = match code_block_invalid {
CodeBlockInvalid::SyntaxError => "could not parse code block as Rust code",
CodeBlockInvalid::Empty => "Rust code block is empty",
};
let mut diag = self.cx.sess().struct_span_warn(sp, warning_message);
if code_block.syntax.is_none() && code_block.is_fenced {
let sp = sp.from_inner(InnerSpan::new(0, 3));
@ -96,3 +108,8 @@ impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> {
self.fold_item_recur(item)
}
}
enum CodeBlockInvalid {
SyntaxError,
Empty,
}

View File

@ -64,3 +64,13 @@ pub fn blargh() {}
/// \_
#[doc = "```"]
pub fn crazy_attrs() {}
/// ```rust
/// ```
pub fn empty_rust() {}
/// ```
///
///
/// ```
pub fn empty_rust_with_whitespace() {}

View File

@ -179,6 +179,28 @@ LL | | #[doc = "```"]
|
= help: mark blocks that do not contain Rust code as text: ```text
warning: Rust code block is empty
--> $DIR/invalid-syntax.rs:68:5
|
LL | /// ```rust
| _____^
LL | | /// ```
| |_______^
warning: Rust code block is empty
--> $DIR/invalid-syntax.rs:72:5
|
LL | /// ```
| _____^
LL | | ///
LL | | ///
LL | | /// ```
| |_______^
help: mark blocks that do not contain Rust code as text
|
LL | /// ```text
| ^^^^^^^
error: unknown start of token: \
--> <rustdoc-highlighting>:1:1
|