]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/double_parens.rs
Rollup merge of #5712 - ijijn:master, r=flip1995
[rust.git] / clippy_lints / src / double_parens.rs
1 use crate::utils::span_lint;
2 use rustc_ast::ast::{Expr, ExprKind};
3 use rustc_lint::{EarlyContext, EarlyLintPass};
4 use rustc_session::{declare_lint_pass, declare_tool_lint};
5
6 declare_clippy_lint! {
7     /// **What it does:** Checks for unnecessary double parentheses.
8     ///
9     /// **Why is this bad?** This makes code harder to read and might indicate a
10     /// mistake.
11     ///
12     /// **Known problems:** None.
13     ///
14     /// **Example:**
15     /// ```rust
16     /// // Bad
17     /// fn simple_double_parens() -> i32 {
18     ///     ((0))
19     /// }
20     ///
21     /// // Good
22     /// fn simple_no_parens() -> i32 {
23     ///     0
24     /// }
25     ///
26     /// // or
27     ///
28     /// # fn foo(bar: usize) {}
29     /// // Bad
30     /// foo((0));
31     ///
32     /// // Good
33     /// foo(0);
34     /// ```
35     pub DOUBLE_PARENS,
36     complexity,
37     "Warn on unnecessary double parentheses"
38 }
39
40 declare_lint_pass!(DoubleParens => [DOUBLE_PARENS]);
41
42 impl EarlyLintPass for DoubleParens {
43     fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
44         if expr.span.from_expansion() {
45             return;
46         }
47
48         match expr.kind {
49             ExprKind::Paren(ref in_paren) => match in_paren.kind {
50                 ExprKind::Paren(_) | ExprKind::Tup(_) => {
51                     span_lint(
52                         cx,
53                         DOUBLE_PARENS,
54                         expr.span,
55                         "Consider removing unnecessary double parentheses",
56                     );
57                 },
58                 _ => {},
59             },
60             ExprKind::Call(_, ref params) => {
61                 if params.len() == 1 {
62                     let param = &params[0];
63                     if let ExprKind::Paren(_) = param.kind {
64                         span_lint(
65                             cx,
66                             DOUBLE_PARENS,
67                             param.span,
68                             "Consider removing unnecessary double parentheses",
69                         );
70                     }
71                 }
72             },
73             ExprKind::MethodCall(_, ref params, _) => {
74                 if params.len() == 2 {
75                     let param = &params[1];
76                     if let ExprKind::Paren(_) = param.kind {
77                         span_lint(
78                             cx,
79                             DOUBLE_PARENS,
80                             param.span,
81                             "Consider removing unnecessary double parentheses",
82                         );
83                     }
84                 }
85             },
86             _ => {},
87         }
88     }
89 }