Skip to content

Commit

Permalink
Provide structured suggestion for removal of &mut
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Aug 29, 2021
1 parent e4368de commit a6af6d6
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 14 deletions.
Expand Up @@ -12,7 +12,7 @@ use rustc_middle::{
};
use rustc_span::source_map::DesugaringKind;
use rustc_span::symbol::{kw, Symbol};
use rustc_span::Span;
use rustc_span::{BytePos, Span};

use crate::borrow_check::diagnostics::BorrowedContentSource;
use crate::borrow_check::MirBorrowckCtxt;
Expand Down Expand Up @@ -278,7 +278,25 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
);
}
}
err.span_help(source_info.span, "try removing `&mut` here");
if let Ok(snippet) =
self.infcx.tcx.sess.source_map().span_to_snippet(source_info.span)
{
if snippet.starts_with("&mut ") {
// We don't have access to the HIR to get accurate spans, but we can
// give a best effort structured suggestion.
err.span_suggestion_verbose(
source_info.span.with_hi(source_info.span.lo() + BytePos(5)),
"try removing `&mut` here",
String::new(),
Applicability::MachineApplicable,
);
} else {
// This can occur with things like `(&mut self).foo()`.
err.span_help(source_info.span, "try removing `&mut` here");
}
} else {
err.span_help(source_info.span, "try removing `&mut` here");
}
} else if decl.mutability == Mutability::Not
&& !matches!(
decl.local_info,
Expand Down
15 changes: 6 additions & 9 deletions src/test/ui/borrowck/mut-borrow-of-mut-ref.stderr
Expand Up @@ -10,10 +10,9 @@ note: the binding is already a mutable borrow
LL | pub fn f(b: &mut i32) {
| ^^^^^^^^
help: try removing `&mut` here
--> $DIR/mut-borrow-of-mut-ref.rs:7:7
|
LL | h(&mut b);
| ^^^^^^
LL | h(b);
| --

error[E0596]: cannot borrow `b` as mutable, as it is not declared as mutable
--> $DIR/mut-borrow-of-mut-ref.rs:11:12
Expand All @@ -27,10 +26,9 @@ note: the binding is already a mutable borrow
LL | pub fn f(b: &mut i32) {
| ^^^^^^^^
help: try removing `&mut` here
--> $DIR/mut-borrow-of-mut-ref.rs:11:12
|
LL | g(&mut &mut b);
| ^^^^^^
LL | g(&mut b);
| --

error[E0596]: cannot borrow `b` as mutable, as it is not declared as mutable
--> $DIR/mut-borrow-of-mut-ref.rs:18:12
Expand All @@ -44,10 +42,9 @@ note: the binding is already a mutable borrow
LL | pub fn g(b: &mut i32) {
| ^^^^^^^^
help: try removing `&mut` here
--> $DIR/mut-borrow-of-mut-ref.rs:18:12
|
LL | h(&mut &mut b);
| ^^^^^^
LL | h(&mut b);
| --

error[E0596]: cannot borrow `f` as mutable, as it is not declared as mutable
--> $DIR/mut-borrow-of-mut-ref.rs:35:5
Expand Down
5 changes: 2 additions & 3 deletions src/test/ui/did_you_mean/issue-34126.stderr
Expand Up @@ -10,10 +10,9 @@ note: the binding is already a mutable borrow
LL | fn start(&mut self) {
| ^^^^^^^^^
help: try removing `&mut` here
--> $DIR/issue-34126.rs:6:18
|
LL | self.run(&mut self);
| ^^^^^^^^^
LL | self.run(self);
| --

error[E0502]: cannot borrow `self` as mutable because it is also borrowed as immutable
--> $DIR/issue-34126.rs:6:18
Expand Down

0 comments on commit a6af6d6

Please sign in to comment.