2 fluent, DiagnosticArgValue, DiagnosticBuilder, Handler, IntoDiagnostic, IntoDiagnosticArg,
4 use rustc_target::abi::TargetDataLayoutErrors;
5 use rustc_target::spec::{PanicStrategy, SplitDebuginfo, StackProtector, TargetTriple};
8 use rustc_ast_pretty::pprust;
10 use rustc_span::edition::Edition;
11 use rustc_span::symbol::{Ident, MacroRulesNormalizedIdent, Symbol};
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 IntoDiagnostic<'_, !> for TargetDataLayoutErrors<'_> {
159 fn into_diagnostic(self, handler: &Handler) -> DiagnosticBuilder<'_, !> {
162 TargetDataLayoutErrors::InvalidAddressSpace { addr_space, err, cause } => {
163 diag = handler.struct_fatal(fluent::errors::target_invalid_address_space);
164 diag.set_arg("addr_space", addr_space);
165 diag.set_arg("cause", cause);
166 diag.set_arg("err", err);
169 TargetDataLayoutErrors::InvalidBits { kind, bit, cause, err } => {
170 diag = handler.struct_fatal(fluent::errors::target_invalid_bits);
171 diag.set_arg("kind", kind);
172 diag.set_arg("bit", bit);
173 diag.set_arg("cause", cause);
174 diag.set_arg("err", err);
177 TargetDataLayoutErrors::MissingAlignment { cause } => {
178 diag = handler.struct_fatal(fluent::errors::target_missing_alignment);
179 diag.set_arg("cause", cause);
182 TargetDataLayoutErrors::InvalidAlignment { cause, err } => {
183 diag = handler.struct_fatal(fluent::errors::target_invalid_alignment);
184 diag.set_arg("cause", cause);
185 diag.set_arg("err", err);
188 TargetDataLayoutErrors::InconsistentTargetArchitecture { dl, target } => {
189 diag = handler.struct_fatal(fluent::errors::target_inconsistent_architecture);
190 diag.set_arg("dl", dl);
191 diag.set_arg("target", target);
194 TargetDataLayoutErrors::InconsistentTargetPointerWidth { pointer_size, target } => {
195 diag = handler.struct_fatal(fluent::errors::target_inconsistent_pointer_width);
196 diag.set_arg("pointer_size", pointer_size);
197 diag.set_arg("target", target);
200 TargetDataLayoutErrors::InvalidBitsSize { err } => {
201 diag = handler.struct_fatal(fluent::errors::target_invalid_bits_size);
202 diag.set_arg("err", err);