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};
17 pub struct DiagnosticArgFromDisplay<'a>(pub &'a dyn fmt::Display);
19 impl IntoDiagnosticArg for DiagnosticArgFromDisplay<'_> {
20 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
21 self.0.to_string().into_diagnostic_arg()
25 impl<'a> From<&'a dyn fmt::Display> for DiagnosticArgFromDisplay<'a> {
26 fn from(t: &'a dyn fmt::Display) -> Self {
27 DiagnosticArgFromDisplay(t)
31 impl<'a, T: fmt::Display> From<&'a T> for DiagnosticArgFromDisplay<'a> {
32 fn from(t: &'a T) -> Self {
33 DiagnosticArgFromDisplay(t)
37 macro_rules! into_diagnostic_arg_using_display {
38 ($( $ty:ty ),+ $(,)?) => {
40 impl IntoDiagnosticArg for $ty {
41 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
42 self.to_string().into_diagnostic_arg()
49 into_diagnostic_arg_using_display!(
65 MacroRulesNormalizedIdent,
72 impl IntoDiagnosticArg for bool {
73 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
75 DiagnosticArgValue::Str(Cow::Borrowed("true"))
77 DiagnosticArgValue::Str(Cow::Borrowed("false"))
82 impl IntoDiagnosticArg for char {
83 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
84 DiagnosticArgValue::Str(Cow::Owned(format!("{:?}", self)))
88 impl IntoDiagnosticArg for Symbol {
89 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
90 self.to_ident_string().into_diagnostic_arg()
94 impl<'a> IntoDiagnosticArg for &'a str {
95 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
96 self.to_string().into_diagnostic_arg()
100 impl IntoDiagnosticArg for String {
101 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
102 DiagnosticArgValue::Str(Cow::Owned(self))
106 impl<'a> IntoDiagnosticArg for &'a Path {
107 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
108 DiagnosticArgValue::Str(Cow::Owned(self.display().to_string()))
112 impl IntoDiagnosticArg for PathBuf {
113 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
114 DiagnosticArgValue::Str(Cow::Owned(self.display().to_string()))
118 impl IntoDiagnosticArg for usize {
119 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
120 DiagnosticArgValue::Number(self)
124 impl IntoDiagnosticArg for PanicStrategy {
125 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
126 DiagnosticArgValue::Str(Cow::Owned(self.desc().to_string()))
130 impl IntoDiagnosticArg for hir::ConstContext {
131 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
132 DiagnosticArgValue::Str(Cow::Borrowed(match self {
133 hir::ConstContext::ConstFn => "constant function",
134 hir::ConstContext::Static(_) => "static",
135 hir::ConstContext::Const => "constant",
140 impl IntoDiagnosticArg for ast::Path {
141 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
142 DiagnosticArgValue::Str(Cow::Owned(pprust::path_to_string(&self)))
146 impl IntoDiagnosticArg for ast::token::Token {
147 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
148 DiagnosticArgValue::Str(pprust::token_to_string(&self))
152 impl IntoDiagnosticArg for ast::token::TokenKind {
153 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
154 DiagnosticArgValue::Str(pprust::token_kind_to_string(&self))
158 impl IntoDiagnosticArg for Level {
159 fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
160 DiagnosticArgValue::Str(Cow::Borrowed(match self {
161 Level::Allow => "-A",
163 Level::ForceWarn(_) => "--force-warn",
165 Level::Forbid => "-F",
166 Level::Expect(_) => {
167 unreachable!("lints with the level of `expect` should not run this code");
173 impl IntoDiagnostic<'_, !> for TargetDataLayoutErrors<'_> {
174 fn into_diagnostic(self, handler: &Handler) -> DiagnosticBuilder<'_, !> {
177 TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => {
178 diag = handler.struct_fatal(fluent::errors_target_invalid_address_space);
179 diag.set_arg("addr_space", addr_space);
180 diag.set_arg("cause", cause);
181 diag.set_arg("err", err);
184 TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => {
185 diag = handler.struct_fatal(fluent::errors_target_invalid_bits);
186 diag.set_arg("kind", kind);
187 diag.set_arg("bit", bit);
188 diag.set_arg("cause", cause);
189 diag.set_arg("err", err);
192 TargetDataLayoutErrors::MissingAlignment { cause } => {
193 diag = handler.struct_fatal(fluent::errors_target_missing_alignment);
194 diag.set_arg("cause", cause);
197 TargetDataLayoutErrors::InvalidAlignment { cause, err } => {
198 diag = handler.struct_fatal(fluent::errors_target_invalid_alignment);
199 diag.set_arg("cause", cause);
200 diag.set_arg("err", err);
203 TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
204 diag = handler.struct_fatal(fluent::errors_target_inconsistent_architecture);
205 diag.set_arg("dl", dl);
206 diag.set_arg("target", target);
209 TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => {
210 diag = handler.struct_fatal(fluent::errors_target_inconsistent_pointer_width);
211 diag.set_arg("pointer_size", pointer_size);
212 diag.set_arg("target", target);
215 TargetDataLayoutErrors::InvalidBitsSize { err } => {
216 diag = handler.struct_fatal(fluent::errors_target_invalid_bits_size);
217 diag.set_arg("err", err);