From 8297c19fccb101f19999dbe6b7a52d1600a85df3 Mon Sep 17 00:00:00 2001 From: Enrico Schmitz Date: Fri, 31 Mar 2017 23:36:45 +0200 Subject: [PATCH] Fixing src/copies.rs and src/entries.rs by using ExprBlock(block) = then.node --- clippy_lints/src/copies.rs | 22 +++++++++++----------- clippy_lints/src/entry.rs | 9 ++++++++- clippy_lints/src/let_if_seq.rs | 6 ++++-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/clippy_lints/src/copies.rs b/clippy_lints/src/copies.rs index 034ce24d6ea9..92d0445a4ce3 100644 --- a/clippy_lints/src/copies.rs +++ b/clippy_lints/src/copies.rs @@ -223,13 +223,15 @@ fn lint_match_arms(cx: &LateContext, expr: &Expr) { /// `if a { c } else if b { d } else { e }`. fn if_sequence(mut expr: &Expr) -> (SmallVector<&Expr>, SmallVector<&Block>) { let mut conds = SmallVector::new(); - let mut blocks = SmallVector::new(); + let mut blocks : SmallVector<&Block> = SmallVector::new(); while let ExprIf(ref cond, ref then_expr, ref else_expr) = expr.node { conds.push(&**cond); - //FIXME - //blocks.push(&**then_expr); - //FIXME + if let ExprBlock(ref block) = then_expr.node { + blocks.push(&block); + } else { + panic!("ExprIf node is not an ExprBlock"); + } if let Some(ref else_expr) = *else_expr { expr = else_expr; @@ -241,9 +243,7 @@ fn if_sequence(mut expr: &Expr) -> (SmallVector<&Expr>, SmallVector<&Block>) { // final `else {..}` if !blocks.is_empty() { if let ExprBlock(ref block) = expr.node { - //FIXME - //blocks.push(&**block); - //FIXME + blocks.push(&**block); } } @@ -315,10 +315,10 @@ fn search_same(exprs: &[T], hash: Hash, eq: Eq) -> Option<(&T, &T)> return None; } else if exprs.len() == 2 { return if eq(&exprs[0], &exprs[1]) { - Some((&exprs[0], &exprs[1])) - } else { - None - }; + Some((&exprs[0], &exprs[1])) + } else { + None + }; } let mut map: HashMap<_, Vec<&_>> = HashMap::with_capacity(exprs.len()); diff --git a/clippy_lints/src/entry.rs b/clippy_lints/src/entry.rs index 2f5707be5c02..06e9268d22a1 100644 --- a/clippy_lints/src/entry.rs +++ b/clippy_lints/src/entry.rs @@ -46,7 +46,14 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for HashMapLint { if let Some((ty, map, key)) = check_cond(cx, check) { // in case of `if !m.contains_key(&k) { m.insert(k, v); }` // we can give a better error message - let sole_expr = else_block.is_none(); + let sole_expr = { + else_block.is_none() && + if let ExprBlock(ref then_block) = then_block.node { + (then_block.expr.is_some() as usize) + then_block.stmts.len() == 1 + } else { + true + } + }; let mut visitor = InsertVisitor { cx: cx, diff --git a/clippy_lints/src/let_if_seq.rs b/clippy_lints/src/let_if_seq.rs index 1b25a5cbda2f..fc858464fc48 100644 --- a/clippy_lints/src/let_if_seq.rs +++ b/clippy_lints/src/let_if_seq.rs @@ -69,7 +69,9 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetIfSeq { let hir::StmtExpr(ref if_, _) = expr.node, let hir::ExprIf(ref cond, ref then, ref else_) = if_.node, !used_in_expr(cx, def_id, cond), - !used_in_expr(cx, def_id, &**then), + !used_in_expr(cx, def_id, &*then), + let hir::ExprBlock(ref then) = then.node, + let Some(value) = check_assign(cx, def_id, &*then), ], { let span = Span { lo: stmt.span.lo, hi: if_.span.hi, ctxt: NO_EXPANSION }; @@ -104,7 +106,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for LetIfSeq { mut=mutability, name=name.node, cond=snippet(cx, cond.span, "_"), - then={ "" }, + then=if then.stmts.len() > 1 { " ..;" } else { "" }, else=if default_multi_stmts { " ..;" } else { "" }, value=snippet(cx, then.span, ""), default=snippet(cx, default.span, ""),