Improve error display for codeblocks in rustdoc
This commit is contained in:
parent
20dc0c5070
commit
f7240e1c74
@ -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!("<pre>{}</pre>", 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, ""))
|
||||
}
|
||||
}
|
||||
|
@ -238,6 +238,17 @@ impl<'a> StringReader<'a> {
|
||||
sr
|
||||
}
|
||||
|
||||
pub fn new_without_err(sess: &'a ParseSess,
|
||||
source_file: Lrc<syntax_pos::SourceFile>,
|
||||
override_span: Option<Span>) -> Result<Self, ()> {
|
||||
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());
|
||||
|
17
src/test/rustdoc-ui/invalid-syntax.rs
Normal file
17
src/test/rustdoc-ui/invalid-syntax.rs
Normal file
@ -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() {}
|
9
src/test/rustdoc-ui/invalid-syntax.stderr
Normal file
9
src/test/rustdoc-ui/invalid-syntax.stderr
Normal file
@ -0,0 +1,9 @@
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user