diff options
| author | mejrs <> | 2022-12-23 22:23:37 +0100 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2023-01-11 14:40:07 -0800 |
| commit | 8476c517c08c21d770a80d4bf0fea28834ae45f0 (patch) | |
| tree | dba7dc75bf459d24716351c6158e84730f6686ff /compiler | |
| parent | 31c20210b9683f983953e1a4e45db94146b3c7cb (diff) | |
| download | rust-8476c517c08c21d770a80d4bf0fea28834ae45f0.tar.gz rust-8476c517c08c21d770a80d4bf0fea28834ae45f0.zip | |
Don't recommend `if let` if `let else` works
Diffstat (limited to 'compiler')
| -rw-r--r-- | compiler/rustc_error_messages/locales/en-US/mir_build.ftl | 2 | ||||
| -rw-r--r-- | compiler/rustc_mir_build/src/errors.rs | 42 | ||||
| -rw-r--r-- | compiler/rustc_mir_build/src/thir/pattern/check_match.rs | 23 |
3 files changed, 18 insertions, 49 deletions
diff --git a/compiler/rustc_error_messages/locales/en-US/mir_build.ftl b/compiler/rustc_error_messages/locales/en-US/mir_build.ftl index b277942cdcc..976614ecd9e 100644 --- a/compiler/rustc_error_messages/locales/en-US/mir_build.ftl +++ b/compiler/rustc_error_messages/locales/en-US/mir_build.ftl @@ -358,7 +358,7 @@ mir_build_suggest_if_let = you might want to use `if let` to ignore the {$count *[other] variants that aren't } matched -mir_build_suggest_let_else = alternatively, you might want to use `let else` to handle the {$count -> +mir_build_suggest_let_else = you might want to use `let else` to handle the {$count -> [one] variant that isn't *[other] variants that aren't } matched diff --git a/compiler/rustc_mir_build/src/errors.rs b/compiler/rustc_mir_build/src/errors.rs index a3c58c31654..1b2fbae2cd5 100644 --- a/compiler/rustc_mir_build/src/errors.rs +++ b/compiler/rustc_mir_build/src/errors.rs @@ -747,9 +747,7 @@ pub(crate) struct PatternNotCovered<'s, 'tcx> { pub _p: (), pub pattern_ty: Ty<'tcx>, #[subdiagnostic] - pub if_let_suggestion: Option<SuggestIfLet>, - #[subdiagnostic] - pub let_else_suggestion: Option<SuggestLetElse>, + pub let_suggestion: Option<SuggestLet>, #[subdiagnostic] pub res_defined_here: Option<ResDefinedHere>, } @@ -809,43 +807,23 @@ pub struct InterpretedAsConst { } #[derive(Subdiagnostic)] -pub enum SuggestIfLet { +pub enum SuggestLet { #[multipart_suggestion(mir_build_suggest_if_let, applicability = "has-placeholders")] - None { + If { #[suggestion_part(code = "if ")] start_span: Span, #[suggestion_part(code = " {{ todo!() }}")] semi_span: Span, count: usize, }, - #[multipart_suggestion(mir_build_suggest_if_let, applicability = "has-placeholders")] - One { - #[suggestion_part(code = "let {binding} = if ")] - start_span: Span, - #[suggestion_part(code = " {{ {binding} }} else {{ todo!() }}")] - end_span: Span, - binding: Ident, - count: usize, - }, - #[multipart_suggestion(mir_build_suggest_if_let, applicability = "has-placeholders")] - More { - #[suggestion_part(code = "let ({bindings}) = if ")] - start_span: Span, - #[suggestion_part(code = " {{ ({bindings}) }} else {{ todo!() }}")] + #[suggestion( + mir_build_suggest_let_else, + code = " else {{ todo!() }}", + applicability = "has-placeholders" + )] + Else { + #[primary_span] end_span: Span, - bindings: String, count: usize, }, } - -#[derive(Subdiagnostic)] -#[suggestion( - mir_build_suggest_let_else, - code = " else {{ todo!() }}", - applicability = "has-placeholders" -)] -pub struct SuggestLetElse { - #[primary_span] - pub end_span: Span, - pub count: usize, -} diff --git a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs index 422c2ff3ede..69481592895 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs @@ -394,7 +394,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> { return; } - let (inform, interpreted_as_const, res_defined_here, if_let_suggestion, let_else_suggestion) = + let (inform, interpreted_as_const, res_defined_here,let_suggestion) = if let hir::PatKind::Path(hir::QPath::Resolved( None, hir::Path { @@ -417,7 +417,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> { res, } }, - None, None, + None, ) } else if let Some(span) = sp && self.tcx.sess.source_map().is_span_accessible(span) { let mut bindings = vec![]; @@ -430,19 +430,11 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> { let start_span = span.shrink_to_lo(); let end_span = semi_span.shrink_to_lo(); let count = witnesses.len(); - let if_let = match *bindings { - [] => SuggestIfLet::None{start_span, semi_span, count}, - [binding] => SuggestIfLet::One{start_span, end_span, count, binding }, - _ => SuggestIfLet::More{start_span, end_span, count, bindings: bindings - .iter() - .map(|ident| ident.to_string()) - .collect::<Vec<_>>() - .join(", ")}, - }; - let let_else = if bindings.is_empty() {None} else{Some( SuggestLetElse{end_span, count })}; - (sp.map(|_|Inform), None, None, Some(if_let), let_else) + + let let_suggestion = if bindings.is_empty() {SuggestLet::If{start_span, semi_span, count}} else{ SuggestLet::Else{end_span, count }}; + (sp.map(|_|Inform), None, None, Some(let_suggestion)) } else{ - (sp.map(|_|Inform), None, None, None, None) + (sp.map(|_|Inform), None, None, None) }; let adt_defined_here = try { @@ -465,8 +457,7 @@ impl<'p, 'tcx> MatchVisitor<'_, 'p, 'tcx> { interpreted_as_const, _p: (), pattern_ty, - if_let_suggestion, - let_else_suggestion, + let_suggestion, res_defined_here, adt_defined_here, }); |
