Skip to content

Commit 57eba4f

Browse files
committed
avoid string dispatch in fluent
1 parent 8e07a85 commit 57eba4f

File tree

3 files changed

+47
-17
lines changed

3 files changed

+47
-17
lines changed

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

+21-5
Original file line numberDiff line numberDiff line change
@@ -533,11 +533,27 @@ passes_no_main_function =
533533
.non_function_main = non-function item at `crate::main` is found
534534
535535
passes_duplicate_lang_item =
536-
{$message ->
537-
*[duplicate] found duplicate lang item `{$lang_item_name}`
538-
[duplicate_in_crate] duplicate lang item in crate `{$crate_name}`: `{$lang_item_name}`.
539-
[duplicate_in_crate_depends] duplicate lang item in crate `{$crate_name}` (which `{$dependency_of}` depends on): `{$lang_item_name}`.
540-
}
536+
found duplicate lang item `{$lang_item_name}`
537+
.first_defined_span = the lang item is first defined here
538+
.first_defined_crate_depends = the lang item is first defined in crate `{$orig_crate_name}` (which `{$orig_dependency_of}` depends on)
539+
.first_defined_crate = the lang item is first defined in crate `{$orig_crate_name}`.
540+
.first_definition_local = first definition in the local crate (`{$orig_crate_name}`)
541+
.second_definition_local = second definition in the local crate (`{$crate_name}`)
542+
.first_definition_path = first definition in `{$orig_crate_name}` loaded from {$orig_path}
543+
.second_definition_path = second definition in `{$crate_name}` loaded from {$path}
544+
545+
passes_duplicate_lang_item_crate =
546+
duplicate lang item in crate `{$crate_name}`: `{$lang_item_name}`.
547+
.first_defined_span = the lang item is first defined here
548+
.first_defined_crate_depends = the lang item is first defined in crate `{$orig_crate_name}` (which `{$orig_dependency_of}` depends on)
549+
.first_defined_crate = the lang item is first defined in crate `{$orig_crate_name}`.
550+
.first_definition_local = first definition in the local crate (`{$orig_crate_name}`)
551+
.second_definition_local = second definition in the local crate (`{$crate_name}`)
552+
.first_definition_path = first definition in `{$orig_crate_name}` loaded from {$orig_path}
553+
.second_definition_path = second definition in `{$crate_name}` loaded from {$path}
554+
555+
passes_duplicate_lang_item_crate_depends =
556+
duplicate lang item in crate `{$crate_name}` (which `{$dependency_of}` depends on): `{$lang_item_name}`.
541557
.first_defined_span = the lang item is first defined here
542558
.first_defined_crate_depends = the lang item is first defined in crate `{$orig_crate_name}` (which `{$orig_dependency_of}` depends on)
543559
.first_defined_crate = the lang item is first defined in crate `{$orig_crate_name}`.

compiler/rustc_passes/src/errors.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
1010
use rustc_middle::ty::{MainDefinition, Ty};
1111
use rustc_span::{Span, Symbol, DUMMY_SP};
1212

13+
use crate::lang_items::Duplicate;
14+
1315
#[derive(LintDiagnostic)]
1416
#[diag(passes::outer_crate_level_attr)]
1517
pub struct OuterCrateLevelAttr;
@@ -1175,7 +1177,7 @@ impl<'a> IntoDiagnostic<'a> for NoMainErr {
11751177
}
11761178
}
11771179

1178-
pub struct DuplicateLangItem<'a> {
1180+
pub struct DuplicateLangItem {
11791181
pub local_span: Option<Span>,
11801182
pub lang_item_name: Symbol,
11811183
pub crate_name: Symbol,
@@ -1187,16 +1189,23 @@ pub struct DuplicateLangItem<'a> {
11871189
pub orig_dependency_of: Symbol,
11881190
pub orig_is_local: bool,
11891191
pub orig_path: String,
1190-
pub message: &'a str,
1192+
pub(crate) duplicate: Duplicate,
11911193
}
11921194

1193-
impl<'a, 'b> IntoDiagnostic<'a> for DuplicateLangItem<'b> {
1195+
impl IntoDiagnostic<'_> for DuplicateLangItem {
11941196
fn into_diagnostic(
11951197
self,
1196-
handler: &'a rustc_errors::Handler,
1197-
) -> rustc_errors::DiagnosticBuilder<'a, ErrorGuaranteed> {
1198+
handler: &rustc_errors::Handler,
1199+
) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
11981200
let mut diag = handler.struct_err_with_code(
1199-
rustc_errors::fluent::passes::duplicate_lang_item,
1201+
match self.duplicate {
1202+
Duplicate::Plain => rustc_errors::fluent::passes::duplicate_lang_item,
1203+
1204+
Duplicate::Crate => rustc_errors::fluent::passes::duplicate_lang_item_crate,
1205+
Duplicate::CrateDepends => {
1206+
rustc_errors::fluent::passes::duplicate_lang_item_crate_depends
1207+
}
1208+
},
12001209
error_code!(E0152),
12011210
);
12021211
diag.set_arg("lang_item_name", self.lang_item_name);
@@ -1206,7 +1215,6 @@ impl<'a, 'b> IntoDiagnostic<'a> for DuplicateLangItem<'b> {
12061215
diag.set_arg("orig_crate_name", self.orig_crate_name);
12071216
diag.set_arg("orig_dependency_of", self.orig_dependency_of);
12081217
diag.set_arg("orig_path", self.orig_path);
1209-
diag.set_arg("message", self.message);
12101218
if let Some(span) = self.local_span {
12111219
diag.set_span(span);
12121220
}

compiler/rustc_passes/src/lang_items.rs

+11-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ use rustc_span::{symbol::kw::Empty, Span};
2424

2525
use rustc_middle::ty::query::Providers;
2626

27+
pub(crate) enum Duplicate {
28+
Plain,
29+
Crate,
30+
CrateDepends,
31+
}
32+
2733
struct LanguageItemCollector<'tcx> {
2834
items: LanguageItems,
2935
tcx: TyCtxt<'tcx>,
@@ -103,15 +109,15 @@ impl<'tcx> LanguageItemCollector<'tcx> {
103109
}
104110
}
105111

106-
let message = if local_span.is_some() {
107-
"duplicate"
112+
let duplicate = if local_span.is_some() {
113+
Duplicate::Plain
108114
} else {
109115
match self.tcx.extern_crate(item_def_id) {
110116
Some(ExternCrate { dependency_of: inner_dependency_of, .. }) => {
111117
dependency_of = self.tcx.crate_name(*inner_dependency_of);
112-
"duplicate_in_crate_depends"
118+
Duplicate::CrateDepends
113119
}
114-
_ => "duplicate_in_crate",
120+
_ => Duplicate::Crate,
115121
}
116122
};
117123

@@ -127,7 +133,7 @@ impl<'tcx> LanguageItemCollector<'tcx> {
127133
orig_dependency_of,
128134
orig_is_local,
129135
orig_path,
130-
message,
136+
duplicate,
131137
});
132138
}
133139
}

0 commit comments

Comments
 (0)