| 1 | //! Data structures for handling diagnostic output from tests. |
| 2 | |
| 3 | use std::path::Path; |
| 4 | |
| 5 | #[cfg (feature = "rustc" )] |
| 6 | pub mod rustc; |
| 7 | |
| 8 | /// Default diagnostics extractor that does nothing. |
| 9 | pub 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)] |
| 15 | pub 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 | |
| 30 | impl 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)] |
| 47 | pub 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)] |
| 62 | pub 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 | |