1 | //! Rustc Diagnostic JSON Output. |
---|---|
2 | //! |
3 | //! The following data types are copied from [rust-lang/rust](https://github.com/rust-lang/rust/blob/4fd68eb47bad1c121417ac4450b2f0456150db86/compiler/rustc_errors/src/json.rs). |
4 | //! |
5 | //! For examples of the JSON output, see JSON fixture files under `tests/` directory. |
6 | |
7 | use serde::Deserialize; |
8 | |
9 | /// The root diagnostic JSON output emitted by the compiler. |
10 | #[derive(Clone, Deserialize, Debug, Hash, Eq, PartialEq)] |
11 | pub struct Diagnostic { |
12 | /// The primary error message. |
13 | pub message: String, |
14 | pub code: Option<DiagnosticCode>, |
15 | /// "error: internal compiler error", "error", "warning", "note", "help". |
16 | level: String, |
17 | pub spans: Vec<DiagnosticSpan>, |
18 | /// Associated diagnostic messages. |
19 | pub children: Vec<Diagnostic>, |
20 | /// The message as rustc would render it. |
21 | pub rendered: Option<String>, |
22 | } |
23 | |
24 | /// Span information of a diagnostic item. |
25 | #[derive(Clone, Deserialize, Debug, Hash, Eq, PartialEq)] |
26 | pub struct DiagnosticSpan { |
27 | pub file_name: String, |
28 | pub byte_start: u32, |
29 | pub byte_end: u32, |
30 | /// 1-based. |
31 | pub line_start: usize, |
32 | pub line_end: usize, |
33 | /// 1-based, character offset. |
34 | pub column_start: usize, |
35 | pub column_end: usize, |
36 | /// Is this a "primary" span -- meaning the point, or one of the points, |
37 | /// where the error occurred? |
38 | pub is_primary: bool, |
39 | /// Source text from the start of line_start to the end of line_end. |
40 | pub text: Vec<DiagnosticSpanLine>, |
41 | /// Label that should be placed at this location (if any) |
42 | label: Option<String>, |
43 | /// If we are suggesting a replacement, this will contain text |
44 | /// that should be sliced in atop this span. |
45 | pub suggested_replacement: Option<String>, |
46 | /// If the suggestion is approximate |
47 | pub suggestion_applicability: Option<Applicability>, |
48 | /// Macro invocations that created the code at this span, if any. |
49 | expansion: Option<Box<DiagnosticSpanMacroExpansion>>, |
50 | } |
51 | |
52 | /// Indicates the confidence in the correctness of a suggestion. |
53 | /// |
54 | /// All suggestions are marked with an `Applicability`. Tools use the applicability of a suggestion |
55 | /// to determine whether it should be automatically applied or if the user should be consulted |
56 | /// before applying the suggestion. |
57 | #[derive(Copy, Clone, Debug, PartialEq, Deserialize, Hash, Eq)] |
58 | pub enum Applicability { |
59 | /// The suggestion is definitely what the user intended, or maintains the exact meaning of the code. |
60 | /// This suggestion should be automatically applied. |
61 | /// |
62 | /// In case of multiple `MachineApplicable` suggestions (whether as part of |
63 | /// the same `multipart_suggestion` or not), all of them should be |
64 | /// automatically applied. |
65 | MachineApplicable, |
66 | |
67 | /// The suggestion may be what the user intended, but it is uncertain. The suggestion should |
68 | /// result in valid Rust code if it is applied. |
69 | MaybeIncorrect, |
70 | |
71 | /// The suggestion contains placeholders like `(...)` or `{ /* fields */ }`. The suggestion |
72 | /// cannot be applied automatically because it will not result in valid Rust code. The user |
73 | /// will need to fill in the placeholders. |
74 | HasPlaceholders, |
75 | |
76 | /// The applicability of the suggestion is unknown. |
77 | Unspecified, |
78 | } |
79 | |
80 | /// Span information of a single line. |
81 | #[derive(Clone, Deserialize, Debug, Eq, PartialEq, Hash)] |
82 | pub struct DiagnosticSpanLine { |
83 | pub text: String, |
84 | |
85 | /// 1-based, character offset in self.text. |
86 | pub highlight_start: usize, |
87 | |
88 | pub highlight_end: usize, |
89 | } |
90 | |
91 | /// Span information for macro expansions. |
92 | #[derive(Clone, Deserialize, Debug, Eq, PartialEq, Hash)] |
93 | struct DiagnosticSpanMacroExpansion { |
94 | /// span where macro was applied to generate this code; note that |
95 | /// this may itself derive from a macro (if |
96 | /// `span.expansion.is_some()`) |
97 | span: DiagnosticSpan, |
98 | |
99 | /// name of macro that was applied (e.g., "foo!" or "#[derive(Eq)]") |
100 | macro_decl_name: String, |
101 | |
102 | /// span where macro was defined (if known) |
103 | def_site_span: Option<DiagnosticSpan>, |
104 | } |
105 | |
106 | /// The error code emitted by the compiler. See [Rust error codes index]. |
107 | /// |
108 | /// [Rust error codes index]: https://doc.rust-lang.org/error_codes/error-index.html |
109 | #[derive(Clone, Deserialize, Debug, Eq, PartialEq, Hash)] |
110 | pub struct DiagnosticCode { |
111 | /// The code itself. |
112 | pub code: String, |
113 | /// An explanation for the code. |
114 | explanation: Option<String>, |
115 | } |
116 |
Definitions
- Diagnostic
- message
- code
- level
- spans
- children
- rendered
- DiagnosticSpan
- file_name
- byte_start
- byte_end
- line_start
- line_end
- column_start
- column_end
- is_primary
- text
- label
- suggested_replacement
- suggestion_applicability
- expansion
- Applicability
- MachineApplicable
- MaybeIncorrect
- HasPlaceholders
- Unspecified
- DiagnosticSpanLine
- text
- highlight_start
- highlight_end
- DiagnosticSpanMacroExpansion
- span
- macro_decl_name
- def_site_span
- DiagnosticCode
- code
Learn Rust with the experts
Find out more