Skip to content

Commit

Permalink
Auto merge of #53933 - GuillaumeGomez:codeblock-error-display, r=Quie…
Browse files Browse the repository at this point in the history
…tMisdreavus

Improve error display for codeblocks in rustdoc

Part of #53919.

r? @QuietMisdreavus
  • Loading branch information
bors committed Oct 12, 2018
2 parents 8dc554a + 322e469 commit 849a0e9
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 7 deletions.
25 changes: 18 additions & 7 deletions src/librustdoc/html/highlight.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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!("<pre>{}</pre>", src);
}

Expand Down Expand Up @@ -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, ""))
}
}
Expand Down
13 changes: 13 additions & 0 deletions src/libsyntax/parse/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,19 @@ impl<'a> StringReader<'a> {
sr
}

pub fn new_without_err(sess: &'a ParseSess,
source_file: Lrc<syntax_pos::SourceFile>,
override_span: Option<Span>,
prepend_error_text: &str) -> Result<Self, ()> {
let mut sr = StringReader::new_raw(sess, source_file, override_span);
if sr.advance_token().is_err() {
eprintln!("{}", prepend_error_text);
sr.emit_fatal_errors();
return Err(());
}
Ok(sr)
}

pub fn retokenize(sess: &'a ParseSess, mut span: Span) -> Self {
let begin = sess.source_map().lookup_byte_offset(span.lo());
let end = sess.source_map().lookup_byte_offset(span.hi());
Expand Down
17 changes: 17 additions & 0 deletions src/test/rustdoc-ui/invalid-syntax.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// compile-pass
// compile-flags: --error-format=human

/// ```
/// \__________pkt->size___________/ \_result->size_/ \__pkt->size__/
/// ```
pub fn foo() {}
10 changes: 10 additions & 0 deletions src/test/rustdoc-ui/invalid-syntax.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Output from rustc:
error: unknown start of token: /
--> <stdin>:1:1
|
1 | /__________pkt->size___________/ /_result->size_/ /__pkt->size__/
| ^

warning: Invalid doc comment starting with: `/__________pkt->size___________/ /_result->size_/ /__pkt->size__/`
(Ignoring this codeblock)

0 comments on commit 849a0e9

Please sign in to comment.