about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authormejrs <>2022-12-23 22:23:37 +0100
committerDavid Tolnay <dtolnay@gmail.com>2023-01-11 14:40:07 -0800
commit8476c517c08c21d770a80d4bf0fea28834ae45f0 (patch)
treedba7dc75bf459d24716351c6158e84730f6686ff /compiler
parent31c20210b9683f983953e1a4e45db94146b3c7cb (diff)
downloadrust-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.ftl2
-rw-r--r--compiler/rustc_mir_build/src/errors.rs42
-rw-r--r--compiler/rustc_mir_build/src/thir/pattern/check_match.rs23
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,
         });