ui_test/
diagnostics.rs

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}