about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-11-24 15:26:04 +0000
committerbors <bors@rust-lang.org>2023-11-24 15:26:04 +0000
commit4fd68eb47bad1c121417ac4450b2f0456150db86 (patch)
tree3070883b9fd1824ad327f04f7be6b1a5e3fdc8a2
parentbeebcdeb6fc778c2d082d545554b08183121b42e (diff)
parentc710db8ea7fb59ef90d854d2e1a5d9d93464b074 (diff)
downloadrust-4fd68eb47bad1c121417ac4450b2f0456150db86.tar.gz
rust-4fd68eb47bad1c121417ac4450b2f0456150db86.zip
Auto merge of #117934 - Young-Flash:dev, r=petrochenkov
feat: make `let_binding_suggestion` more reasonable

This is my first PR for rustc, which trying to fix https://github.com/rust-lang/rust/issues/117894, I am not familiar with some internal api so maybe some modification here isn't the way to go, appreciated for any review suggestion.
-rw-r--r--compiler/rustc_resolve/src/late/diagnostics.rs15
-rw-r--r--tests/ui/suggestions/suggest-let-for-assignment.fixed6
-rw-r--r--tests/ui/suggestions/suggest-let-for-assignment.rs6
-rw-r--r--tests/ui/suggestions/suggest-let-for-assignment.stderr42
4 files changed, 62 insertions, 7 deletions
diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs
index 4587ad14db7..326fd3b2005 100644
--- a/compiler/rustc_resolve/src/late/diagnostics.rs
+++ b/compiler/rustc_resolve/src/late/diagnostics.rs
@@ -2162,13 +2162,22 @@ impl<'a: 'ast, 'ast, 'tcx> LateResolutionVisitor<'a, '_, 'ast, 'tcx> {
     fn let_binding_suggestion(&mut self, err: &mut Diagnostic, ident_span: Span) -> bool {
         if let Some(Expr { kind: ExprKind::Assign(lhs, ..), .. }) =
             self.diagnostic_metadata.in_assignment
-            && let ast::ExprKind::Path(None, _) = lhs.kind
+            && let ast::ExprKind::Path(None, ref path) = lhs.kind
         {
             if !ident_span.from_expansion() {
+                let (span, text) = match path.segments.first() {
+                    Some(seg) if let Some(name) = seg.ident.as_str().strip_prefix("let") => {
+                        // a special case for #117894
+                        let name = name.strip_prefix("_").unwrap_or(name);
+                        (ident_span, format!("let {name}"))
+                    }
+                    _ => (ident_span.shrink_to_lo(), "let ".to_string()),
+                };
+
                 err.span_suggestion_verbose(
-                    ident_span.shrink_to_lo(),
+                    span,
                     "you might have meant to introduce a new binding",
-                    "let ".to_string(),
+                    text,
                     Applicability::MaybeIncorrect,
                 );
                 return true;
diff --git a/tests/ui/suggestions/suggest-let-for-assignment.fixed b/tests/ui/suggestions/suggest-let-for-assignment.fixed
index 3a25e25eede..76dc1dad80a 100644
--- a/tests/ui/suggestions/suggest-let-for-assignment.fixed
+++ b/tests/ui/suggestions/suggest-let-for-assignment.fixed
@@ -7,6 +7,12 @@ fn main() {
     let x = "x"; //~ ERROR cannot find value `x` in this scope
     println!("x: {}", x); //~ ERROR cannot find value `x` in this scope
 
+    let some_variable = 6; //~ cannot find value `let_some_variable` in this scope
+    println!("some_variable: {}", some_variable); //~ ERROR cannot find value `some_variable` in this scope
+
+    let other_variable = 6; //~ cannot find value `letother_variable` in this scope
+    println!("other_variable: {}", other_variable); //~ ERROR cannot find value `other_variable` in this scope
+
     if x == "x" {
         //~^ ERROR cannot find value `x` in this scope
         println!("x is 1");
diff --git a/tests/ui/suggestions/suggest-let-for-assignment.rs b/tests/ui/suggestions/suggest-let-for-assignment.rs
index 67705fe063a..f1edf65a726 100644
--- a/tests/ui/suggestions/suggest-let-for-assignment.rs
+++ b/tests/ui/suggestions/suggest-let-for-assignment.rs
@@ -7,6 +7,12 @@ fn main() {
     x = "x"; //~ ERROR cannot find value `x` in this scope
     println!("x: {}", x); //~ ERROR cannot find value `x` in this scope
 
+    let_some_variable = 6; //~ cannot find value `let_some_variable` in this scope
+    println!("some_variable: {}", some_variable); //~ ERROR cannot find value `some_variable` in this scope
+
+    letother_variable = 6; //~ cannot find value `letother_variable` in this scope
+    println!("other_variable: {}", other_variable); //~ ERROR cannot find value `other_variable` in this scope
+
     if x == "x" {
         //~^ ERROR cannot find value `x` in this scope
         println!("x is 1");
diff --git a/tests/ui/suggestions/suggest-let-for-assignment.stderr b/tests/ui/suggestions/suggest-let-for-assignment.stderr
index 3f6a3da4be2..8d97dbeb14a 100644
--- a/tests/ui/suggestions/suggest-let-for-assignment.stderr
+++ b/tests/ui/suggestions/suggest-let-for-assignment.stderr
@@ -32,14 +32,48 @@ error[E0425]: cannot find value `x` in this scope
 LL |     println!("x: {}", x);
    |                       ^ not found in this scope
 
+error[E0425]: cannot find value `let_some_variable` in this scope
+  --> $DIR/suggest-let-for-assignment.rs:10:5
+   |
+LL |     let_some_variable = 6;
+   |     ^^^^^^^^^^^^^^^^^
+   |
+help: you might have meant to introduce a new binding
+   |
+LL |     let some_variable = 6;
+   |     ~~~~~~~~~~~~~~~~~
+
+error[E0425]: cannot find value `some_variable` in this scope
+  --> $DIR/suggest-let-for-assignment.rs:11:35
+   |
+LL |     println!("some_variable: {}", some_variable);
+   |                                   ^^^^^^^^^^^^^ not found in this scope
+
+error[E0425]: cannot find value `letother_variable` in this scope
+  --> $DIR/suggest-let-for-assignment.rs:13:5
+   |
+LL |     letother_variable = 6;
+   |     ^^^^^^^^^^^^^^^^^
+   |
+help: you might have meant to introduce a new binding
+   |
+LL |     let other_variable = 6;
+   |     ~~~~~~~~~~~~~~~~~~
+
+error[E0425]: cannot find value `other_variable` in this scope
+  --> $DIR/suggest-let-for-assignment.rs:14:36
+   |
+LL |     println!("other_variable: {}", other_variable);
+   |                                    ^^^^^^^^^^^^^^ not found in this scope
+
 error[E0425]: cannot find value `x` in this scope
-  --> $DIR/suggest-let-for-assignment.rs:10:8
+  --> $DIR/suggest-let-for-assignment.rs:16:8
    |
 LL |     if x == "x" {
    |        ^ not found in this scope
 
 error[E0425]: cannot find value `y` in this scope
-  --> $DIR/suggest-let-for-assignment.rs:15:5
+  --> $DIR/suggest-let-for-assignment.rs:21:5
    |
 LL |     y = 1 + 2;
    |     ^
@@ -50,11 +84,11 @@ LL |     let y = 1 + 2;
    |     +++
 
 error[E0425]: cannot find value `y` in this scope
-  --> $DIR/suggest-let-for-assignment.rs:16:23
+  --> $DIR/suggest-let-for-assignment.rs:22:23
    |
 LL |     println!("y: {}", y);
    |                       ^ not found in this scope
 
-error: aborting due to 7 previous errors
+error: aborting due to 11 previous errors
 
 For more information about this error, try `rustc --explain E0425`.