Skip to content

Commit 030545d

Browse files
committed
Store a single copy of the error registry in DiagCtxt
And pass this to the individual emitters when necessary.
1 parent ea6f5cb commit 030545d

File tree

9 files changed

+67
-46
lines changed

9 files changed

+67
-46
lines changed

compiler/rustc_codegen_ssa/src/back/write.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1883,7 +1883,11 @@ impl Translate for SharedEmitter {
18831883
}
18841884

18851885
impl Emitter for SharedEmitter {
1886-
fn emit_diagnostic(&mut self, mut diag: rustc_errors::DiagInner) {
1886+
fn emit_diagnostic(
1887+
&mut self,
1888+
mut diag: rustc_errors::DiagInner,
1889+
_registry: &rustc_errors::registry::Registry,
1890+
) {
18871891
// Check that we aren't missing anything interesting when converting to
18881892
// the cut-down local `DiagInner`.
18891893
assert_eq!(diag.span, MultiSpan::new());

compiler/rustc_errors/src/annotate_snippet_emitter_writer.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use rustc_span::SourceFile;
1212
use rustc_span::source_map::SourceMap;
1313

1414
use crate::emitter::FileWithAnnotatedLines;
15+
use crate::registry::Registry;
1516
use crate::snippet::Line;
1617
use crate::translation::{Translate, to_fluent_args};
1718
use crate::{
@@ -45,7 +46,7 @@ impl Translate for AnnotateSnippetEmitter {
4546

4647
impl Emitter for AnnotateSnippetEmitter {
4748
/// The entry point for the diagnostics generation
48-
fn emit_diagnostic(&mut self, mut diag: DiagInner) {
49+
fn emit_diagnostic(&mut self, mut diag: DiagInner, _registry: &Registry) {
4950
let fluent_args = to_fluent_args(diag.args.iter());
5051

5152
let mut suggestions = diag.suggestions.unwrap_tag();

compiler/rustc_errors/src/emitter.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use termcolor::{Buffer, BufferWriter, Color, ColorChoice, ColorSpec, StandardStr
2727
use tracing::{debug, instrument, trace, warn};
2828

2929
use crate::diagnostic::DiagLocation;
30+
use crate::registry::Registry;
3031
use crate::snippet::{
3132
Annotation, AnnotationColumn, AnnotationType, Line, MultilineAnnotation, Style, StyledString,
3233
};
@@ -181,15 +182,15 @@ pub type DynEmitter = dyn Emitter + DynSend;
181182
/// Emitter trait for emitting errors.
182183
pub trait Emitter: Translate {
183184
/// Emit a structured diagnostic.
184-
fn emit_diagnostic(&mut self, diag: DiagInner);
185+
fn emit_diagnostic(&mut self, diag: DiagInner, registry: &Registry);
185186

186187
/// Emit a notification that an artifact has been output.
187188
/// Currently only supported for the JSON format.
188189
fn emit_artifact_notification(&mut self, _path: &Path, _artifact_type: &str) {}
189190

190191
/// Emit a report about future breakage.
191192
/// Currently only supported for the JSON format.
192-
fn emit_future_breakage_report(&mut self, _diags: Vec<DiagInner>) {}
193+
fn emit_future_breakage_report(&mut self, _diags: Vec<DiagInner>, _registry: &Registry) {}
193194

194195
/// Emit list of unused externs.
195196
/// Currently only supported for the JSON format.
@@ -500,7 +501,7 @@ impl Emitter for HumanEmitter {
500501
self.sm.as_deref()
501502
}
502503

503-
fn emit_diagnostic(&mut self, mut diag: DiagInner) {
504+
fn emit_diagnostic(&mut self, mut diag: DiagInner, _registry: &Registry) {
504505
let fluent_args = to_fluent_args(diag.args.iter());
505506

506507
let mut suggestions = diag.suggestions.unwrap_tag();
@@ -561,7 +562,7 @@ impl Emitter for SilentEmitter {
561562
None
562563
}
563564

564-
fn emit_diagnostic(&mut self, mut diag: DiagInner) {
565+
fn emit_diagnostic(&mut self, mut diag: DiagInner, _registry: &Registry) {
565566
if self.emit_fatal_diagnostic && diag.level == Level::Fatal {
566567
if let Some(fatal_note) = &self.fatal_note {
567568
diag.sub(Level::Note, fatal_note.clone(), MultiSpan::new());

compiler/rustc_errors/src/json.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ mod tests;
4444
pub struct JsonEmitter {
4545
#[setters(skip)]
4646
dst: IntoDynSyncSend<Box<dyn Write + Send>>,
47-
registry: Option<Registry>,
4847
#[setters(skip)]
4948
sm: Lrc<SourceMap>,
5049
fluent_bundle: Option<Lrc<FluentBundle>>,
@@ -74,7 +73,6 @@ impl JsonEmitter {
7473
) -> JsonEmitter {
7574
JsonEmitter {
7675
dst: IntoDynSyncSend(dst),
77-
registry: None,
7876
sm,
7977
fluent_bundle: None,
8078
fallback_bundle,
@@ -121,8 +119,8 @@ impl Translate for JsonEmitter {
121119
}
122120

123121
impl Emitter for JsonEmitter {
124-
fn emit_diagnostic(&mut self, diag: crate::DiagInner) {
125-
let data = Diagnostic::from_errors_diagnostic(diag, self);
122+
fn emit_diagnostic(&mut self, diag: crate::DiagInner, registry: &Registry) {
123+
let data = Diagnostic::from_errors_diagnostic(diag, self, registry);
126124
let result = self.emit(EmitTyped::Diagnostic(data));
127125
if let Err(e) = result {
128126
panic!("failed to print diagnostics: {e:?}");
@@ -137,7 +135,7 @@ impl Emitter for JsonEmitter {
137135
}
138136
}
139137

140-
fn emit_future_breakage_report(&mut self, diags: Vec<crate::DiagInner>) {
138+
fn emit_future_breakage_report(&mut self, diags: Vec<crate::DiagInner>, registry: &Registry) {
141139
let data: Vec<FutureBreakageItem<'_>> = diags
142140
.into_iter()
143141
.map(|mut diag| {
@@ -151,7 +149,7 @@ impl Emitter for JsonEmitter {
151149
}
152150
FutureBreakageItem {
153151
diagnostic: EmitTyped::Diagnostic(Diagnostic::from_errors_diagnostic(
154-
diag, self,
152+
diag, self, registry,
155153
)),
156154
}
157155
})
@@ -291,7 +289,11 @@ struct UnusedExterns<'a> {
291289

292290
impl Diagnostic {
293291
/// Converts from `rustc_errors::DiagInner` to `Diagnostic`.
294-
fn from_errors_diagnostic(diag: crate::DiagInner, je: &JsonEmitter) -> Diagnostic {
292+
fn from_errors_diagnostic(
293+
diag: crate::DiagInner,
294+
je: &JsonEmitter,
295+
registry: &Registry,
296+
) -> Diagnostic {
295297
let args = to_fluent_args(diag.args.iter());
296298
let sugg_to_diag = |sugg: &CodeSuggestion| {
297299
let translated_message =
@@ -344,7 +346,7 @@ impl Diagnostic {
344346
let code = if let Some(code) = diag.code {
345347
Some(DiagnosticCode {
346348
code: code.to_string(),
347-
explanation: je.registry.as_ref().unwrap().try_find_description(code).ok(),
349+
explanation: registry.try_find_description(code).ok(),
348350
})
349351
} else if let Some(IsLint { name, .. }) = &diag.is_lint {
350352
Some(DiagnosticCode { code: name.to_string(), explanation: None })
@@ -382,7 +384,7 @@ impl Diagnostic {
382384
} else {
383385
OutputTheme::Ascii
384386
})
385-
.emit_diagnostic(diag);
387+
.emit_diagnostic(diag, registry);
386388
let buf = Arc::try_unwrap(buf.0).unwrap().into_inner().unwrap();
387389
let buf = String::from_utf8(buf).unwrap();
388390

compiler/rustc_errors/src/lib.rs

+17-7
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ pub use diagnostic_impls::{
5555
};
5656
pub use emitter::ColorConfig;
5757
use emitter::{DynEmitter, Emitter, is_case_difference, is_different};
58-
use registry::Registry;
5958
use rustc_data_structures::AtomicRef;
6059
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
6160
use rustc_data_structures::stable_hasher::{Hash128, StableHasher};
@@ -77,6 +76,8 @@ pub use snippet::Style;
7776
pub use termcolor::{Color, ColorSpec, WriteColor};
7877
use tracing::debug;
7978

79+
use crate::registry::Registry;
80+
8081
pub mod annotate_snippet_emitter_writer;
8182
pub mod codes;
8283
mod diagnostic;
@@ -483,6 +484,8 @@ impl<'a> std::ops::Deref for DiagCtxtHandle<'a> {
483484
struct DiagCtxtInner {
484485
flags: DiagCtxtFlags,
485486

487+
registry: Registry,
488+
486489
/// The error guarantees from all emitted errors. The length gives the error count.
487490
err_guars: Vec<ErrorGuaranteed>,
488491
/// The error guarantee from all emitted lint errors. The length gives the
@@ -664,6 +667,11 @@ impl DiagCtxt {
664667
self
665668
}
666669

670+
pub fn with_registry(mut self, registry: Registry) -> Self {
671+
self.inner.get_mut().registry = registry;
672+
self
673+
}
674+
667675
pub fn new(emitter: Box<DynEmitter>) -> Self {
668676
Self { inner: Lock::new(DiagCtxtInner::new(emitter)) }
669677
}
@@ -694,7 +702,7 @@ impl DiagCtxt {
694702
struct FalseEmitter;
695703

696704
impl Emitter for FalseEmitter {
697-
fn emit_diagnostic(&mut self, _: DiagInner) {
705+
fn emit_diagnostic(&mut self, _: DiagInner, _: &Registry) {
698706
unimplemented!("false emitter must only used during `wrap_emitter`")
699707
}
700708

@@ -759,6 +767,7 @@ impl DiagCtxt {
759767
let mut inner = self.inner.borrow_mut();
760768
let DiagCtxtInner {
761769
flags: _,
770+
registry: _,
762771
err_guars,
763772
lint_err_guars,
764773
delayed_bugs,
@@ -964,7 +973,7 @@ impl<'a> DiagCtxtHandle<'a> {
964973
self.inner.borrow().has_errors_or_delayed_bugs()
965974
}
966975

967-
pub fn print_error_count(&self, registry: &Registry) {
976+
pub fn print_error_count(&self) {
968977
let mut inner = self.inner.borrow_mut();
969978

970979
// Any stashed diagnostics should have been handled by
@@ -1014,7 +1023,7 @@ impl<'a> DiagCtxtHandle<'a> {
10141023
.emitted_diagnostic_codes
10151024
.iter()
10161025
.filter_map(|&code| {
1017-
if registry.try_find_description(code).is_ok() {
1026+
if inner.registry.try_find_description(code).is_ok() {
10181027
Some(code.to_string())
10191028
} else {
10201029
None
@@ -1075,10 +1084,10 @@ impl<'a> DiagCtxtHandle<'a> {
10751084
}
10761085

10771086
pub fn emit_future_breakage_report(&self) {
1078-
let mut inner = self.inner.borrow_mut();
1087+
let inner = &mut *self.inner.borrow_mut();
10791088
let diags = std::mem::take(&mut inner.future_breakage_diagnostics);
10801089
if !diags.is_empty() {
1081-
inner.emitter.emit_future_breakage_report(diags);
1090+
inner.emitter.emit_future_breakage_report(diags, &inner.registry);
10821091
}
10831092
}
10841093

@@ -1409,6 +1418,7 @@ impl DiagCtxtInner {
14091418
fn new(emitter: Box<DynEmitter>) -> Self {
14101419
Self {
14111420
flags: DiagCtxtFlags { can_emit_warnings: true, ..Default::default() },
1421+
registry: Registry::new(&[]),
14121422
err_guars: Vec::new(),
14131423
lint_err_guars: Vec::new(),
14141424
delayed_bugs: Vec::new(),
@@ -1582,7 +1592,7 @@ impl DiagCtxtInner {
15821592
}
15831593
self.has_printed = true;
15841594

1585-
self.emitter.emit_diagnostic(diagnostic);
1595+
self.emitter.emit_diagnostic(diagnostic, &self.registry);
15861596
}
15871597

15881598
if is_error {

compiler/rustc_interface/src/interface.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
441441
temps_dir,
442442
},
443443
bundle,
444-
config.registry.clone(),
444+
config.registry,
445445
locale_resources,
446446
config.lint_caps,
447447
target,
@@ -499,7 +499,7 @@ pub fn run_compiler<R: Send>(config: Config, f: impl FnOnce(&Compiler) -> R + Se
499499
// If `f` panics, `finish_diagnostics` will run during
500500
// unwinding because of the `defer`.
501501
let sess_abort_guard = defer(|| {
502-
compiler.sess.finish_diagnostics(&config.registry);
502+
compiler.sess.finish_diagnostics();
503503
});
504504

505505
let res = f(&compiler);

compiler/rustc_session/src/session.rs

+6-9
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ use rustc_errors::emitter::{
1919
DynEmitter, HumanEmitter, HumanReadableErrorType, OutputTheme, stderr_destination,
2020
};
2121
use rustc_errors::json::JsonEmitter;
22-
use rustc_errors::registry::Registry;
2322
use rustc_errors::{
2423
Diag, DiagCtxt, DiagCtxtHandle, DiagMessage, Diagnostic, ErrorGuaranteed, FatalAbort,
2524
FluentBundle, LazyFallbackBundle, TerminalUrl, fallback_fluent_bundle,
@@ -276,11 +275,11 @@ impl Session {
276275
}
277276

278277
/// Invoked all the way at the end to finish off diagnostics printing.
279-
pub fn finish_diagnostics(&self, registry: &Registry) -> Option<ErrorGuaranteed> {
278+
pub fn finish_diagnostics(&self) -> Option<ErrorGuaranteed> {
280279
let mut guar = None;
281280
guar = guar.or(self.check_miri_unleashed_features());
282281
guar = guar.or(self.dcx().emit_stashed_diagnostics());
283-
self.dcx().print_error_count(registry);
282+
self.dcx().print_error_count();
284283
if self.opts.json_future_incompat {
285284
self.dcx().emit_future_breakage_report();
286285
}
@@ -880,7 +879,6 @@ impl Session {
880879
#[allow(rustc::bad_opt_access)]
881880
fn default_emitter(
882881
sopts: &config::Options,
883-
registry: rustc_errors::registry::Registry,
884882
source_map: Lrc<SourceMap>,
885883
bundle: Option<Lrc<FluentBundle>>,
886884
fallback_bundle: LazyFallbackBundle,
@@ -943,7 +941,6 @@ fn default_emitter(
943941
json_rendered,
944942
color_config,
945943
)
946-
.registry(Some(registry))
947944
.fluent_bundle(bundle)
948945
.ui_testing(sopts.unstable_opts.ui_testing)
949946
.ignored_directories_in_source_blocks(
@@ -999,11 +996,11 @@ pub fn build_session(
999996
sopts.unstable_opts.translate_directionality_markers,
1000997
);
1001998
let source_map = rustc_span::source_map::get_source_map().unwrap();
1002-
let emitter =
1003-
default_emitter(&sopts, registry, Lrc::clone(&source_map), bundle, fallback_bundle);
999+
let emitter = default_emitter(&sopts, Lrc::clone(&source_map), bundle, fallback_bundle);
10041000

1005-
let mut dcx =
1006-
DiagCtxt::new(emitter).with_flags(sopts.unstable_opts.dcx_flags(can_emit_warnings));
1001+
let mut dcx = DiagCtxt::new(emitter)
1002+
.with_flags(sopts.unstable_opts.dcx_flags(can_emit_warnings))
1003+
.with_registry(registry);
10071004
if let Some(ice_file) = ice_file {
10081005
dcx = dcx.with_ice_file(ice_file);
10091006
}

src/librustdoc/passes/lint/check_code_block_syntax.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use rustc_data_structures::sync::{Lock, Lrc};
44
use rustc_errors::emitter::Emitter;
5+
use rustc_errors::registry::Registry;
56
use rustc_errors::translation::{Translate, to_fluent_args};
67
use rustc_errors::{Applicability, DiagCtxt, DiagInner, LazyFallbackBundle};
78
use rustc_parse::{source_str_to_stream, unwrap_or_emit_fatal};
@@ -155,7 +156,7 @@ impl Translate for BufferEmitter {
155156
}
156157

157158
impl Emitter for BufferEmitter {
158-
fn emit_diagnostic(&mut self, diag: DiagInner) {
159+
fn emit_diagnostic(&mut self, diag: DiagInner, _registry: &Registry) {
159160
let mut buffer = self.buffer.borrow_mut();
160161

161162
let fluent_args = to_fluent_args(diag.args.iter());

0 commit comments

Comments
 (0)