1//! Data structures for handling diagnostic output from tests.
2
3use std::path::Path;
4
5#[cfg(feature = "rustc")]
6pub mod rustc;
7
8/// Default diagnostics extractor that does nothing.
9pub fn default_diagnostics_extractor(_path: &Path, _stderr: &[u8]) -> Diagnostics {
10 Diagnostics::default()
11}
12
13/// The different levels of diagnostic messages and their relative ranking.
14#[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)]
15pub enum Level {
16 /// internal compiler errors
17 Ice = 5,
18 /// ´error´ level messages
19 Error = 4,
20 /// ´warn´ level messages
21 Warn = 3,
22 /// ´help´ level messages
23 Help = 2,
24 /// ´note´ level messages
25 Note = 1,
26 /// Only used for "For more information about this error, try `rustc --explain EXXXX`".
27 FailureNote = 0,
28}
29
30impl std::str::FromStr for Level {
31 type Err = String;
32 fn from_str(s: &str) -> Result<Self, Self::Err> {
33 match s {
34 "ERROR" | "error" => Ok(Self::Error),
35 "WARN" | "warning" => Ok(Self::Warn),
36 "HELP" | "help" => Ok(Self::Help),
37 "NOTE" | "note" => Ok(Self::Note),
38 "failure-note" => Ok(Self::FailureNote),
39 "ICE" | "ice" => Ok(Self::Ice),
40 _ => Err(format!("unknown level `{s}`")),
41 }
42 }
43}
44
45/// A diagnostic message.
46#[derive(Debug)]
47pub struct Message {
48 /// The diagnostic level at which this message was emitted
49 pub level: Level,
50 /// The main message of the diagnostic (what will be matched for with `//~`)
51 pub message: String,
52 /// Information about where in the file the message was emitted
53 pub line: Option<usize>,
54 /// Exact span information of the message
55 pub span: Option<spanned::Span>,
56 /// Identifier of the message (E0XXX for rustc errors, or lint names)
57 pub code: Option<String>,
58}
59
60/// All the diagnostics that were emitted in a test.
61#[derive(Default, Debug)]
62pub struct Diagnostics {
63 /// Rendered and concatenated version of all diagnostics.
64 /// This is equivalent to non-json diagnostics.
65 pub rendered: Vec<u8>,
66 /// Per line, a list of messages for that line.
67 pub messages: Vec<Vec<Message>>,
68 /// Messages not on any line (usually because they are from libstd)
69 pub messages_from_unknown_file_or_line: Vec<Message>,
70}
71