Auto merge of #67563 - euclio:rustdoc-buffer-lexer, r=GuillaumeGomez

buffer lexer errors in rustdoc syntax checking

The code isn't ideal (I really would like to display the errors inline), but this at least gets us to where we were before #63017.
This commit is contained in:
bors 2020-01-06 00:09:14 +00:00
commit 33640f0e03
2 changed files with 48 additions and 112 deletions

View file

@ -1,6 +1,7 @@
use errors::Applicability;
use errors::{emitter::Emitter, Applicability, Diagnostic, Handler};
use rustc_data_structures::sync::{Lock, Lrc};
use rustc_parse::lexer::StringReader as Lexer;
use rustc_span::source_map::FilePathMapping;
use rustc_span::source_map::{FilePathMapping, SourceMap};
use rustc_span::{FileName, InnerSpan};
use syntax::sess::ParseSess;
use syntax::token;
@ -27,7 +28,13 @@ struct SyntaxChecker<'a, 'tcx> {
impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
fn check_rust_syntax(&self, item: &clean::Item, dox: &str, code_block: RustCodeBlock) {
let sess = ParseSess::new(FilePathMapping::empty());
let buffered_messages = Lrc::new(Lock::new(vec![]));
let emitter = BufferEmitter { messages: Lrc::clone(&buffered_messages) };
let cm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
let handler = Handler::with_emitter(false, None, Box::new(emitter));
let sess = ParseSess::with_span_handler(handler, cm);
let source_file = sess.source_map().new_source_file(
FileName::Custom(String::from("doctest")),
dox[code_block.code].to_owned(),
@ -93,6 +100,11 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
diag
};
// FIXME(#67563): Provide more context for these errors by displaying the spans inline.
for message in buffered_messages.borrow().iter() {
diag.note(&message);
}
diag.emit();
}
}
@ -110,6 +122,20 @@ impl<'a, 'tcx> DocFolder for SyntaxChecker<'a, 'tcx> {
}
}
struct BufferEmitter {
messages: Lrc<Lock<Vec<String>>>,
}
impl Emitter for BufferEmitter {
fn emit_diagnostic(&mut self, diag: &Diagnostic) {
self.messages.borrow_mut().push(format!("error from rustc: {}", diag.message[0].0));
}
fn source_map(&self) -> Option<&Lrc<SourceMap>> {
None
}
}
enum CodeBlockInvalid {
SyntaxError,
Empty,

View file

@ -1,21 +1,3 @@
error: unknown start of token: \
--> <doctest>:1:1
|
1 | \__________pkt->size___________/ \_result->size_/ \__pkt->size__/
| ^
error: unknown start of token: \
--> <doctest>:1:43
|
1 | \__________pkt->size___________/ \_result->size_/ \__pkt->size__/
| ^
error: unknown start of token: \
--> <doctest>:1:60
|
1 | \__________pkt->size___________/ \_result->size_/ \__pkt->size__/
| ^
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:3:5
|
@ -25,33 +7,14 @@ LL | | /// \__________pkt->size___________/ \_result->size_/ \__pkt->si
LL | | /// ```
| |_______^
|
= note: error from rustc: unknown start of token: \
= note: error from rustc: unknown start of token: \
= note: error from rustc: unknown start of token: \
help: mark blocks that do not contain Rust code as text
|
LL | /// ```text
| ^^^^^^^
error: unknown start of token: `
--> <doctest>:3:30
|
3 | | ^^^^^^ did you mean `baz::foobar`?
| ^
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
3 | | ^^^^^^ did you mean 'baz::foobar`?
| ^
error: unknown start of token: `
--> <doctest>:3:42
|
3 | | ^^^^^^ did you mean `baz::foobar`?
| ^
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
3 | | ^^^^^^ did you mean `baz::foobar'?
| ^
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:9:5
|
@ -63,17 +26,13 @@ LL | | /// | ^^^^^^ did you mean `baz::foobar`?
LL | | /// ```
| |_______^
|
= note: error from rustc: unknown start of token: `
= note: error from rustc: unknown start of token: `
help: mark blocks that do not contain Rust code as text
|
LL | /// ```text
| ^^^^^^^
error: unknown start of token: \
--> <doctest>:1:1
|
1 | \_
| ^
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:21:5
|
@ -83,17 +42,12 @@ LL | | /// \_
LL | | /// ```
| |_______^
|
= note: error from rustc: unknown start of token: \
help: mark blocks that do not contain Rust code as text
|
LL | /// ```text
| ^^^^^^^
error: unknown start of token: \
--> <doctest>:1:1
|
1 | \_
| ^
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:35:5
|
@ -102,12 +56,8 @@ LL | /// ```rust
LL | | /// \_
LL | | /// ```
| |_______^
error: unknown start of token: \
--> <doctest>:2:5
|
2 | \_
| ^
|
= note: error from rustc: unknown start of token: \
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:45:9
@ -116,51 +66,18 @@ LL | /// code with bad syntax
| _________^
LL | | /// \_
| |__________^
error: unknown start of token: `
--> <doctest>:1:1
|
1 | ```
| ^
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
1 | '``
| ^
error: unknown start of token: `
--> <doctest>:1:2
|
1 | ```
| ^
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
1 | `'`
| ^
error: unknown start of token: `
--> <doctest>:1:3
|
1 | ```
| ^
|
help: Unicode character '`' (Grave Accent) looks like ''' (Single Quote), but it is not
|
1 | ``'
| ^
|
= note: error from rustc: unknown start of token: \
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:60:9
|
LL | /// ```
| ^^^
error: unknown start of token: \
--> <doctest>:1:1
|
1 | \_
| ^
|
= note: error from rustc: unknown start of token: `
= note: error from rustc: unknown start of token: `
= note: error from rustc: unknown start of token: `
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:64:5
@ -170,12 +87,8 @@ LL | /// ```edition2018
LL | | /// \_
LL | | /// ```
| |_______^
error: unknown start of token: \
--> <doctest>:1:1
|
1 | \_
| ^
|
= note: error from rustc: unknown start of token: \
warning: doc comment contains an invalid Rust code block
--> $DIR/invalid-syntax.rs:70:1
@ -186,6 +99,7 @@ LL | | #[doc = "```"]
| |______________^
|
= help: mark blocks that do not contain Rust code as text: ```text
= note: error from rustc: unknown start of token: \
warning: Rust code block is empty
--> $DIR/invalid-syntax.rs:76:5
@ -210,15 +124,11 @@ help: mark blocks that do not contain Rust code as text
LL | /// ```text
| ^^^^^^^
error: unknown start of token: \
--> <doctest>:1:1
|
1 | \____/
| ^
warning: could not parse code block as Rust code
--> $DIR/invalid-syntax.rs:92:9
|
LL | /// \____/
| ^^^^^^
|
= note: error from rustc: unknown start of token: \