Skip to content

Commit 9f02cbc

Browse files
clippy_utils: make peel_*_ty_refs class of functions a bit more consistent (#15515)
I was looking for the function that peels refs from a type while also returning the number of refs peeled, and it turns out there were actually two of them?? I removed the by far less popular one, and made some other clean-up along the way changelog: none
2 parents 601ddcc + 31c7e62 commit 9f02cbc

18 files changed

+74
-105
lines changed

clippy_lints/src/dereference.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_hir_and_then};
22
use clippy_utils::source::{snippet_with_applicability, snippet_with_context};
33
use clippy_utils::sugg::has_enclosing_paren;
4-
use clippy_utils::ty::{adjust_derefs_manually_drop, implements_trait, is_manually_drop};
4+
use clippy_utils::ty::{adjust_derefs_manually_drop, implements_trait, is_manually_drop, peel_and_count_ty_refs};
55
use clippy_utils::{
66
DefinedTy, ExprUseNode, expr_use_ctxt, get_parent_expr, is_block_like, is_lint_allowed, path_to_local,
7-
peel_middle_ty_refs,
87
};
98
use rustc_ast::util::parser::ExprPrecedence;
109
use rustc_data_structures::fx::FxIndexMap;
@@ -942,7 +941,7 @@ fn report<'tcx>(
942941
let (expr_str, expr_is_macro_call) =
943942
snippet_with_context(cx, expr.span, data.first_expr.span.ctxt(), "..", &mut app);
944943
let ty = typeck.expr_ty(expr);
945-
let (_, ref_count) = peel_middle_ty_refs(ty);
944+
let (_, ref_count, _) = peel_and_count_ty_refs(ty);
946945
let deref_str = if ty_changed_count >= ref_count && ref_count != 0 {
947946
// a deref call changing &T -> &U requires two deref operators the first time
948947
// this occurs. One to remove the reference, a second to call the deref impl.
@@ -1045,7 +1044,7 @@ fn report<'tcx>(
10451044
if let ty::Ref(_, dst, _) = data.adjusted_ty.kind()
10461045
&& dst.is_slice()
10471046
{
1048-
let (src, n_src_refs) = peel_middle_ty_refs(ty);
1047+
let (src, n_src_refs, _) = peel_and_count_ty_refs(ty);
10491048
if n_src_refs >= 2 && src.is_array() {
10501049
return;
10511050
}

clippy_lints/src/functions/not_unsafe_ptr_arg_deref.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_middle::ty;
44
use rustc_span::def_id::LocalDefId;
55

66
use clippy_utils::diagnostics::span_lint;
7-
use clippy_utils::ty::type_is_unsafe_function;
7+
use clippy_utils::ty::is_unsafe_fn;
88
use clippy_utils::visitors::for_each_expr;
99
use clippy_utils::{iter_input_pats, path_to_local};
1010

@@ -51,7 +51,7 @@ fn check_raw_ptr<'tcx>(
5151
let typeck = cx.tcx.typeck_body(body.id());
5252
let _: Option<!> = for_each_expr(cx, body.value, |e| {
5353
match e.kind {
54-
hir::ExprKind::Call(f, args) if type_is_unsafe_function(cx, typeck.expr_ty(f)) => {
54+
hir::ExprKind::Call(f, args) if is_unsafe_fn(cx, typeck.expr_ty(f)) => {
5555
for arg in args {
5656
check_arg(cx, &raw_ptrs, arg);
5757
}

clippy_lints/src/manual_abs_diff.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use clippy_utils::higher::If;
44
use clippy_utils::msrvs::{self, Msrv};
55
use clippy_utils::source::HasSession as _;
66
use clippy_utils::sugg::Sugg;
7-
use clippy_utils::ty::is_type_diagnostic_item;
8-
use clippy_utils::{eq_expr_value, peel_blocks, peel_middle_ty_refs, span_contains_comment};
7+
use clippy_utils::ty::{is_type_diagnostic_item, peel_and_count_ty_refs};
8+
use clippy_utils::{eq_expr_value, peel_blocks, span_contains_comment};
99
use rustc_errors::Applicability;
1010
use rustc_hir::{BinOpKind, Expr, ExprKind};
1111
use rustc_lint::{LateContext, LateLintPass};
@@ -107,7 +107,7 @@ impl ManualAbsDiff {
107107
|ty| is_type_diagnostic_item(cx, ty, sym::Duration) && self.msrv.meets(cx, msrvs::DURATION_ABS_DIFF);
108108

109109
let a_ty = cx.typeck_results().expr_ty(a).peel_refs();
110-
let (b_ty, b_n_refs) = peel_middle_ty_refs(cx.typeck_results().expr_ty(b));
110+
let (b_ty, b_n_refs, _) = peel_and_count_ty_refs(cx.typeck_results().expr_ty(b));
111111

112112
(a_ty == b_ty && (is_int(a_ty) || is_duration(a_ty))).then_some((a_ty, b_n_refs))
113113
}

clippy_lints/src/manual_slice_size_calculation.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use clippy_config::Conf;
22
use clippy_utils::diagnostics::span_lint_and_sugg;
33
use clippy_utils::msrvs::{self, Msrv};
44
use clippy_utils::source::snippet_with_context;
5+
use clippy_utils::ty::peel_and_count_ty_refs;
56
use clippy_utils::{expr_or_init, is_in_const_context, std_or_core};
67
use rustc_errors::Applicability;
78
use rustc_hir::{BinOpKind, Expr, ExprKind};
@@ -102,7 +103,7 @@ fn simplify_half<'tcx>(
102103
&& let ExprKind::MethodCall(method_path, receiver, [], _) = expr1.kind
103104
&& method_path.ident.name == sym::len
104105
&& let receiver_ty = cx.typeck_results().expr_ty(receiver)
105-
&& let (receiver_ty, refs_count) = clippy_utils::ty::walk_ptrs_ty_depth(receiver_ty)
106+
&& let (receiver_ty, refs_count, _) = peel_and_count_ty_refs(receiver_ty)
106107
&& let ty::Slice(ty1) = receiver_ty.kind()
107108
// expr2 is `size_of::<T2>()`?
108109
&& let ExprKind::Call(func, []) = expr2.kind

clippy_lints/src/matches/manual_ok_err.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::{indent_of, reindent_multiline};
33
use clippy_utils::sugg::Sugg;
4-
use clippy_utils::ty::{option_arg_ty, peel_mid_ty_refs_is_mutable};
4+
use clippy_utils::ty::{option_arg_ty, peel_and_count_ty_refs};
55
use clippy_utils::{get_parent_expr, is_res_lang_ctor, path_res, peel_blocks, span_contains_comment};
66
use rustc_ast::{BindingMode, Mutability};
77
use rustc_errors::Applicability;
@@ -135,15 +135,11 @@ fn apply_lint(cx: &LateContext<'_>, expr: &Expr<'_>, scrutinee: &Expr<'_>, is_ok
135135
let scrut = Sugg::hir_with_applicability(cx, scrutinee, "..", &mut app).maybe_paren();
136136

137137
let scrutinee_ty = cx.typeck_results().expr_ty(scrutinee);
138-
let (_, n_ref, mutability) = peel_mid_ty_refs_is_mutable(scrutinee_ty);
139-
let prefix = if n_ref > 0 {
140-
if mutability == Mutability::Mut {
141-
".as_mut()"
142-
} else {
143-
".as_ref()"
144-
}
145-
} else {
146-
""
138+
let (_, _, mutability) = peel_and_count_ty_refs(scrutinee_ty);
139+
let prefix = match mutability {
140+
Some(Mutability::Mut) => ".as_mut()",
141+
Some(Mutability::Not) => ".as_ref()",
142+
None => "",
147143
};
148144

149145
let sugg = format!("{scrut}{prefix}.{method}()");

clippy_lints/src/matches/manual_utils.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::map_unit_fn::OPTION_MAP_UNIT_FN;
22
use crate::matches::MATCH_AS_REF;
33
use clippy_utils::source::{snippet_with_applicability, snippet_with_context};
44
use clippy_utils::sugg::Sugg;
5-
use clippy_utils::ty::{is_copy, is_type_diagnostic_item, peel_mid_ty_refs_is_mutable, type_is_unsafe_function};
5+
use clippy_utils::ty::{is_copy, is_type_diagnostic_item, is_unsafe_fn, peel_and_count_ty_refs};
66
use clippy_utils::{
77
CaptureKind, can_move_expr_to_closure, expr_requires_coercion, is_else_clause, is_lint_allowed, is_res_lang_ctor,
88
path_res, path_to_local_id, peel_blocks, peel_hir_expr_refs, peel_hir_expr_while,
@@ -30,8 +30,9 @@ pub(super) fn check_with<'tcx, F>(
3030
where
3131
F: Fn(&LateContext<'tcx>, &'tcx Pat<'_>, &'tcx Expr<'_>, SyntaxContext) -> Option<SomeExpr<'tcx>>,
3232
{
33-
let (scrutinee_ty, ty_ref_count, ty_mutability) =
34-
peel_mid_ty_refs_is_mutable(cx.typeck_results().expr_ty(scrutinee));
33+
let (scrutinee_ty, ty_ref_count, ty_mutability) = peel_and_count_ty_refs(cx.typeck_results().expr_ty(scrutinee));
34+
let ty_mutability = ty_mutability.unwrap_or(Mutability::Mut);
35+
3536
if !(is_type_diagnostic_item(cx, scrutinee_ty, sym::Option)
3637
&& is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::Option))
3738
{
@@ -191,7 +192,7 @@ fn can_pass_as_func<'tcx>(cx: &LateContext<'tcx>, binding: HirId, expr: &'tcx Ex
191192
ExprKind::Call(func, [arg])
192193
if path_to_local_id(arg, binding)
193194
&& cx.typeck_results().expr_adjustments(arg).is_empty()
194-
&& !type_is_unsafe_function(cx, cx.typeck_results().expr_ty(func).peel_refs()) =>
195+
&& !is_unsafe_fn(cx, cx.typeck_results().expr_ty(func).peel_refs()) =>
195196
{
196197
Some(func)
197198
},

clippy_lints/src/matches/single_match.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::source::{
33
SpanRangeExt, expr_block, snippet, snippet_block_with_context, snippet_with_applicability, snippet_with_context,
44
};
5-
use clippy_utils::ty::implements_trait;
6-
use clippy_utils::{
7-
is_lint_allowed, is_unit_expr, peel_blocks, peel_hir_pat_refs, peel_middle_ty_refs, peel_n_hir_expr_refs,
8-
};
5+
use clippy_utils::ty::{implements_trait, peel_and_count_ty_refs};
6+
use clippy_utils::{is_lint_allowed, is_unit_expr, peel_blocks, peel_hir_pat_refs, peel_n_hir_expr_refs};
97
use core::ops::ControlFlow;
108
use rustc_arena::DroplessArena;
119
use rustc_errors::{Applicability, Diag};
@@ -133,7 +131,7 @@ fn report_single_pattern(
133131

134132
let (pat, pat_ref_count) = peel_hir_pat_refs(arm.pat);
135133
let (msg, sugg) = if let PatKind::Expr(_) = pat.kind
136-
&& let (ty, ty_ref_count) = peel_middle_ty_refs(cx.typeck_results().expr_ty(ex))
134+
&& let (ty, ty_ref_count, _) = peel_and_count_ty_refs(cx.typeck_results().expr_ty(ex))
137135
&& let Some(spe_trait_id) = cx.tcx.lang_items().structural_peq_trait()
138136
&& let Some(pe_trait_id) = cx.tcx.lang_items().eq_trait()
139137
&& (ty.is_integral()

clippy_lints/src/methods/implicit_clone.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::snippet_with_context;
3-
use clippy_utils::ty::implements_trait;
4-
use clippy_utils::{is_diag_item_method, is_diag_trait_item, peel_middle_ty_refs, sym};
3+
use clippy_utils::ty::{implements_trait, peel_and_count_ty_refs};
4+
use clippy_utils::{is_diag_item_method, is_diag_trait_item, sym};
55
use rustc_errors::Applicability;
66
use rustc_hir as hir;
77
use rustc_lint::LateContext;
@@ -14,7 +14,7 @@ pub fn check(cx: &LateContext<'_>, method_name: Symbol, expr: &hir::Expr<'_>, re
1414
&& is_clone_like(cx, method_name, method_def_id)
1515
&& let return_type = cx.typeck_results().expr_ty(expr)
1616
&& let input_type = cx.typeck_results().expr_ty(recv)
17-
&& let (input_type, ref_count) = peel_middle_ty_refs(input_type)
17+
&& let (input_type, ref_count, _) = peel_and_count_ty_refs(input_type)
1818
&& !(ref_count > 0 && is_diag_trait_item(cx, method_def_id, sym::ToOwned))
1919
&& let Some(ty_name) = input_type.ty_adt_def().map(|adt_def| cx.tcx.item_name(adt_def.did()))
2020
&& return_type == input_type

clippy_lints/src/methods/inefficient_to_string.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::source::snippet_with_applicability;
3-
use clippy_utils::ty::{is_type_lang_item, walk_ptrs_ty_depth};
3+
use clippy_utils::ty::{is_type_lang_item, peel_and_count_ty_refs};
44
use rustc_errors::Applicability;
55
use rustc_hir as hir;
66
use rustc_lint::LateContext;
@@ -24,7 +24,7 @@ pub fn check(
2424
&& let Some(args) = cx.typeck_results().node_args_opt(expr.hir_id)
2525
&& let arg_ty = cx.typeck_results().expr_ty_adjusted(receiver)
2626
&& let self_ty = args.type_at(0)
27-
&& let (deref_self_ty, deref_count) = walk_ptrs_ty_depth(self_ty)
27+
&& let (deref_self_ty, deref_count, _) = peel_and_count_ty_refs(self_ty)
2828
&& deref_count >= 1
2929
&& specializes_tostring(cx, deref_self_ty)
3030
{

clippy_lints/src/methods/mut_mutex_lock.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::expr_custom_deref_adjustment;
3-
use clippy_utils::ty::{is_type_diagnostic_item, peel_mid_ty_refs_is_mutable};
3+
use clippy_utils::ty::{is_type_diagnostic_item, peel_and_count_ty_refs};
44
use rustc_errors::Applicability;
55
use rustc_hir::{Expr, Mutability};
66
use rustc_lint::LateContext;
@@ -10,8 +10,7 @@ use super::MUT_MUTEX_LOCK;
1010

1111
pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, ex: &'tcx Expr<'tcx>, recv: &'tcx Expr<'tcx>, name_span: Span) {
1212
if matches!(expr_custom_deref_adjustment(cx, recv), None | Some(Mutability::Mut))
13-
&& let (_, ref_depth, Mutability::Mut) = peel_mid_ty_refs_is_mutable(cx.typeck_results().expr_ty(recv))
14-
&& ref_depth >= 1
13+
&& let (_, _, Some(Mutability::Mut)) = peel_and_count_ty_refs(cx.typeck_results().expr_ty(recv))
1514
&& let Some(method_id) = cx.typeck_results().type_dependent_def_id(ex.hir_id)
1615
&& let Some(impl_id) = cx.tcx.impl_of_assoc(method_id)
1716
&& is_type_diagnostic_item(cx, cx.tcx.type_of(impl_id).instantiate_identity(), sym::Mutex)

0 commit comments

Comments
 (0)