Delay diagnostic translation in rustc_codegen_ssa
This commit is contained in:
parent
9a1545861e
commit
b4820a3b94
@ -15,10 +15,8 @@ use rustc_data_structures::profiling::TimingGuard;
|
|||||||
use rustc_data_structures::profiling::VerboseTimingGuard;
|
use rustc_data_structures::profiling::VerboseTimingGuard;
|
||||||
use rustc_data_structures::sync::Lrc;
|
use rustc_data_structures::sync::Lrc;
|
||||||
use rustc_errors::emitter::Emitter;
|
use rustc_errors::emitter::Emitter;
|
||||||
use rustc_errors::{
|
use rustc_errors::{translation::Translate, DiagnosticId, FatalError, Handler, Level};
|
||||||
translation::{to_fluent_args, Translate},
|
use rustc_errors::{DiagnosticMessage, Style};
|
||||||
DiagnosticId, FatalError, Handler, Level,
|
|
||||||
};
|
|
||||||
use rustc_fs_util::link_or_copy;
|
use rustc_fs_util::link_or_copy;
|
||||||
use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
|
use rustc_hir::def_id::{CrateNum, LOCAL_CRATE};
|
||||||
use rustc_incremental::{
|
use rustc_incremental::{
|
||||||
@ -38,6 +36,7 @@ use rustc_span::{BytePos, FileName, InnerSpan, Pos, Span};
|
|||||||
use rustc_target::spec::{MergeFunctions, SanitizerSet};
|
use rustc_target::spec::{MergeFunctions, SanitizerSet};
|
||||||
|
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
|
use std::borrow::Cow;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
@ -969,8 +968,11 @@ pub enum Message<B: WriteBackendMethods> {
|
|||||||
CodegenAborted,
|
CodegenAborted,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DiagnosticArgName<'source> = Cow<'source, str>;
|
||||||
|
|
||||||
struct Diagnostic {
|
struct Diagnostic {
|
||||||
msg: String,
|
msg: Vec<(DiagnosticMessage, Style)>,
|
||||||
|
args: FxHashMap<DiagnosticArgName<'static>, rustc_errors::DiagnosticArgValue<'static>>,
|
||||||
code: Option<DiagnosticId>,
|
code: Option<DiagnosticId>,
|
||||||
lvl: Level,
|
lvl: Level,
|
||||||
}
|
}
|
||||||
@ -1743,15 +1745,18 @@ impl Translate for SharedEmitter {
|
|||||||
|
|
||||||
impl Emitter for SharedEmitter {
|
impl Emitter for SharedEmitter {
|
||||||
fn emit_diagnostic(&mut self, diag: &rustc_errors::Diagnostic) {
|
fn emit_diagnostic(&mut self, diag: &rustc_errors::Diagnostic) {
|
||||||
let fluent_args = to_fluent_args(diag.args());
|
let args: FxHashMap<Cow<'_, str>, rustc_errors::DiagnosticArgValue<'_>> =
|
||||||
|
diag.args().map(|(name, arg)| (name.clone(), arg.clone())).collect();
|
||||||
drop(self.sender.send(SharedEmitterMessage::Diagnostic(Diagnostic {
|
drop(self.sender.send(SharedEmitterMessage::Diagnostic(Diagnostic {
|
||||||
msg: self.translate_messages(&diag.message, &fluent_args).to_string(),
|
msg: diag.message.clone(),
|
||||||
|
args: args.clone(),
|
||||||
code: diag.code.clone(),
|
code: diag.code.clone(),
|
||||||
lvl: diag.level(),
|
lvl: diag.level(),
|
||||||
})));
|
})));
|
||||||
for child in &diag.children {
|
for child in &diag.children {
|
||||||
drop(self.sender.send(SharedEmitterMessage::Diagnostic(Diagnostic {
|
drop(self.sender.send(SharedEmitterMessage::Diagnostic(Diagnostic {
|
||||||
msg: self.translate_messages(&child.message, &fluent_args).to_string(),
|
msg: child.message.clone(),
|
||||||
|
args: args.clone(),
|
||||||
code: None,
|
code: None,
|
||||||
lvl: child.level,
|
lvl: child.level,
|
||||||
})));
|
})));
|
||||||
@ -1782,10 +1787,14 @@ impl SharedEmitterMain {
|
|||||||
match message {
|
match message {
|
||||||
Ok(SharedEmitterMessage::Diagnostic(diag)) => {
|
Ok(SharedEmitterMessage::Diagnostic(diag)) => {
|
||||||
let handler = sess.diagnostic();
|
let handler = sess.diagnostic();
|
||||||
let mut d = rustc_errors::Diagnostic::new(diag.lvl, &diag.msg);
|
let mut d = rustc_errors::Diagnostic::new(diag.lvl, String::new());
|
||||||
|
d.message = diag.msg;
|
||||||
if let Some(code) = diag.code {
|
if let Some(code) = diag.code {
|
||||||
d.code(code);
|
d.code(code);
|
||||||
}
|
}
|
||||||
|
for (name, arg) in diag.args {
|
||||||
|
d.set_arg(name, arg);
|
||||||
|
}
|
||||||
handler.emit_diagnostic(&mut d);
|
handler.emit_diagnostic(&mut d);
|
||||||
}
|
}
|
||||||
Ok(SharedEmitterMessage::InlineAsmError(cookie, msg, level, source)) => {
|
Ok(SharedEmitterMessage::InlineAsmError(cookie, msg, level, source)) => {
|
||||||
|
@ -44,6 +44,15 @@ pub trait IntoDiagnosticArg {
|
|||||||
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static>;
|
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'source> IntoDiagnosticArg for DiagnosticArgValue<'source> {
|
||||||
|
fn into_diagnostic_arg(self) -> DiagnosticArgValue<'static> {
|
||||||
|
match self {
|
||||||
|
DiagnosticArgValue::Str(s) => DiagnosticArgValue::Str(Cow::Owned(s.into_owned())),
|
||||||
|
DiagnosticArgValue::Number(n) => DiagnosticArgValue::Number(n),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'source> Into<FluentValue<'source>> for DiagnosticArgValue<'source> {
|
impl<'source> Into<FluentValue<'source>> for DiagnosticArgValue<'source> {
|
||||||
fn into(self) -> FluentValue<'source> {
|
fn into(self) -> FluentValue<'source> {
|
||||||
match self {
|
match self {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user