Skip to content

Commit 0f1544f

Browse files
committed
Reduce unnecessary work in cmp_owned
1 parent c3f3c58 commit 0f1544f

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

clippy_lints/src/misc.rs

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ use rustc_span::symbol::sym;
2020
use clippy_utils::consts::{constant, Constant};
2121
use clippy_utils::sugg::Sugg;
2222
use clippy_utils::{
23-
get_item_name, get_parent_expr, in_constant, is_diag_trait_item, is_integer_const, iter_input_pats,
24-
last_path_segment, match_any_def_paths, path_def_id, paths, unsext, SpanlessEq,
23+
get_item_name, get_parent_expr, in_constant, is_integer_const, iter_input_pats, last_path_segment,
24+
match_any_def_paths, path_def_id, paths, unsext, SpanlessEq,
2525
};
2626

2727
declare_clippy_lint! {
@@ -569,33 +569,30 @@ fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left:
569569
})
570570
}
571571

572-
let (arg_ty, snip) = match expr.kind {
573-
ExprKind::MethodCall(.., args, _) if args.len() == 1 => {
574-
if_chain!(
575-
if let Some(expr_def_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id);
576-
if is_diag_trait_item(cx, expr_def_id, sym::ToString)
577-
|| is_diag_trait_item(cx, expr_def_id, sym::ToOwned);
578-
then {
579-
(cx.typeck_results().expr_ty(&args[0]), snippet(cx, args[0].span, ".."))
580-
} else {
581-
return;
582-
}
583-
)
572+
let typeck = cx.typeck_results();
573+
let (arg, arg_span) = match expr.kind {
574+
ExprKind::MethodCall(.., [arg], _)
575+
if typeck
576+
.type_dependent_def_id(expr.hir_id)
577+
.and_then(|id| cx.tcx.trait_of_item(id))
578+
.map_or(false, |id| {
579+
matches!(cx.tcx.get_diagnostic_name(id), Some(sym::ToString | sym::ToOwned))
580+
}) =>
581+
{
582+
(arg, arg.span)
584583
},
585-
ExprKind::Call(path, [arg]) => {
584+
ExprKind::Call(path, [arg])
586585
if path_def_id(cx, path)
587586
.and_then(|id| match_any_def_paths(cx, id, &[&paths::FROM_STR_METHOD, &paths::FROM_FROM]))
588-
.is_some()
589-
{
590-
(cx.typeck_results().expr_ty(arg), snippet(cx, arg.span, ".."))
591-
} else {
592-
return;
593-
}
587+
.is_some() =>
588+
{
589+
(arg, arg.span)
594590
},
595591
_ => return,
596592
};
597593

598-
let other_ty = cx.typeck_results().expr_ty(other);
594+
let arg_ty = typeck.expr_ty(arg);
595+
let other_ty = typeck.expr_ty(other);
599596

600597
let without_deref = symmetric_partial_eq(cx, arg_ty, other_ty).unwrap_or_default();
601598
let with_deref = arg_ty
@@ -627,13 +624,14 @@ fn check_to_owned(cx: &LateContext<'_>, expr: &Expr<'_>, other: &Expr<'_>, left:
627624
return;
628625
}
629626

627+
let arg_snip = snippet(cx, arg_span, "..");
630628
let expr_snip;
631629
let eq_impl;
632630
if with_deref.is_implemented() {
633-
expr_snip = format!("*{}", snip);
631+
expr_snip = format!("*{}", arg_snip);
634632
eq_impl = with_deref;
635633
} else {
636-
expr_snip = snip.to_string();
634+
expr_snip = arg_snip.to_string();
637635
eq_impl = without_deref;
638636
};
639637

0 commit comments

Comments
 (0)