]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/double_parens.rs
Merge pull request #1406 from theemathas/double-parens
[rust.git] / clippy_lints / src / double_parens.rs
1 use syntax::ast::*;
2 use rustc::lint::{EarlyContext, LintContext, LintArray, LintPass, EarlyLintPass};
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_lint! {
18     pub DOUBLE_PARENS, Warn,
19     "Warn on unnecessary double parentheses"
20 }
21
22 #[derive(Copy, Clone)]
23 pub struct DoubleParens;
24
25 impl LintPass for DoubleParens {
26     fn get_lints(&self) -> LintArray {
27         lint_array!(DOUBLE_PARENS)
28     }
29 }
30
31 impl EarlyLintPass for DoubleParens {
32     fn check_expr(&mut self, cx: &EarlyContext, expr: &Expr) {
33         match expr.node {
34             ExprKind::Paren(ref in_paren) => {
35                 match in_paren.node {
36                     ExprKind::Paren(_) |
37                     ExprKind::Tup(_) => {
38                         cx.span_lint(DOUBLE_PARENS, expr.span, "Consider removing unnecessary double parentheses");
39                     },
40                     _ => {},
41                 }
42             },
43             ExprKind::Call(_, ref params) => {
44                 if params.len() == 1 {
45                     let param = &params[0];
46                     if let ExprKind::Paren(_) = param.node {
47                         cx.span_lint(DOUBLE_PARENS, param.span, "Consider removing unnecessary double parentheses");
48                     }
49                 }
50             },
51             ExprKind::MethodCall(_, _, ref params) => {
52                 if params.len() == 2 {
53                     let param = &params[1];
54                     if let ExprKind::Paren(_) = param.node {
55                         cx.span_lint(DOUBLE_PARENS, param.span, "Consider removing unnecessary double parentheses");
56                     }
57                 }
58             },
59             _ => {},
60         }
61     }
62 }