Skip to content

Commit 9b36252

Browse files
committed
Make E0401 translatable
1 parent b00e408 commit 9b36252

File tree

3 files changed

+65
-35
lines changed

3 files changed

+65
-35
lines changed

compiler/rustc_resolve/messages.ftl

+13-16
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,6 @@ resolve_cannot_find_ident_in_this_scope =
6464
resolve_cannot_glob_import_possible_crates =
6565
cannot glob-import all possible crates
6666
67-
resolve_cannot_use_self_type_here =
68-
can't use `Self` here
69-
7067
resolve_change_import_binding =
7168
you can use `as` to change the binding name of the import
7269
@@ -86,9 +83,6 @@ resolve_const_not_member_of_trait =
8683
const `{$const_}` is not a member of trait `{$trait_}`
8784
.label = not a member of trait `{$trait_}`
8885
89-
resolve_const_param_from_outer_fn =
90-
const parameter from outer function
91-
9286
resolve_const_param_in_enum_discriminant =
9387
const parameters may not be used in enum discriminant values
9488
@@ -115,10 +109,19 @@ resolve_forward_declared_generic_param =
115109
generic parameters with a default cannot use forward declared identifiers
116110
.label = defaulted generic parameters cannot be forward declared
117111
118-
resolve_generic_params_from_outer_function =
119-
can't use generic parameters from outer function
120-
.label = use of generic parameter from outer function
121-
.suggestion = try using a local generic parameter instead
112+
resolve_generic_params_from_outer_item =
113+
can't use generic parameters from outer item
114+
.label = use of generic parameter from outer item
115+
.refer_to_type_directly = refer to the type directly here instead
116+
.suggestion = try introducing a local generic parameter here
117+
118+
resolve_generic_params_from_outer_item_const_param = const parameter from outer item
119+
120+
resolve_generic_params_from_outer_item_self_ty_alias = `Self` type implicitly declared here, by this `impl`
121+
122+
resolve_generic_params_from_outer_item_self_ty_param = can't use `Self` here
123+
124+
resolve_generic_params_from_outer_item_ty_param = type parameter from outer item
122125
123126
resolve_glob_import_doesnt_reexport =
124127
glob import doesn't reexport anything because no candidate is public enough
@@ -273,9 +276,6 @@ resolve_type_not_member_of_trait =
273276
type `{$type_}` is not a member of trait `{$trait_}`
274277
.label = not a member of trait `{$trait_}`
275278
276-
resolve_type_param_from_outer_fn =
277-
type parameter from outer function
278-
279279
resolve_type_param_in_enum_discriminant =
280280
type parameters may not be used in enum discriminant values
281281
@@ -311,9 +311,6 @@ resolve_unreachable_label_suggestion_use_similarly_named =
311311
resolve_unreachable_label_with_similar_name_exists =
312312
a label with a similar name exists but is unreachable
313313
314-
resolve_use_a_type_here_instead =
315-
use a type here instead
316-
317314
resolve_variable_bound_with_different_mode =
318315
variable `{$variable_name}` is bound inconsistently across alternatives separated by `|`
319316
.label = bound in different ways

compiler/rustc_resolve/src/diagnostics.rs

+18-19
Original file line numberDiff line numberDiff line change
@@ -554,34 +554,34 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
554554
) -> DiagnosticBuilder<'_, ErrorGuaranteed> {
555555
match resolution_error {
556556
ResolutionError::GenericParamsFromOuterItem(outer_res, has_generic_params) => {
557-
let mut err = struct_span_err!(
558-
self.tcx.sess,
557+
use errs::GenericParamsFromOuterItemLabel as Label;
558+
let mut err = errs::GenericParamsFromOuterItem {
559559
span,
560-
E0401,
561-
"can't use generic parameters from outer item",
562-
);
563-
err.span_label(span, "use of generic parameter from outer item");
560+
label: None,
561+
refer_to_type_directly: None,
562+
sugg: None,
563+
};
564564

565565
let sm = self.tcx.sess.source_map();
566566
let def_id = match outer_res {
567567
Res::SelfTyParam { .. } => {
568-
err.span_label(span, "can't use `Self` here");
569-
return err;
568+
err.label = Some(Label::SelfTyParam(span));
569+
return self.tcx.sess.create_err(err);
570570
}
571571
Res::SelfTyAlias { alias_to: def_id, .. } => {
572-
err.span_label(
573-
reduce_impl_span_to_impl_keyword(sm, self.def_span(def_id)),
574-
"`Self` type implicitly declared here, by this `impl`",
575-
);
576-
err.span_label(span, "refer to the type directly here instead");
577-
return err;
572+
err.label = Some(Label::SelfTyAlias(reduce_impl_span_to_impl_keyword(
573+
sm,
574+
self.def_span(def_id),
575+
)));
576+
err.refer_to_type_directly = Some(span);
577+
return self.tcx.sess.create_err(err);
578578
}
579579
Res::Def(DefKind::TyParam, def_id) => {
580-
err.span_label(self.def_span(def_id), "type parameter from outer item");
580+
err.label = Some(Label::TyParam(self.def_span(def_id)));
581581
def_id
582582
}
583583
Res::Def(DefKind::ConstParam, def_id) => {
584-
err.span_label(self.def_span(def_id), "const parameter from outer item");
584+
err.label = Some(Label::ConstParam(self.def_span(def_id)));
585585
def_id
586586
}
587587
_ => {
@@ -594,7 +594,6 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
594594
};
595595

596596
if let HasGenericParams::Yes(span) = has_generic_params {
597-
let sugg_msg = "try introducing a local generic parameter here";
598597
let name = self.tcx.item_name(def_id);
599598
let (span, snippet) = if span.is_empty() {
600599
let snippet = format!("<{name}>");
@@ -604,10 +603,10 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
604603
let snippet = format!("{name}, ");
605604
(span, snippet)
606605
};
607-
err.span_suggestion(span, sugg_msg, snippet, Applicability::MaybeIncorrect);
606+
err.sugg = Some(errs::GenericParamsFromOuterItemSugg { span, snippet });
608607
}
609608

610-
err
609+
self.tcx.sess.create_err(err)
611610
}
612611
ResolutionError::NameAlreadyUsedInParameterList(name, first_use_span) => self
613612
.tcx

compiler/rustc_resolve/src/errors.rs

+34
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,40 @@ pub(crate) struct CrateRootNamesMustBeNamedExplicitly(#[primary_span] pub(crate)
3232
#[diag(resolve_crate_root_imports_must_be_named_explicitly)]
3333
pub(crate) struct ResolutionError(#[primary_span] pub(crate) Span);
3434

35+
#[derive(Diagnostic)]
36+
#[diag(resolve_generic_params_from_outer_item, code = "E0401")]
37+
pub(crate) struct GenericParamsFromOuterItem {
38+
#[primary_span]
39+
#[label]
40+
pub(crate) span: Span,
41+
#[subdiagnostic]
42+
pub(crate) label: Option<GenericParamsFromOuterItemLabel>,
43+
#[label(resolve_refer_to_type_directly)]
44+
pub(crate) refer_to_type_directly: Option<Span>,
45+
#[subdiagnostic]
46+
pub(crate) sugg: Option<GenericParamsFromOuterItemSugg>,
47+
}
48+
49+
#[derive(Subdiagnostic)]
50+
pub(crate) enum GenericParamsFromOuterItemLabel {
51+
#[label(resolve_generic_params_from_outer_item_self_ty_param)]
52+
SelfTyParam(#[primary_span] Span),
53+
#[label(resolve_generic_params_from_outer_item_self_ty_alias)]
54+
SelfTyAlias(#[primary_span] Span),
55+
#[label(resolve_generic_params_from_outer_item_ty_param)]
56+
TyParam(#[primary_span] Span),
57+
#[label(resolve_generic_params_from_outer_item_const_param)]
58+
ConstParam(#[primary_span] Span),
59+
}
60+
61+
#[derive(Subdiagnostic)]
62+
#[suggestion(resolve_suggestion, code = "{snippet}", applicability = "maybe-incorrect")]
63+
pub(crate) struct GenericParamsFromOuterItemSugg {
64+
#[primary_span]
65+
pub(crate) span: Span,
66+
pub(crate) snippet: String,
67+
}
68+
3569
#[derive(Diagnostic)]
3670
#[diag(resolve_name_is_already_used_as_generic_parameter, code = "E0403")]
3771
pub(crate) struct NameAlreadyUsedInParameterList {

0 commit comments

Comments
 (0)