From 5730fd49fa0379141ca78c59f5514c206ed8e53f Mon Sep 17 00:00:00 2001 From: Alex Macleod Date: Fri, 20 May 2022 12:39:15 +0000 Subject: [PATCH] Lint indirect usages in `disallowed_methods` --- clippy_lints/src/disallowed_methods.rs | 14 ++++++++++--- .../conf_disallowed_methods.rs | 6 ++++++ .../conf_disallowed_methods.stderr | 20 ++++++++++++++++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/clippy_lints/src/disallowed_methods.rs b/clippy_lints/src/disallowed_methods.rs index 4c12202c8..53973ab79 100644 --- a/clippy_lints/src/disallowed_methods.rs +++ b/clippy_lints/src/disallowed_methods.rs @@ -1,7 +1,7 @@ use clippy_utils::diagnostics::span_lint_and_then; -use clippy_utils::fn_def_id; +use clippy_utils::{fn_def_id, get_parent_expr, path_def_id}; -use rustc_hir::{def::Res, def_id::DefIdMap, Expr}; +use rustc_hir::{def::Res, def_id::DefIdMap, Expr, ExprKind}; use rustc_lint::{LateContext, LateLintPass}; use rustc_session::{declare_tool_lint, impl_lint_pass}; @@ -84,7 +84,15 @@ impl<'tcx> LateLintPass<'tcx> for DisallowedMethods { } fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) { - let def_id = match fn_def_id(cx, expr) { + let uncalled_path = if let Some(parent) = get_parent_expr(cx, expr) + && let ExprKind::Call(receiver, _) = parent.kind + && receiver.hir_id == expr.hir_id + { + None + } else { + path_def_id(cx, expr) + }; + let def_id = match uncalled_path.or_else(|| fn_def_id(cx, expr)) { Some(def_id) => def_id, None => return, }; diff --git a/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs b/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs index 338b3b5b2..3397fa1ec 100644 --- a/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs +++ b/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.rs @@ -14,4 +14,10 @@ fn main() { let _ = 2.0f32.clamp(3.0f32, 4.0f32); let _ = 2.0f64.clamp(3.0f64, 4.0f64); + + let indirect: fn(&str) -> Result = Regex::new; + let re = indirect(".").unwrap(); + + let in_call = Box::new(f32::clamp); + let in_method_call = ["^", "$"].into_iter().map(Regex::new); } diff --git a/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.stderr b/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.stderr index 5533676ae..5cbb56754 100644 --- a/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.stderr +++ b/tests/ui-toml/toml_disallowed_methods/conf_disallowed_methods.stderr @@ -32,5 +32,23 @@ error: use of a disallowed method `f32::clamp` LL | let _ = 2.0f32.clamp(3.0f32, 4.0f32); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 5 previous errors +error: use of a disallowed method `regex::Regex::new` + --> $DIR/conf_disallowed_methods.rs:18:61 + | +LL | let indirect: fn(&str) -> Result = Regex::new; + | ^^^^^^^^^^ + +error: use of a disallowed method `f32::clamp` + --> $DIR/conf_disallowed_methods.rs:21:28 + | +LL | let in_call = Box::new(f32::clamp); + | ^^^^^^^^^^ + +error: use of a disallowed method `regex::Regex::new` + --> $DIR/conf_disallowed_methods.rs:22:53 + | +LL | let in_method_call = ["^", "$"].into_iter().map(Regex::new); + | ^^^^^^^^^^ + +error: aborting due to 8 previous errors