2 fluent, DiagnosticArgValue, DiagnosticBuilder, Handler, IntoDiagnostic, IntoDiagnosticArg,
5 use rustc_ast_pretty::pprust;
7 use rustc_lint_defs::Level;
8 use rustc_span::edition::Edition;
9 use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol};
10 use rustc_target::abi::TargetDataLayoutErrors;
11 use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTriple};
14 use std::num::ParseIntError;
15 use std::path::{Path, PathBuf};
16 use std::process::ExitStatus;
18 pub struct DiagnosticArgFromDisplay<'a>(pub &'a dyn fmt::Display);
20 impl IntoDiagnosticArg for DiagnosticArgFromDisplay<'_> {
21 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
22 self.0.to_string().into_diagnostic_arg()
26 impl<'a> From<&'a dyn fmt::Display> for DiagnosticArgFromDisplay<'a> {
27 fn from(t: &'a dyn fmt::Display) -> Self {
28 DiagnosticArgFromDisplay(t)
32 impl<'a, T: fmt::Display> From<&'a T> for DiagnosticArgFromDisplay<'a> {
33 fn from(t: &'a T) -> Self {
34 DiagnosticArgFromDisplay(t)
38 macro_rules! into_diagnostic_arg_using_display {
39 ($( $ty:ty ),+ $(,)?) => {
41 impl IntoDiagnosticArg for $ty {
42 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
43 self.to_string().into_diagnostic_arg()
50 into_diagnostic_arg_using_display!(
62 Box<dyn std::error::Error>,
67 MacroRulesNormalizedIdent,
75 impl IntoDiagnosticArg for bool {
76 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
78 DiagnosticArgValue::Str(Cow::Borrowed("true"))
80 DiagnosticArgValue::Str(Cow::Borrowed("false"))
85 impl IntoDiagnosticArg for char {
86 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
87 DiagnosticArgValue::Str(Cow::Owned(format!("{:?}", self)))
91 impl IntoDiagnosticArg for Symbol {
92 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
93 self.to_ident_string().into_diagnostic_arg()
97 impl<'a> IntoDiagnosticArg for &'a str {
98 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
99 self.to_string().into_diagnostic_arg()
103 impl IntoDiagnosticArg for String {
104 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
105 DiagnosticArgValue::Str(Cow::Owned(self))
109 impl<'a> IntoDiagnosticArg for Cow<'a, str> {
110 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
111 DiagnosticArgValue::Str(Cow::Owned(self.into_owned()))
115 impl<'a> IntoDiagnosticArg for &'a Path {
116 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
117 DiagnosticArgValue::Str(Cow::Owned(self.display().to_string()))
121 impl IntoDiagnosticArg for PathBuf {
122 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
123 DiagnosticArgValue::Str(Cow::Owned(self.display().to_string()))
127 impl IntoDiagnosticArg for usize {
128 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
129 DiagnosticArgValue::Number(self)
133 impl IntoDiagnosticArg for PanicStrategy {
134 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
135 DiagnosticArgValue::Str(Cow::Owned(self.desc().to_string()))
139 impl IntoDiagnosticArg for hir::ConstContext {
140 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
141 DiagnosticArgValue::Str(Cow::Borrowed(match self {
142 hir::ConstContext::ConstFn => "constant function",
143 hir::ConstContext::Static(_) => "static",
144 hir::ConstContext::Const => "constant",
149 impl IntoDiagnosticArg for ast::Path {
150 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
151 DiagnosticArgValue::Str(Cow::Owned(pprust::path_to_string(&self)))
155 impl IntoDiagnosticArg for &ast::Path {
156 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
157 DiagnosticArgValue::Str(Cow::Owned(pprust::path_to_string(self)))
161 impl IntoDiagnosticArg for ast::token::Token {
162 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
163 DiagnosticArgValue::Str(pprust::token_to_string(&self))
167 impl IntoDiagnosticArg for ast::token::TokenKind {
168 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
169 DiagnosticArgValue::Str(pprust::token_kind_to_string(&self))
173 impl IntoDiagnosticArg for Level {
174 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
175 DiagnosticArgValue::Str(Cow::Borrowed(match self {
176 Level::Allow => "-A",
178 Level::ForceWarn(_) => "--force-warn",
180 Level::Forbid => "-F",
181 Level::Expect(_) => {
182 unreachable!("lints with the level of `expect` should not run this code");
189 pub struct DiagnosticSymbolList(Vec<Symbol>);
191 impl From<Vec<Symbol>> for DiagnosticSymbolList {
192 fn from(v: Vec<Symbol>) -> Self {
193 DiagnosticSymbolList(v)
197 impl IntoDiagnosticArg for DiagnosticSymbolList {
198 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
199 DiagnosticArgValue::StrListSepByAnd(
200 self.0.into_iter().map(|sym| Cow::Owned(format!("`{sym}`"))).collect(),
205 impl<Id> IntoDiagnosticArg for hir::def::Res<Id> {
206 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
207 DiagnosticArgValue::Str(Cow::Borrowed(self.descr()))
211 impl IntoDiagnostic<'_, !> for TargetDataLayoutErrors<'_> {
212 fn into_diagnostic(self, handler: &Handler) -> DiagnosticBuilder<'_, !> {
215 TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => {
216 diag = handler.struct_fatal(fluent::errors_target_invalid_address_space);
217 diag.set_arg("addr_space", addr_space);
218 diag.set_arg("cause", cause);
219 diag.set_arg("err", err);
222 TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => {
223 diag = handler.struct_fatal(fluent::errors_target_invalid_bits);
224 diag.set_arg("kind", kind);
225 diag.set_arg("bit", bit);
226 diag.set_arg("cause", cause);
227 diag.set_arg("err", err);
230 TargetDataLayoutErrors::MissingAlignment { cause } => {
231 diag = handler.struct_fatal(fluent::errors_target_missing_alignment);
232 diag.set_arg("cause", cause);
235 TargetDataLayoutErrors::InvalidAlignment { cause, err } => {
236 diag = handler.struct_fatal(fluent::errors_target_invalid_alignment);
237 diag.set_arg("cause", cause);
238 diag.set_arg("err", err);
241 TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
242 diag = handler.struct_fatal(fluent::errors_target_inconsistent_architecture);
243 diag.set_arg("dl", dl);
244 diag.set_arg("target", target);
247 TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => {
248 diag = handler.struct_fatal(fluent::errors_target_inconsistent_pointer_width);
249 diag.set_arg("pointer_size", pointer_size);
250 diag.set_arg("target", target);
253 TargetDataLayoutErrors::InvalidBitsSize { err } => {
254 diag = handler.struct_fatal(fluent::errors_target_invalid_bits_size);
255 diag.set_arg("err", err);