Skip to content

Commit 0609c0f

Browse files
committed
migrate diagnostic_items.rs to translateable diagnostics
1 parent 3a74833 commit 0609c0f

File tree

3 files changed

+49
-19
lines changed

3 files changed

+49
-19
lines changed

compiler/rustc_error_messages/locales/en-US/passes.ftl

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ passes_collapse_debuginfo =
357357
passes_deprecated_annotation_has_no_effect =
358358
this `#[deprecated]` annotation has no effect
359359
.suggestion = remove the unnecessary deprecation attribute
360-
360+
361361
passes_unknown_external_lang_item =
362362
unknown external lang item: `{$lang_item}`
363363
@@ -389,3 +389,13 @@ passes_local_duplicate_lang_item =
389389
passes_invalid_attr_at_crate_level =
390390
`{$name}` attribute cannot be used at crate level
391391
.suggestion = perhaps you meant to use an outer attribute
392+
393+
passes_duplicate_diagnostic_item =
394+
duplicate diagnostic item found: `{$name}`.
395+
396+
passes_duplicate_diagnostic_item_in_crate =
397+
duplicate diagnostic item in crate `{$crate_name}`: `{$name}`.
398+
399+
passes_diagnostic_item_first_defined =
400+
the diagnostic item is first defined here
401+
.note = the diagnostic item is first defined in crate `{$orig_crate_name}`.

compiler/rustc_passes/src/diagnostic_items.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ use rustc_middle::ty::TyCtxt;
1616
use rustc_span::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE};
1717
use rustc_span::symbol::{sym, Symbol};
1818

19+
use crate::errors::{DuplicateDiagnosticItem, DuplicateDiagnosticItemInCrate};
20+
1921
fn observe_item<'tcx>(
2022
tcx: TyCtxt<'tcx>,
2123
diagnostic_items: &mut DiagnosticItems,
@@ -33,25 +35,23 @@ fn collect_item(tcx: TyCtxt<'_>, items: &mut DiagnosticItems, name: Symbol, item
3335
items.id_to_name.insert(item_def_id, name);
3436
if let Some(original_def_id) = items.name_to_id.insert(name, item_def_id) {
3537
if original_def_id != item_def_id {
36-
let mut err = match tcx.hir().span_if_local(item_def_id) {
37-
Some(span) => tcx
38-
.sess
39-
.struct_span_err(span, &format!("duplicate diagnostic item found: `{name}`.")),
40-
None => tcx.sess.struct_err(&format!(
41-
"duplicate diagnostic item in crate `{}`: `{}`.",
42-
tcx.crate_name(item_def_id.krate),
43-
name
44-
)),
45-
};
46-
if let Some(span) = tcx.hir().span_if_local(original_def_id) {
47-
err.span_note(span, "the diagnostic item is first defined here");
38+
let orig_span = tcx.hir().span_if_local(original_def_id);
39+
let orig_crate_name = if orig_span.is_some() {
40+
None
4841
} else {
49-
err.note(&format!(
50-
"the diagnostic item is first defined in crate `{}`.",
51-
tcx.crate_name(original_def_id.krate)
52-
));
53-
}
54-
err.emit();
42+
Some(tcx.crate_name(original_def_id.krate))
43+
};
44+
match tcx.hir().span_if_local(item_def_id) {
45+
Some(span) => tcx.sess.emit_err(DuplicateDiagnosticItem { span, name }),
46+
None => tcx.sess.emit_err(DuplicateDiagnosticItemInCrate {
47+
span: orig_span,
48+
// FIXME: We should not provide `name` to `orig_crate_name`. How do you create a blank/empty symbol?
49+
orig_crate_name: orig_crate_name.unwrap_or(name),
50+
have_orig_crate_name: orig_crate_name.map(|_| ()),
51+
crate_name: tcx.crate_name(item_def_id.krate),
52+
name,
53+
}),
54+
};
5555
}
5656
}
5757
}

compiler/rustc_passes/src/errors.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,3 +755,23 @@ impl IntoDiagnostic<'_> for InvalidAttrAtCrateLevel {
755755
diag
756756
}
757757
}
758+
759+
#[derive(Diagnostic)]
760+
#[diag(passes::duplicate_diagnostic_item)]
761+
pub struct DuplicateDiagnosticItem {
762+
#[primary_span]
763+
pub span: Span,
764+
pub name: Symbol,
765+
}
766+
767+
#[derive(Diagnostic)]
768+
#[diag(passes::duplicate_diagnostic_item_in_crate)]
769+
pub struct DuplicateDiagnosticItemInCrate {
770+
#[note(passes::diagnostic_item_first_defined)]
771+
pub span: Option<Span>,
772+
pub orig_crate_name: Symbol,
773+
#[note]
774+
pub have_orig_crate_name: Option<()>,
775+
pub crate_name: Symbol,
776+
pub name: Symbol,
777+
}

0 commit comments

Comments
 (0)