X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=clippy_lints%2Fsrc%2Fbytecount.rs;h=278d043732f4942631731dda65e2f96873ee47e6;hb=31c84e50772e1ebdd5ace0f4211d050e193e1e90;hp=e9b0ae6797c4d40046b84430014dc17beaa09eeb;hpb=dfbc74b08bcbe6ecb8589423186a74c5a0103448;p=rust.git diff --git a/clippy_lints/src/bytecount.rs b/clippy_lints/src/bytecount.rs index e9b0ae6797c..278d043732f 100644 --- a/clippy_lints/src/bytecount.rs +++ b/clippy_lints/src/bytecount.rs @@ -1,15 +1,15 @@ -use crate::utils::sym; use crate::utils::{ contains_name, get_pat_name, match_type, paths, single_segment_path, snippet_with_applicability, span_lint_and_sugg, walk_ptrs_ty, }; use if_chain::if_chain; -use rustc::hir::*; -use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass}; -use rustc::ty; -use rustc::{declare_lint_pass, declare_tool_lint}; +use rustc_ast::ast::{UintTy}; use rustc_errors::Applicability; -use syntax::ast::{Name, UintTy}; +use rustc_hir::{BinOpKind, BorrowKind, Expr, ExprKind, UnOp}; +use rustc_lint::{LateContext, LateLintPass}; +use rustc_middle::ty; +use rustc_session::{declare_lint_pass, declare_tool_lint}; +use rustc_span::Symbol; declare_clippy_lint! { /// **What it does:** Checks for naive byte counts @@ -25,7 +25,8 @@ /// **Example:** /// /// ```rust - /// &my_data.filter(|&x| x == 0u8).count() // use bytecount::count instead + /// # let vec = vec![1_u8]; + /// &vec.iter().filter(|x| **x == 0u8).count(); // use bytecount::count instead /// ``` pub NAIVE_BYTECOUNT, perf, @@ -35,25 +36,25 @@ declare_lint_pass!(ByteCount => [NAIVE_BYTECOUNT]); impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ByteCount { - fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr) { + fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr<'_>) { if_chain! { - if let ExprKind::MethodCall(ref count, _, ref count_args) = expr.node; - if count.ident.name == *sym::count; + if let ExprKind::MethodCall(ref count, _, ref count_args) = expr.kind; + if count.ident.name == sym!(count); if count_args.len() == 1; - if let ExprKind::MethodCall(ref filter, _, ref filter_args) = count_args[0].node; - if filter.ident.name == *sym::filter; + if let ExprKind::MethodCall(ref filter, _, ref filter_args) = count_args[0].kind; + if filter.ident.name == sym!(filter); if filter_args.len() == 2; - if let ExprKind::Closure(_, _, body_id, _, _) = filter_args[1].node; + if let ExprKind::Closure(_, _, body_id, _, _) = filter_args[1].kind; then { let body = cx.tcx.hir().body(body_id); if_chain! { - if body.arguments.len() == 1; - if let Some(argname) = get_pat_name(&body.arguments[0].pat); - if let ExprKind::Binary(ref op, ref l, ref r) = body.value.node; + if body.params.len() == 1; + if let Some(argname) = get_pat_name(&body.params[0].pat); + if let ExprKind::Binary(ref op, ref l, ref r) = body.value.kind; if op.node == BinOpKind::Eq; if match_type(cx, walk_ptrs_ty(cx.tables.expr_ty(&filter_args[0])), - &*paths::SLICE_ITER); + &paths::SLICE_ITER); then { let needle = match get_path_name(l) { Some(name) if check_arg(name, argname, r) => r, @@ -62,13 +63,13 @@ fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr) { _ => { return; } } }; - if ty::Uint(UintTy::U8) != walk_ptrs_ty(cx.tables.expr_ty(needle)).sty { + if ty::Uint(UintTy::U8) != walk_ptrs_ty(cx.tables.expr_ty(needle)).kind { return; } let haystack = if let ExprKind::MethodCall(ref path, _, ref args) = - filter_args[0].node { + filter_args[0].kind { let p = path.ident.name; - if (p == *sym::iter || p == *sym::iter_mut) && args.len() == 1 { + if (p == sym!(iter) || p == sym!(iter_mut)) && args.len() == 1 { &args[0] } else { &filter_args[0] @@ -95,13 +96,15 @@ fn check_expr(&mut self, cx: &LateContext<'_, '_>, expr: &Expr) { } } -fn check_arg(name: Name, arg: Name, needle: &Expr) -> bool { +fn check_arg(name: Symbol, arg: Symbol, needle: &Expr<'_>) -> bool { name == arg && !contains_name(name, needle) } -fn get_path_name(expr: &Expr) -> Option { - match expr.node { - ExprKind::Box(ref e) | ExprKind::AddrOf(_, ref e) | ExprKind::Unary(UnOp::UnDeref, ref e) => get_path_name(e), +fn get_path_name(expr: &Expr<'_>) -> Option { + match expr.kind { + ExprKind::Box(ref e) | ExprKind::AddrOf(BorrowKind::Ref, _, ref e) | ExprKind::Unary(UnOp::UnDeref, ref e) => { + get_path_name(e) + }, ExprKind::Block(ref b, _) => { if b.stmts.is_empty() { b.expr.as_ref().and_then(|p| get_path_name(p))