From f7240e1c74fd19d09e183cedc7dd569c59a4bbd5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 3 Sep 2018 22:24:11 +0200 Subject: [PATCH] Improve error display for codeblocks in rustdoc --- src/librustdoc/html/highlight.rs | 25 ++++++++++++++++------- src/libsyntax/parse/lexer/mod.rs | 11 ++++++++++ src/test/rustdoc-ui/invalid-syntax.rs | 17 +++++++++++++++ src/test/rustdoc-ui/invalid-syntax.stderr | 9 ++++++++ 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/test/rustdoc-ui/invalid-syntax.rs create mode 100644 src/test/rustdoc-ui/invalid-syntax.stderr diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs index 5df4862290e3c..a83f80dcc3488 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) { + 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..7132dc342d259 100644 --- a/src/libsyntax/parse/lexer/mod.rs +++ b/src/libsyntax/parse/lexer/mod.rs @@ -238,6 +238,17 @@ impl<'a> StringReader<'a> { sr } + pub fn new_without_err(sess: &'a ParseSess, + source_file: Lrc, + override_span: Option) -> Result { + let mut sr = StringReader::new_raw(sess, source_file, override_span); + if sr.advance_token().is_err() { + 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()); diff --git a/src/test/rustdoc-ui/invalid-syntax.rs b/src/test/rustdoc-ui/invalid-syntax.rs new file mode 100644 index 0000000000000..8c790d7d07e15 --- /dev/null +++ b/src/test/rustdoc-ui/invalid-syntax.rs @@ -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 or the MIT license +// , 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() {} diff --git a/src/test/rustdoc-ui/invalid-syntax.stderr b/src/test/rustdoc-ui/invalid-syntax.stderr new file mode 100644 index 0000000000000..0661f0ab00510 --- /dev/null +++ b/src/test/rustdoc-ui/invalid-syntax.stderr @@ -0,0 +1,9 @@ +error: unknown start of token: / + --> :1:1 + | +1 | /__________pkt->size___________/ /_result->size_/ /__pkt->size__/ + | ^ + +warning: Invalid doc comment starting with: `/__________pkt->size___________/ /_result->size_/ /__pkt->size__/` +(Ignoring this codeblock) +