| use clippy_utils::diagnostics::span_lint_and_then; | |
| use clippy_utils::msrvs::{self, Msrv}; | |
| use clippy_utils::res::{MaybeDef, MaybeQPath}; | |
| use clippy_utils::{expr_or_init, sym}; | |
| use rustc_errors::Applicability; | |
| use rustc_hir::{Expr, ExprKind, QPath}; | |
| use rustc_lint::LateContext; | |
| pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, path: &Expr<'_>, args: &[Expr<'_>], msrv: Msrv) { | |
| if let [error_kind, error] = args | |
| && !expr.span.from_expansion() | |
| && !error_kind.span.from_expansion() | |
| && let ExprKind::Path(QPath::TypeRelative(_, new_segment)) = path.kind | |
| && path.ty_rel_def(cx).is_diag_item(cx, sym::io_error_new) | |
| && let ExprKind::Path(QPath::Resolved(_, init_path)) = &expr_or_init(cx, error_kind).kind | |
| && let [.., error_kind_ty, error_kind_variant] = init_path.segments | |
| && cx.tcx.is_diagnostic_item(sym::io_errorkind, error_kind_ty.res.def_id()) | |
| && error_kind_variant.ident.name == sym::Other | |
| && msrv.meets(cx, msrvs::IO_ERROR_OTHER) | |
| { | |
| span_lint_and_then( | |
| cx, | |
| super::IO_OTHER_ERROR, | |
| expr.span, | |
| "this can be `std::io::Error::other(_)`", | |
| |diag| { | |
| diag.multipart_suggestion( | |
| "use `std::io::Error::other`", | |
| vec![ | |
| (new_segment.ident.span, "other".to_owned()), | |
| (error_kind.span.until(error.span.source_callsite()), String::new()), | |
| ], | |
| Applicability::MachineApplicable, | |
| ); | |
| }, | |
| ); | |
| } | |
| } |