]> git.proxmox.com Git - rustc.git/blame - compiler/rustc_errors/src/diagnostic_impls.rs
New upstream version 1.69.0+dfsg1
[rustc.git] / compiler / rustc_errors / src / diagnostic_impls.rs
CommitLineData
9ffffee4
FG
1use crate::fluent_generated as fluent;
2use crate::{DiagnosticArgValue, DiagnosticBuilder, Handler, IntoDiagnostic, IntoDiagnosticArg};
2b03887a
FG
3use rustc_ast as ast;
4use rustc_ast_pretty::pprust;
5use rustc_hir as hir;
6use rustc_lint_defs::Level;
7use rustc_span::edition::Edition;
8use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol};
9use rustc_target::abi::TargetDataLayoutErrors;
10use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTriple};
9c376795 11use rustc_type_ir as type_ir;
2b03887a
FG
12use std::borrow::Cow;
13use std::fmt;
14use std::num::ParseIntError;
15use std::path::{Path, PathBuf};
487cf647 16use std::process::ExitStatus;
2b03887a
FG
17
18pub struct DiagnosticArgFromDisplay<'a>(pub &'a dyn fmt::Display);
19
20impl IntoDiagnosticArg for DiagnosticArgFromDisplay<'_> {
21 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
22 self.0.to_string().into_diagnostic_arg()
23 }
24}
25
26impl<'a> From<&'a dyn fmt::Display> for DiagnosticArgFromDisplay<'a> {
27 fn from(t: &'a dyn fmt::Display) -> Self {
28 DiagnosticArgFromDisplay(t)
29 }
30}
31
32impl<'a, T: fmt::Display> From<&'a T> for DiagnosticArgFromDisplay<'a> {
33 fn from(t: &'a T) -> Self {
34 DiagnosticArgFromDisplay(t)
35 }
36}
37
9ffffee4
FG
38impl<'a, T: Clone + IntoDiagnosticArg> IntoDiagnosticArg for &'a T {
39 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
40 self.clone().into_diagnostic_arg()
41 }
42}
43
2b03887a
FG
44macro_rules! into_diagnostic_arg_using_display {
45 ($( $ty:ty ),+ $(,)?) => {
46 $(
47 impl IntoDiagnosticArg for $ty {
48 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
49 self.to_string().into_diagnostic_arg()
50 }
51 }
52 )+
53 }
54}
55
56into_diagnostic_arg_using_display!(
9ffffee4 57 ast::ParamKindOrd,
2b03887a
FG
58 i8,
59 u8,
60 i16,
61 u16,
62 i32,
63 u32,
64 i64,
65 u64,
66 i128,
67 u128,
68 std::io::Error,
9c376795 69 Box<dyn std::error::Error>,
2b03887a
FG
70 std::num::NonZeroU32,
71 hir::Target,
72 Edition,
73 Ident,
74 MacroRulesNormalizedIdent,
75 ParseIntError,
76 StackProtector,
77 &TargetTriple,
487cf647
FG
78 SplitDebuginfo,
79 ExitStatus,
2b03887a
FG
80);
81
82impl IntoDiagnosticArg for bool {
83 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
84 if self {
85 DiagnosticArgValue::Str(Cow::Borrowed("true"))
86 } else {
87 DiagnosticArgValue::Str(Cow::Borrowed("false"))
88 }
89 }
90}
91
92impl IntoDiagnosticArg for char {
93 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
94 DiagnosticArgValue::Str(Cow::Owned(format!("{:?}", self)))
95 }
96}
97
98impl IntoDiagnosticArg for Symbol {
99 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
100 self.to_ident_string().into_diagnostic_arg()
101 }
102}
103
104impl<'a> IntoDiagnosticArg for &'a str {
105 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
106 self.to_string().into_diagnostic_arg()
107 }
108}
109
110impl IntoDiagnosticArg for String {
111 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
112 DiagnosticArgValue::Str(Cow::Owned(self))
113 }
114}
115
487cf647
FG
116impl<'a> IntoDiagnosticArg for Cow<'a, str> {
117 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
118 DiagnosticArgValue::Str(Cow::Owned(self.into_owned()))
119 }
120}
121
2b03887a
FG
122impl<'a> IntoDiagnosticArg for &'a Path {
123 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
124 DiagnosticArgValue::Str(Cow::Owned(self.display().to_string()))
125 }
126}
127
128impl IntoDiagnosticArg for PathBuf {
129 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
130 DiagnosticArgValue::Str(Cow::Owned(self.display().to_string()))
131 }
132}
133
134impl IntoDiagnosticArg for usize {
135 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
136 DiagnosticArgValue::Number(self)
137 }
138}
139
140impl IntoDiagnosticArg for PanicStrategy {
141 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
142 DiagnosticArgValue::Str(Cow::Owned(self.desc().to_string()))
143 }
144}
145
146impl IntoDiagnosticArg for hir::ConstContext {
147 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
148 DiagnosticArgValue::Str(Cow::Borrowed(match self {
149 hir::ConstContext::ConstFn => "constant function",
150 hir::ConstContext::Static(_) => "static",
151 hir::ConstContext::Const => "constant",
152 }))
153 }
154}
155
156impl IntoDiagnosticArg for ast::Path {
157 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
158 DiagnosticArgValue::Str(Cow::Owned(pprust::path_to_string(&self)))
159 }
160}
161
162impl IntoDiagnosticArg for ast::token::Token {
163 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
164 DiagnosticArgValue::Str(pprust::token_to_string(&self))
165 }
166}
167
168impl IntoDiagnosticArg for ast::token::TokenKind {
169 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
170 DiagnosticArgValue::Str(pprust::token_kind_to_string(&self))
171 }
172}
173
9c376795
FG
174impl IntoDiagnosticArg for type_ir::FloatTy {
175 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
176 DiagnosticArgValue::Str(Cow::Borrowed(self.name_str()))
177 }
178}
179
9ffffee4
FG
180impl IntoDiagnosticArg for std::ffi::CString {
181 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
182 DiagnosticArgValue::Str(Cow::Owned(self.to_string_lossy().into_owned()))
183 }
184}
185
186impl IntoDiagnosticArg for rustc_data_structures::small_c_str::SmallCStr {
187 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
188 DiagnosticArgValue::Str(Cow::Owned(self.to_string_lossy().into_owned()))
189 }
190}
191
192impl IntoDiagnosticArg for ast::Visibility {
193 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
194 let s = pprust::vis_to_string(&self);
195 let s = s.trim_end().to_string();
196 DiagnosticArgValue::Str(Cow::Owned(s))
197 }
198}
199
2b03887a
FG
200impl IntoDiagnosticArg for Level {
201 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
9c376795 202 DiagnosticArgValue::Str(Cow::Borrowed(self.to_cmd_flag()))
2b03887a
FG
203 }
204}
205
487cf647
FG
206#[derive(Clone)]
207pub struct DiagnosticSymbolList(Vec<Symbol>);
208
209impl From<Vec<Symbol>> for DiagnosticSymbolList {
210 fn from(v: Vec<Symbol>) -> Self {
211 DiagnosticSymbolList(v)
212 }
213}
214
215impl IntoDiagnosticArg for DiagnosticSymbolList {
216 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
217 DiagnosticArgValue::StrListSepByAnd(
218 self.0.into_iter().map(|sym| Cow::Owned(format!("`{sym}`"))).collect(),
219 )
220 }
221}
222
223impl<Id> IntoDiagnosticArg for hir::def::Res<Id> {
224 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
225 DiagnosticArgValue::Str(Cow::Borrowed(self.descr()))
226 }
227}
228
2b03887a
FG
229impl IntoDiagnostic<'_, !> for TargetDataLayoutErrors<'_> {
230 fn into_diagnostic(self, handler: &Handler) -> DiagnosticBuilder<'_, !> {
231 let mut diag;
232 match self {
233 TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => {
234 diag = handler.struct_fatal(fluent::errors_target_invalid_address_space);
235 diag.set_arg("addr_space", addr_space);
236 diag.set_arg("cause", cause);
237 diag.set_arg("err", err);
238 diag
239 }
240 TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => {
241 diag = handler.struct_fatal(fluent::errors_target_invalid_bits);
242 diag.set_arg("kind", kind);
243 diag.set_arg("bit", bit);
244 diag.set_arg("cause", cause);
245 diag.set_arg("err", err);
246 diag
247 }
248 TargetDataLayoutErrors::MissingAlignment { cause } => {
249 diag = handler.struct_fatal(fluent::errors_target_missing_alignment);
250 diag.set_arg("cause", cause);
251 diag
252 }
253 TargetDataLayoutErrors::InvalidAlignment { cause, err } => {
254 diag = handler.struct_fatal(fluent::errors_target_invalid_alignment);
255 diag.set_arg("cause", cause);
256 diag.set_arg("err", err);
257 diag
258 }
259 TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
260 diag = handler.struct_fatal(fluent::errors_target_inconsistent_architecture);
261 diag.set_arg("dl", dl);
262 diag.set_arg("target", target);
263 diag
264 }
265 TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => {
266 diag = handler.struct_fatal(fluent::errors_target_inconsistent_pointer_width);
267 diag.set_arg("pointer_size", pointer_size);
268 diag.set_arg("target", target);
269 diag
270 }
271 TargetDataLayoutErrors::InvalidBitsSize { err } => {
272 diag = handler.struct_fatal(fluent::errors_target_invalid_bits_size);
273 diag.set_arg("err", err);
274 diag
275 }
276 }
277 }
278}