43 lines
1.3 KiB
Rust
43 lines
1.3 KiB
Rust
use clippy_utils::diagnostics::span_lint_and_then;
|
|
use clippy_utils::source::SpanRangeExt;
|
|
use clippy_utils::{is_expr_identity_function, is_trait_method};
|
|
use rustc_errors::Applicability;
|
|
use rustc_hir::Expr;
|
|
use rustc_lint::LateContext;
|
|
use rustc_span::{Span, sym};
|
|
|
|
use super::MAP_ALL_ANY_IDENTITY;
|
|
|
|
#[allow(clippy::too_many_arguments)]
|
|
pub(super) fn check(
|
|
cx: &LateContext<'_>,
|
|
expr: &Expr<'_>,
|
|
recv: &Expr<'_>,
|
|
map_call_span: Span,
|
|
map_arg: &Expr<'_>,
|
|
any_call_span: Span,
|
|
any_arg: &Expr<'_>,
|
|
method: &str,
|
|
) {
|
|
if is_trait_method(cx, expr, sym::Iterator)
|
|
&& is_trait_method(cx, recv, sym::Iterator)
|
|
&& is_expr_identity_function(cx, any_arg)
|
|
&& let map_any_call_span = map_call_span.with_hi(any_call_span.hi())
|
|
&& let Some(map_arg) = map_arg.span.get_source_text(cx)
|
|
{
|
|
span_lint_and_then(
|
|
cx,
|
|
MAP_ALL_ANY_IDENTITY,
|
|
map_any_call_span,
|
|
format!("usage of `.map(...).{method}(identity)`"),
|
|
|diag| {
|
|
diag.span_suggestion_verbose(
|
|
map_any_call_span,
|
|
format!("use `.{method}(...)` instead"),
|
|
format!("{method}({map_arg})"),
|
|
Applicability::MachineApplicable,
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|