]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/double_parens.rs
Categorize all the lints!
[rust.git] / clippy_lints / src / double_parens.rs
1 use syntax::ast::*;
2 use rustc::lint::{EarlyContext, EarlyLintPass, LintArray, LintContext, LintPass};
3
4 /// **What it does:** Checks for unnecessary double parentheses.
5 ///
6 /// **Why is this bad?** This makes code harder to read and might indicate a
7 /// mistake.
8 ///
9 /// **Known problems:** None.
10 ///
11 /// **Example:**
12 /// ```rust
13 /// ((0))
14 /// foo((0))
15 /// ((1, 2))
16 /// ```
17 declare_clippy_lint! {
18     pub DOUBLE_PARENS,
19     complexity,
20     "Warn on unnecessary double parentheses"
21 }
22
23 #[derive(Copy, Clone)]
24 pub struct DoubleParens;
25
26 impl LintPass for DoubleParens {
27     fn get_lints(&self) -> LintArray {
28         lint_array!(DOUBLE_PARENS)
29     }
30 }
31
32 impl EarlyLintPass for DoubleParens {
33     fn check_expr(&mut self, cx: &EarlyContext, expr: &Expr) {
34         match expr.node {
35             ExprKind::Paren(ref in_paren) => match in_paren.node {
36                 ExprKind::Paren(_) | ExprKind::Tup(_) => {
37                     cx.span_lint(DOUBLE_PARENS, expr.span, "Consider removing unnecessary double parentheses");
38                 },
39                 _ => {},
40             },
41             ExprKind::Call(_, ref params) => if params.len() == 1 {
42                 let param = &params[0];
43                 if let ExprKind::Paren(_) = param.node {
44                     cx.span_lint(DOUBLE_PARENS, param.span, "Consider removing unnecessary double parentheses");
45                 }
46             },
47             ExprKind::MethodCall(_, ref params) => if params.len() == 2 {
48                 let param = &params[1];
49                 if let ExprKind::Paren(_) = param.node {
50                     cx.span_lint(DOUBLE_PARENS, param.span, "Consider removing unnecessary double parentheses");
51                 }
52             },
53             _ => {},
54         }
55     }
56 }