From 7ecd064bbe32419eb473b28cdc8e41dd34f20aa9 Mon Sep 17 00:00:00 2001 From: Nikita Tomashevich Date: Thu, 3 Nov 2022 20:45:14 +0300 Subject: [PATCH] Split infer_explicit_lifetime_required into several diags --- .../locales/en-US/infer.ftl | 15 +++--- compiler/rustc_infer/src/errors/mod.rs | 49 ++++++++++++------- .../nice_region_error/named_anon_conflict.rs | 23 +++++---- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/compiler/rustc_error_messages/locales/en-US/infer.ftl b/compiler/rustc_error_messages/locales/en-US/infer.ftl index f74af62702e..52babec4f9e 100644 --- a/compiler/rustc_error_messages/locales/en-US/infer.ftl +++ b/compiler/rustc_error_messages/locales/en-US/infer.ftl @@ -173,16 +173,15 @@ infer_msl_trait_note = this has an implicit `'static` lifetime requirement infer_msl_trait_sugg = consider relaxing the implicit `'static` requirement infer_suggest_add_let_for_letchains = consider adding `let` -infer_explicit_lifetime_required = explicit lifetime required in {$ident_kind -> - [ident] the type of `{$simple_ident}` - *[param_type] parameter type -} +infer_explicit_lifetime_required_with_ident = explicit lifetime required in the type of `{$simple_ident}` .label = lifetime `{$named}` required -infer_explicit_lifetime_required_sugg = add explicit lifetime `{$named}` to {$ident_kind -> - [ident] the type of `{$simple_ident}` - *[param_type] type -} +infer_explicit_lifetime_required_with_param_type = explicit lifetime required in parameter type + .label = lifetime `{$named}` required + +infer_explicit_lifetime_required_sugg_with_ident = add explicit lifetime `{$named}` to the type of `{$simple_ident}` + +infer_explicit_lifetime_required_sugg_with_param_type = add explicit lifetime `{$named}` to type infer_actual_impl_expl_expected_signature_two = {$leading_ellipsis -> [true] ... diff --git a/compiler/rustc_infer/src/errors/mod.rs b/compiler/rustc_infer/src/errors/mod.rs index 51b04eb0df0..9e3def93a6d 100644 --- a/compiler/rustc_infer/src/errors/mod.rs +++ b/compiler/rustc_infer/src/errors/mod.rs @@ -523,23 +523,38 @@ pub struct MismatchedStaticLifetime<'a> { } #[derive(Diagnostic)] -#[diag(infer_explicit_lifetime_required, code = "E0621")] -pub struct ExplicitLifetimeRequired<'a> { - #[primary_span] - #[label] - pub span: Span, - pub ident_kind: &'static str, - pub simple_ident: String, - pub named: String, - - #[suggestion( - infer_explicit_lifetime_required_sugg, - code = "{new_ty}", - applicability = "unspecified" - )] - pub new_ty_span: Span, - #[skip_arg] - pub new_ty: Ty<'a>, +pub enum ExplicitLifetimeRequired<'a> { + #[diag(infer_explicit_lifetime_required_with_ident, code = "E0621")] + WithIdent { + #[primary_span] + #[label] + span: Span, + simple_ident: Ident, + named: String, + #[suggestion( + infer_explicit_lifetime_required_sugg_with_ident, + code = "{new_ty}", + applicability = "unspecified" + )] + new_ty_span: Span, + #[skip_arg] + new_ty: Ty<'a>, + }, + #[diag(infer_explicit_lifetime_required_with_param_type, code = "E0621")] + WithParamType { + #[primary_span] + #[label] + span: Span, + named: String, + #[suggestion( + infer_explicit_lifetime_required_sugg_with_param_type, + code = "{new_ty}", + applicability = "unspecified" + )] + new_ty_span: Span, + #[skip_arg] + new_ty: Ty<'a>, + }, } #[derive(Subdiagnostic)] diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs index d7751158902..4e13ec90228 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs @@ -89,18 +89,17 @@ pub(super) fn try_report_named_anon_conflict( { return None; } - - let simple_ident = param.pat.simple_ident(); - let (ident_kind, simple_ident) = match simple_ident { - Some(ident) => ("ident", ident.to_string()), - None => ("param_type", String::new()), - }; - let named = named.to_string(); - - let err = - ExplicitLifetimeRequired { span, ident_kind, simple_ident, named, new_ty_span, new_ty }; - let err = self.tcx().sess.parse_sess.create_err(err); - Some(err) + let err = match param.pat.simple_ident() { + Some(simple_ident) => ExplicitLifetimeRequired::WithIdent { + span, + simple_ident, + named, + new_ty_span, + new_ty, + }, + None => ExplicitLifetimeRequired::WithParamType { span, named, new_ty_span, new_ty }, + }; + Some(self.tcx().sess.parse_sess.create_err(err)) } } -- 2.44.0