buffer lexer errors in rustdoc syntax checking
This commit is contained in:
parent
760ce94c69
commit
1ad928ee52
2 changed files with 48 additions and 112 deletions
|
@ -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_parse::lexer::StringReader as Lexer;
|
||||||
use rustc_span::source_map::FilePathMapping;
|
use rustc_span::source_map::{FilePathMapping, SourceMap};
|
||||||
use rustc_span::{FileName, InnerSpan};
|
use rustc_span::{FileName, InnerSpan};
|
||||||
use syntax::sess::ParseSess;
|
use syntax::sess::ParseSess;
|
||||||
use syntax::token;
|
use syntax::token;
|
||||||
|
@ -27,7 +28,13 @@ struct SyntaxChecker<'a, 'tcx> {
|
||||||
|
|
||||||
impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
|
impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
|
||||||
fn check_rust_syntax(&self, item: &clean::Item, dox: &str, code_block: RustCodeBlock) {
|
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(
|
let source_file = sess.source_map().new_source_file(
|
||||||
FileName::Custom(String::from("doctest")),
|
FileName::Custom(String::from("doctest")),
|
||||||
dox[code_block.code].to_owned(),
|
dox[code_block.code].to_owned(),
|
||||||
|
@ -93,6 +100,11 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> {
|
||||||
diag
|
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();
|
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 {
|
enum CodeBlockInvalid {
|
||||||
SyntaxError,
|
SyntaxError,
|
||||||
Empty,
|
Empty,
|
||||||
|
|
|
@ -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
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:3:5
|
--> $DIR/invalid-syntax.rs:3:5
|
||||||
|
|
|
|
||||||
|
@ -25,33 +7,14 @@ LL | | /// \__________pkt->size___________/ \_result->size_/ \__pkt->si
|
||||||
LL | | /// ```
|
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
|
help: mark blocks that do not contain Rust code as text
|
||||||
|
|
|
|
||||||
LL | /// ```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
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:9:5
|
--> $DIR/invalid-syntax.rs:9:5
|
||||||
|
|
|
|
||||||
|
@ -63,17 +26,13 @@ LL | | /// | ^^^^^^ did you mean `baz::foobar`?
|
||||||
LL | | /// ```
|
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
|
help: mark blocks that do not contain Rust code as text
|
||||||
|
|
|
|
||||||
LL | /// ```text
|
LL | /// ```text
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
error: unknown start of token: \
|
|
||||||
--> <doctest>:1:1
|
|
||||||
|
|
|
||||||
1 | \_
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: could not parse code block as Rust code
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:21:5
|
--> $DIR/invalid-syntax.rs:21:5
|
||||||
|
|
|
|
||||||
|
@ -83,17 +42,12 @@ LL | | /// \_
|
||||||
LL | | /// ```
|
LL | | /// ```
|
||||||
| |_______^
|
| |_______^
|
||||||
|
|
|
|
||||||
|
= note: error from rustc: unknown start of token: \
|
||||||
help: mark blocks that do not contain Rust code as text
|
help: mark blocks that do not contain Rust code as text
|
||||||
|
|
|
|
||||||
LL | /// ```text
|
LL | /// ```text
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
error: unknown start of token: \
|
|
||||||
--> <doctest>:1:1
|
|
||||||
|
|
|
||||||
1 | \_
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: could not parse code block as Rust code
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:35:5
|
--> $DIR/invalid-syntax.rs:35:5
|
||||||
|
|
|
|
||||||
|
@ -102,12 +56,8 @@ LL | /// ```rust
|
||||||
LL | | /// \_
|
LL | | /// \_
|
||||||
LL | | /// ```
|
LL | | /// ```
|
||||||
| |_______^
|
| |_______^
|
||||||
|
|
|
||||||
error: unknown start of token: \
|
= note: error from rustc: unknown start of token: \
|
||||||
--> <doctest>:2:5
|
|
||||||
|
|
|
||||||
2 | \_
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: could not parse code block as Rust code
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:45:9
|
--> $DIR/invalid-syntax.rs:45:9
|
||||||
|
@ -116,51 +66,18 @@ LL | /// code with bad syntax
|
||||||
| _________^
|
| _________^
|
||||||
LL | | /// \_
|
LL | | /// \_
|
||||||
| |__________^
|
| |__________^
|
||||||
|
|
|
||||||
error: unknown start of token: `
|
= note: error from rustc: 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 | ``'
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: could not parse code block as Rust code
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:60:9
|
--> $DIR/invalid-syntax.rs:60:9
|
||||||
|
|
|
|
||||||
LL | /// ```
|
LL | /// ```
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
||||||
error: unknown start of token: \
|
= note: error from rustc: unknown start of token: `
|
||||||
--> <doctest>:1:1
|
= note: error from rustc: unknown start of token: `
|
||||||
|
|
= note: error from rustc: unknown start of token: `
|
||||||
1 | \_
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: could not parse code block as Rust code
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:64:5
|
--> $DIR/invalid-syntax.rs:64:5
|
||||||
|
@ -170,12 +87,8 @@ LL | /// ```edition2018
|
||||||
LL | | /// \_
|
LL | | /// \_
|
||||||
LL | | /// ```
|
LL | | /// ```
|
||||||
| |_______^
|
| |_______^
|
||||||
|
|
|
||||||
error: unknown start of token: \
|
= note: error from rustc: unknown start of token: \
|
||||||
--> <doctest>:1:1
|
|
||||||
|
|
|
||||||
1 | \_
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: doc comment contains an invalid Rust code block
|
warning: doc comment contains an invalid Rust code block
|
||||||
--> $DIR/invalid-syntax.rs:70:1
|
--> $DIR/invalid-syntax.rs:70:1
|
||||||
|
@ -186,6 +99,7 @@ LL | | #[doc = "```"]
|
||||||
| |______________^
|
| |______________^
|
||||||
|
|
|
|
||||||
= help: mark blocks that do not contain Rust code as text: ```text
|
= 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
|
warning: Rust code block is empty
|
||||||
--> $DIR/invalid-syntax.rs:76:5
|
--> $DIR/invalid-syntax.rs:76:5
|
||||||
|
@ -210,15 +124,11 @@ help: mark blocks that do not contain Rust code as text
|
||||||
LL | /// ```text
|
LL | /// ```text
|
||||||
| ^^^^^^^
|
| ^^^^^^^
|
||||||
|
|
||||||
error: unknown start of token: \
|
|
||||||
--> <doctest>:1:1
|
|
||||||
|
|
|
||||||
1 | \____/
|
|
||||||
| ^
|
|
||||||
|
|
||||||
warning: could not parse code block as Rust code
|
warning: could not parse code block as Rust code
|
||||||
--> $DIR/invalid-syntax.rs:92:9
|
--> $DIR/invalid-syntax.rs:92:9
|
||||||
|
|
|
|
||||||
LL | /// \____/
|
LL | /// \____/
|
||||||
| ^^^^^^
|
| ^^^^^^
|
||||||
|
|
|
||||||
|
= note: error from rustc: unknown start of token: \
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue