diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index 5df4862290e3c..87b4527a2a739 100644 --- a/src/librustdoc/html/highlight.rs +++ b/src/librustdoc/html/highlight.rs @@ -44,9 +44,21 @@ pub fn render_with_highlighting(src: &str, class: Option<&str>, } write_header(class, &mut out).unwrap(); - let mut classifier = Classifier::new(lexer::StringReader::new(&sess, fm, None), - sess.source_map()); + let lexer = match lexer::StringReader::new_without_err(&sess, fm, None, "Output from rustc:") { + Ok(l) => l, + Err(_) => { + let first_line = src.lines().next().unwrap_or_else(|| ""); + let mut err = sess.span_diagnostic + .struct_warn(&format!("Invalid doc comment starting with: `{}`\n\ + (Ignoring this codeblock)", + first_line)); + err.emit(); + return String::new(); + } + }; + let mut classifier = Classifier::new(lexer, sess.source_map()); if classifier.write_source(&mut out).is_err() { + classifier.lexer.emit_fatal_errors(); return format!("
{}", src);
}
@@ -162,11 +174,10 @@ impl<'a> Classifier<'a> {
match self.lexer.try_next_token() {
Ok(tas) => Ok(tas),
Err(_) => {
- self.lexer.emit_fatal_errors();
- self.lexer.sess.span_diagnostic
- .struct_warn("Backing out of syntax highlighting")
- .note("You probably did not intend to render this as a rust code-block")
- .emit();
+ let mut err = self.lexer.sess.span_diagnostic
+ .struct_warn("Backing out of syntax highlighting");
+ err.note("You probably did not intend to render this as a rust code-block");
+ err.emit();
Err(io::Error::new(io::ErrorKind::Other, ""))
}
}
diff --git a/src/libsyntax/parse/lexer/mod.rs b/src/libsyntax/parse/lexer/mod.rs
index aa47d5bf669bc..a814c88ee7821 100644
--- a/src/libsyntax/parse/lexer/mod.rs
+++ b/src/libsyntax/parse/lexer/mod.rs
@@ -238,6 +238,19 @@ impl<'a> StringReader<'a> {
sr
}
+ pub fn new_without_err(sess: &'a ParseSess,
+ source_file: Lrc