Remove logic duplication

This commit is contained in:
Esteban Küber 2022-11-03 12:26:59 -07:00
parent 42d7174bbc
commit c0e481731b
16 changed files with 37 additions and 52 deletions

View File

@ -380,61 +380,46 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
let typeck = self.infcx.tcx.typeck(self.mir_def_id()); let typeck = self.infcx.tcx.typeck(self.mir_def_id());
let hir_id = hir.get_parent_node(expr.hir_id); let hir_id = hir.get_parent_node(expr.hir_id);
if let Some(parent) = hir.find(hir_id) { if let Some(parent) = hir.find(hir_id) {
if let hir::Node::Expr(parent_expr) = parent let (def_id, args, offset) = if let hir::Node::Expr(parent_expr) = parent
&& let hir::ExprKind::MethodCall(_, _, args, _) = parent_expr.kind && let hir::ExprKind::MethodCall(_, _, args, _) = parent_expr.kind
&& let Some(def_id) = typeck.type_dependent_def_id(parent_expr.hir_id) && let Some(def_id) = typeck.type_dependent_def_id(parent_expr.hir_id)
&& let Some(def_id) = def_id.as_local()
&& let Some(node) = hir.find(hir.local_def_id_to_hir_id(def_id))
&& let Some(fn_sig) = node.fn_sig()
&& let Some(ident) = node.ident()
&& let Some(pos) = args.iter()
.position(|arg| arg.hir_id == expr.hir_id)
&& let Some(arg) = fn_sig.decl.inputs.get(pos + 1)
{ {
let mut span: MultiSpan = arg.span.into(); (def_id.as_local(), args, 1)
span.push_span_label( } else if let hir::Node::Expr(parent_expr) = parent
arg.span,
"this type parameter takes ownership of the value".to_string(),
);
span.push_span_label(
ident.span,
"in this method".to_string(),
);
err.span_note(
span,
format!(
"consider changing this parameter type in `{}` to borrow instead \
if ownering the value isn't necessary",
ident,
),
);
}
if let hir::Node::Expr(parent_expr) = parent
&& let hir::ExprKind::Call(call, args) = parent_expr.kind && let hir::ExprKind::Call(call, args) = parent_expr.kind
&& let ty::FnDef(def_id, _) = typeck.node_type(call.hir_id).kind() && let ty::FnDef(def_id, _) = typeck.node_type(call.hir_id).kind()
&& let Some(def_id) = def_id.as_local() {
(def_id.as_local(), args, 0)
} else {
(None, &[][..], 0)
};
if let Some(def_id) = def_id
&& let Some(node) = hir.find(hir.local_def_id_to_hir_id(def_id)) && let Some(node) = hir.find(hir.local_def_id_to_hir_id(def_id))
&& let Some(fn_sig) = node.fn_sig() && let Some(fn_sig) = node.fn_sig()
&& let Some(ident) = node.ident() && let Some(ident) = node.ident()
&& let Some(pos) = args.iter() && let Some(pos) = args.iter()
.position(|arg| arg.hir_id == expr.hir_id) .position(|arg| arg.hir_id == expr.hir_id)
&& let Some(arg) = fn_sig.decl.inputs.get(pos) && let Some(arg) = fn_sig.decl.inputs.get(pos + offset)
{ {
let mut span: MultiSpan = arg.span.into(); let mut span: MultiSpan = arg.span.into();
span.push_span_label( span.push_span_label(
arg.span, arg.span,
"this type parameter takes ownership of the value".to_string(), "this type parameter takes ownership of the value".to_string(),
); );
let descr = match node.fn_kind() {
Some(hir::intravisit::FnKind::ItemFn(..)) | None => "function",
Some(hir::intravisit::FnKind::Method(..)) => "method",
Some(hir::intravisit::FnKind::Closure) => "closure",
};
span.push_span_label( span.push_span_label(
ident.span, ident.span,
"in this function".to_string(), format!("in this {descr}"),
); );
err.span_note( err.span_note(
span, span,
format!( format!(
"consider changing this parameter type in `{}` to borrow instead \ "consider changing this parameter type in {descr} `{ident}` to \
if ownering the value isn't necessary", borrow instead if ownering the value isn't necessary",
ident,
), ),
); );
} }

View File

@ -8,7 +8,7 @@ LL | consume(b);
LL | consume(b); LL | consume(b);
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `consume` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `consume` to borrow instead if ownering the value isn't necessary
--> $DIR/borrowck-consume-unsize-vec.rs:3:15 --> $DIR/borrowck-consume-unsize-vec.rs:3:15
| |
LL | fn consume(_: Box<[i32]>) { LL | fn consume(_: Box<[i32]>) {

View File

@ -8,7 +8,7 @@ LL | consume(b);
LL | consume(b); LL | consume(b);
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `consume` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `consume` to borrow instead if ownering the value isn't necessary
--> $DIR/borrowck-consume-upcast-box.rs:5:15 --> $DIR/borrowck-consume-upcast-box.rs:5:15
| |
LL | fn consume(_: Box<dyn Foo>) { LL | fn consume(_: Box<dyn Foo>) {

View File

@ -8,7 +8,7 @@ LL | for _ in 0..3 {
LL | Other::handle(value); LL | Other::handle(value);
| ^^^^^ value moved here, in previous iteration of loop | ^^^^^ value moved here, in previous iteration of loop
| |
note: consider changing this parameter type in `handle` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `handle` to borrow instead if ownering the value isn't necessary
--> $DIR/mut-borrow-in-loop-2.rs:9:22 --> $DIR/mut-borrow-in-loop-2.rs:9:22
| |
LL | fn handle(value: T) -> Self; LL | fn handle(value: T) -> Self;

View File

@ -9,7 +9,7 @@ LL | loop {
LL | take(x); LL | take(x);
| ^ value moved here, in previous iteration of loop | ^ value moved here, in previous iteration of loop
| |
note: consider changing this parameter type in `take` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `take` to borrow instead if ownering the value isn't necessary
--> $DIR/liveness-move-call-arg.rs:1:13 --> $DIR/liveness-move-call-arg.rs:1:13
| |
LL | fn take(_x: Box<isize>) {} LL | fn take(_x: Box<isize>) {}

View File

@ -8,7 +8,7 @@ LL | send(ch, message);
LL | println!("{}", message); LL | println!("{}", message);
| ^^^^^^^ value borrowed here after move | ^^^^^^^ value borrowed here after move
| |
note: consider changing this parameter type in `send` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `send` to borrow instead if ownering the value isn't necessary
--> $DIR/liveness-use-after-send.rs:3:54 --> $DIR/liveness-use-after-send.rs:3:54
| |
LL | fn send<T:Send + std::fmt::Debug>(ch: Chan<T>, data: T) { LL | fn send<T:Send + std::fmt::Debug>(ch: Chan<T>, data: T) {

View File

@ -8,7 +8,7 @@ LL | loop {
LL | takes_fnonce(f); LL | takes_fnonce(f);
| ^ value moved here, in previous iteration of loop | ^ value moved here, in previous iteration of loop
| |
note: consider changing this parameter type in `takes_fnonce` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `takes_fnonce` to borrow instead if ownering the value isn't necessary
--> $DIR/borrow-closures-instead-of-move.rs:34:20 --> $DIR/borrow-closures-instead-of-move.rs:34:20
| |
LL | fn takes_fnonce(_: impl FnOnce()) {} LL | fn takes_fnonce(_: impl FnOnce()) {}
@ -32,7 +32,7 @@ LL | takes_fnonce(m);
LL | takes_fnonce(m); LL | takes_fnonce(m);
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `takes_fnonce` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `takes_fnonce` to borrow instead if ownering the value isn't necessary
--> $DIR/borrow-closures-instead-of-move.rs:34:20 --> $DIR/borrow-closures-instead-of-move.rs:34:20
| |
LL | fn takes_fnonce(_: impl FnOnce()) {} LL | fn takes_fnonce(_: impl FnOnce()) {}
@ -58,7 +58,7 @@ note: closure cannot be moved more than once as it is not `Copy` due to moving t
| |
LL | x += 1; LL | x += 1;
| ^ | ^
note: consider changing this parameter type in `takes_fnonce` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `takes_fnonce` to borrow instead if ownering the value isn't necessary
--> $DIR/borrow-closures-instead-of-move.rs:34:20 --> $DIR/borrow-closures-instead-of-move.rs:34:20
| |
LL | fn takes_fnonce(_: impl FnOnce()) {} LL | fn takes_fnonce(_: impl FnOnce()) {}

View File

@ -9,7 +9,7 @@ LL | (1, 2) if take(x) => (),
LL | (1, 2) if take(x) => (), LL | (1, 2) if take(x) => (),
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `take` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `take` to borrow instead if ownering the value isn't necessary
--> $DIR/move-guard-same-consts.rs:25:15 --> $DIR/move-guard-same-consts.rs:25:15
| |
LL | fn take<T>(_: T) -> bool { false } LL | fn take<T>(_: T) -> bool { false }

View File

@ -9,7 +9,7 @@ LL | (1, _) if take(x) => (),
LL | (_, 2) if take(x) => (), LL | (_, 2) if take(x) => (),
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `take` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `take` to borrow instead if ownering the value isn't necessary
--> $DIR/move-in-guard-1.rs:15:15 --> $DIR/move-in-guard-1.rs:15:15
| |
LL | fn take<T>(_: T) -> bool { false } LL | fn take<T>(_: T) -> bool { false }

View File

@ -7,7 +7,7 @@ LL | let x: Box<_> = Box::new(1);
LL | (_, 2) if take(x) => (), LL | (_, 2) if take(x) => (),
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `take` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `take` to borrow instead if ownering the value isn't necessary
--> $DIR/move-in-guard-2.rs:13:15 --> $DIR/move-in-guard-2.rs:13:15
| |
LL | fn take<T>(_: T) -> bool { false } LL | fn take<T>(_: T) -> bool { false }

View File

@ -108,7 +108,7 @@ LL | _ if guard(x) => 10,
LL | touch(&x); LL | touch(&x);
| ^^ value borrowed here after move | ^^ value borrowed here after move
| |
note: consider changing this parameter type in `guard` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `guard` to borrow instead if ownering the value isn't necessary
--> $DIR/moves-based-on-type-exprs.rs:6:14 --> $DIR/moves-based-on-type-exprs.rs:6:14
| |
LL | fn guard(_s: String) -> bool {panic!()} LL | fn guard(_s: String) -> bool {panic!()}

View File

@ -9,7 +9,7 @@ LL | move_out(x.f1_nocopy);
LL | move_out(x.f2_nocopy); LL | move_out(x.f2_nocopy);
| ^^^^^^^^^^^ value used here after move | ^^^^^^^^^^^ value used here after move
| |
note: consider changing this parameter type in `move_out` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `move_out` to borrow instead if ownering the value isn't necessary
--> $DIR/union-move.rs:10:19 --> $DIR/union-move.rs:10:19
| |
LL | fn move_out<T>(x: T) {} LL | fn move_out<T>(x: T) {}
@ -28,7 +28,7 @@ LL | move_out(x.f2_nocopy);
LL | move_out(x.f3_copy); LL | move_out(x.f3_copy);
| ^^^^^^^^^ value used here after move | ^^^^^^^^^ value used here after move
| |
note: consider changing this parameter type in `move_out` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `move_out` to borrow instead if ownering the value isn't necessary
--> $DIR/union-move.rs:10:19 --> $DIR/union-move.rs:10:19
| |
LL | fn move_out<T>(x: T) {} LL | fn move_out<T>(x: T) {}

View File

@ -9,7 +9,7 @@ LL | move_out(x.f1_nocopy);
LL | move_out(x.f2_nocopy); LL | move_out(x.f2_nocopy);
| ^^^^^^^^^^^ value used here after move | ^^^^^^^^^^^ value used here after move
| |
note: consider changing this parameter type in `move_out` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `move_out` to borrow instead if ownering the value isn't necessary
--> $DIR/union-move.rs:10:19 --> $DIR/union-move.rs:10:19
| |
LL | fn move_out<T>(x: T) {} LL | fn move_out<T>(x: T) {}
@ -28,7 +28,7 @@ LL | move_out(x.f2_nocopy);
LL | move_out(x.f3_copy); LL | move_out(x.f3_copy);
| ^^^^^^^^^ value used here after move | ^^^^^^^^^ value used here after move
| |
note: consider changing this parameter type in `move_out` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `move_out` to borrow instead if ownering the value isn't necessary
--> $DIR/union-move.rs:10:19 --> $DIR/union-move.rs:10:19
| |
LL | fn move_out<T>(x: T) {} LL | fn move_out<T>(x: T) {}

View File

@ -29,7 +29,7 @@ LL | drop_unsized(y);
LL | println!("{}", &y); LL | println!("{}", &y);
| ^^ value borrowed here after move | ^^ value borrowed here after move
| |
note: consider changing this parameter type in `drop_unsized` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `drop_unsized` to borrow instead if ownering the value isn't necessary
--> $DIR/borrow-after-move.rs:14:31 --> $DIR/borrow-after-move.rs:14:31
| |
LL | fn drop_unsized<T: ?Sized>(_: T) {} LL | fn drop_unsized<T: ?Sized>(_: T) {}

View File

@ -17,7 +17,7 @@ LL | drop_unsized(y);
LL | drop_unsized(y); LL | drop_unsized(y);
| ^ value used here after move | ^ value used here after move
| |
note: consider changing this parameter type in `drop_unsized` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in function `drop_unsized` to borrow instead if ownering the value isn't necessary
--> $DIR/double-move.rs:14:31 --> $DIR/double-move.rs:14:31
| |
LL | fn drop_unsized<T: ?Sized>(_: T) {} LL | fn drop_unsized<T: ?Sized>(_: T) {}

View File

@ -10,7 +10,7 @@ LL |
LL | let x = n.to_string(); LL | let x = n.to_string();
| ^^^^^^^^^^^^^ value borrowed here after move | ^^^^^^^^^^^^^ value borrowed here after move
| |
note: consider changing this parameter type in `push` to borrow instead if ownering the value isn't necessary note: consider changing this parameter type in method `push` to borrow instead if ownering the value isn't necessary
--> $DIR/use-after-move-implicity-coerced-object.rs:17:27 --> $DIR/use-after-move-implicity-coerced-object.rs:17:27
| |
LL | fn push(&mut self, n: Box<dyn ToString + 'static>) { LL | fn push(&mut self, n: Box<dyn ToString + 'static>) {