X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=clippy_lints%2Fsrc%2Fidentity_conversion.rs;h=c37bb02708f0b55c851e3741d0fcad7db6f78448;hb=6d1225981177587fbb68d9c4902c770c3dbaafb0;hp=24b0d57d098748bad0b6bb8539ed8073dc14e2e1;hpb=9219fc6c5c0d4fa2e5b7580448a2acccabc2c988;p=rust.git diff --git a/clippy_lints/src/identity_conversion.rs b/clippy_lints/src/identity_conversion.rs index 24b0d57d098..c37bb02708f 100644 --- a/clippy_lints/src/identity_conversion.rs +++ b/clippy_lints/src/identity_conversion.rs @@ -1,22 +1,24 @@ -use crate::rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; -use crate::rustc::{declare_tool_lint, lint_array}; -use crate::rustc::hir::*; -use crate::syntax::ast::NodeId; -use crate::utils::{in_macro, match_def_path, match_trait_method, same_tys, snippet, span_lint_and_then}; -use crate::utils::{opt_def_id, paths, resolve_node}; +use crate::utils::{ + match_def_path, match_trait_method, paths, same_tys, snippet, snippet_with_macro_callsite, span_lint_and_then, +}; +use rustc::hir::*; +use rustc::impl_lint_pass; +use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; +use rustc_errors::Applicability; +use rustc_session::declare_tool_lint; -/// **What it does:** Checks for always-identical `Into`/`From`/`IntoIter` conversions. -/// -/// **Why is this bad?** Redundant code. -/// -/// **Known problems:** None. -/// -/// **Example:** -/// ```rust -/// // format!() returns a `String` -/// let s: String = format!("hello").into(); -/// ``` declare_clippy_lint! { + /// **What it does:** Checks for always-identical `Into`/`From`/`IntoIter` conversions. + /// + /// **Why is this bad?** Redundant code. + /// + /// **Known problems:** None. + /// + /// **Example:** + /// ```rust + /// // format!() returns a `String` + /// let s: String = format!("hello").into(); + /// ``` pub IDENTITY_CONVERSION, complexity, "using always-identical `Into`/`From`/`IntoIter` conversions" @@ -24,46 +26,46 @@ #[derive(Default)] pub struct IdentityConversion { - try_desugar_arm: Vec, + try_desugar_arm: Vec, } -impl LintPass for IdentityConversion { - fn get_lints(&self) -> LintArray { - lint_array!(IDENTITY_CONVERSION) - } -} +impl_lint_pass!(IdentityConversion => [IDENTITY_CONVERSION]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for IdentityConversion { fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { - if in_macro(e.span) { + if e.span.from_expansion() { return; } - if Some(&e.id) == self.try_desugar_arm.last() { + if Some(&e.hir_id) == self.try_desugar_arm.last() { return; } - match e.node { + match e.kind { ExprKind::Match(_, ref arms, MatchSource::TryDesugar) => { - let e = match arms[0].body.node { + let e = match arms[0].body.kind { ExprKind::Ret(Some(ref e)) | ExprKind::Break(_, Some(ref e)) => e, _ => return, }; - if let ExprKind::Call(_, ref args) = e.node { - self.try_desugar_arm.push(args[0].id); - } else { - return; + if let ExprKind::Call(_, ref args) = e.kind { + self.try_desugar_arm.push(args[0].hir_id); } }, ExprKind::MethodCall(ref name, .., ref args) => { - if match_trait_method(cx, e, &paths::INTO[..]) && &*name.ident.as_str() == "into" { + if match_trait_method(cx, e, &paths::INTO) && &*name.ident.as_str() == "into" { let a = cx.tables.expr_ty(e); let b = cx.tables.expr_ty(&args[0]); if same_tys(cx, a, b) { - let sugg = snippet(cx, args[0].span, "").into_owned(); + let sugg = snippet_with_macro_callsite(cx, args[0].span, "").to_string(); + span_lint_and_then(cx, IDENTITY_CONVERSION, e.span, "identical conversion", |db| { - db.span_suggestion(e.span, "consider removing `.into()`", sugg); + db.span_suggestion( + e.span, + "consider removing `.into()`", + sugg, + Applicability::MachineApplicable, // snippet + ); }); } } @@ -73,23 +75,36 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { if same_tys(cx, a, b) { let sugg = snippet(cx, args[0].span, "").into_owned(); span_lint_and_then(cx, IDENTITY_CONVERSION, e.span, "identical conversion", |db| { - db.span_suggestion(e.span, "consider removing `.into_iter()`", sugg); + db.span_suggestion( + e.span, + "consider removing `.into_iter()`", + sugg, + Applicability::MachineApplicable, // snippet + ); }); } } }, - ExprKind::Call(ref path, ref args) => if let ExprKind::Path(ref qpath) = path.node { - if let Some(def_id) = opt_def_id(resolve_node(cx, qpath, path.hir_id)) { - if match_def_path(cx.tcx, def_id, &paths::FROM_FROM[..]) { - let a = cx.tables.expr_ty(e); - let b = cx.tables.expr_ty(&args[0]); - if same_tys(cx, a, b) { - let sugg = snippet(cx, args[0].span.source_callsite(), "").into_owned(); - let sugg_msg = format!("consider removing `{}()`", snippet(cx, path.span, "From::from")); - span_lint_and_then(cx, IDENTITY_CONVERSION, e.span, "identical conversion", |db| { - db.span_suggestion(e.span, &sugg_msg, sugg); - }); + ExprKind::Call(ref path, ref args) => { + if let ExprKind::Path(ref qpath) = path.kind { + if let Some(def_id) = cx.tables.qpath_res(qpath, path.hir_id).opt_def_id() { + if match_def_path(cx, def_id, &paths::FROM_FROM) { + let a = cx.tables.expr_ty(e); + let b = cx.tables.expr_ty(&args[0]); + if same_tys(cx, a, b) { + let sugg = snippet(cx, args[0].span.source_callsite(), "").into_owned(); + let sugg_msg = + format!("consider removing `{}()`", snippet(cx, path.span, "From::from")); + span_lint_and_then(cx, IDENTITY_CONVERSION, e.span, "identical conversion", |db| { + db.span_suggestion( + e.span, + &sugg_msg, + sugg, + Applicability::MachineApplicable, // snippet + ); + }); + } } } } @@ -100,7 +115,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) { } fn check_expr_post(&mut self, _: &LateContext<'a, 'tcx>, e: &'tcx Expr) { - if Some(&e.id) == self.try_desugar_arm.last() { + if Some(&e.hir_id) == self.try_desugar_arm.last() { self.try_desugar_arm.pop(); } }