]>
Commit | Line | Data |
---|---|---|
136023e0 XL |
1 | //! Rustc Diagnostic JSON Output |
2 | //! | |
3 | //! The following data types are copied from [rust-lang/rust](https://github.com/rust-lang/rust/blob/de78655bca47cac8e783dbb563e7e5c25c1fae40/src/libsyntax/json.rs) | |
4 | ||
5 | use serde::Deserialize; | |
6 | ||
7 | #[derive(Clone, Deserialize, Debug, Hash, Eq, PartialEq)] | |
8 | pub struct Diagnostic { | |
9 | /// The primary error message. | |
10 | pub message: String, | |
11 | pub code: Option<DiagnosticCode>, | |
12 | /// "error: internal compiler error", "error", "warning", "note", "help". | |
13 | level: String, | |
14 | pub spans: Vec<DiagnosticSpan>, | |
15 | /// Associated diagnostic messages. | |
16 | pub children: Vec<Diagnostic>, | |
17 | /// The message as rustc would render it. Currently this is only | |
18 | /// `Some` for "suggestions", but eventually it will include all | |
19 | /// snippets. | |
20 | pub rendered: Option<String>, | |
21 | } | |
22 | ||
23 | #[derive(Clone, Deserialize, Debug, Hash, Eq, PartialEq)] | |
24 | pub struct DiagnosticSpan { | |
25 | pub file_name: String, | |
26 | pub byte_start: u32, | |
27 | pub byte_end: u32, | |
28 | /// 1-based. | |
29 | pub line_start: usize, | |
30 | pub line_end: usize, | |
31 | /// 1-based, character offset. | |
32 | pub column_start: usize, | |
33 | pub column_end: usize, | |
34 | /// Is this a "primary" span -- meaning the point, or one of the points, | |
35 | /// where the error occurred? | |
36 | is_primary: bool, | |
37 | /// Source text from the start of line_start to the end of line_end. | |
38 | pub text: Vec<DiagnosticSpanLine>, | |
39 | /// Label that should be placed at this location (if any) | |
40 | label: Option<String>, | |
41 | /// If we are suggesting a replacement, this will contain text | |
42 | /// that should be sliced in atop this span. You may prefer to | |
43 | /// load the fully rendered version from the parent `Diagnostic`, | |
44 | /// however. | |
45 | pub suggested_replacement: Option<String>, | |
46 | pub suggestion_applicability: Option<Applicability>, | |
47 | /// Macro invocations that created the code at this span, if any. | |
48 | expansion: Option<Box<DiagnosticSpanMacroExpansion>>, | |
49 | } | |
50 | ||
51 | #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Hash, Eq)] | |
52 | pub enum Applicability { | |
53 | MachineApplicable, | |
54 | HasPlaceholders, | |
55 | MaybeIncorrect, | |
56 | Unspecified, | |
57 | } | |
58 | ||
59 | #[derive(Clone, Deserialize, Debug, Eq, PartialEq, Hash)] | |
60 | pub struct DiagnosticSpanLine { | |
61 | pub text: String, | |
62 | ||
63 | /// 1-based, character offset in self.text. | |
64 | pub highlight_start: usize, | |
65 | ||
66 | pub highlight_end: usize, | |
67 | } | |
68 | ||
69 | #[derive(Clone, Deserialize, Debug, Eq, PartialEq, Hash)] | |
70 | struct DiagnosticSpanMacroExpansion { | |
71 | /// span where macro was applied to generate this code; note that | |
72 | /// this may itself derive from a macro (if | |
73 | /// `span.expansion.is_some()`) | |
74 | span: DiagnosticSpan, | |
75 | ||
76 | /// name of macro that was applied (e.g., "foo!" or "#[derive(Eq)]") | |
77 | macro_decl_name: String, | |
78 | ||
79 | /// span where macro was defined (if known) | |
80 | def_site_span: Option<DiagnosticSpan>, | |
81 | } | |
82 | ||
83 | #[derive(Clone, Deserialize, Debug, Eq, PartialEq, Hash)] | |
84 | pub struct DiagnosticCode { | |
85 | /// The code itself. | |
86 | pub code: String, | |
87 | /// An explanation for the code. | |
88 | explanation: Option<String>, | |
89 | } |