]> git.lizzy.rs Git - rust.git/blob - clippy_lints/src/double_parens.rs
Added `clippy::version` attribute to all normal lints
[rust.git] / clippy_lints / src / double_parens.rs
1 use clippy_utils::diagnostics::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
8     /// Checks for unnecessary double parentheses.
9     ///
10     /// ### Why is this bad?
11     /// This makes code harder to read and might indicate a
12     /// mistake.
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     #[clippy::version = "pre 1.29.0"]
36     pub DOUBLE_PARENS,
37     complexity,
38     "Warn on unnecessary double parentheses"
39 }
40
41 declare_lint_pass!(DoubleParens => [DOUBLE_PARENS]);
42
43 impl EarlyLintPass for DoubleParens {
44     fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
45         if expr.span.from_expansion() {
46             return;
47         }
48
49         let msg: &str = "consider removing unnecessary double parentheses";
50
51         match expr.kind {
52             ExprKind::Paren(ref in_paren) => match in_paren.kind {
53                 ExprKind::Paren(_) | ExprKind::Tup(_) => {
54                     span_lint(cx, DOUBLE_PARENS, expr.span, msg);
55                 },
56                 _ => {},
57             },
58             ExprKind::Call(_, ref params) => {
59                 if params.len() == 1 {
60                     let param = &params[0];
61                     if let ExprKind::Paren(_) = param.kind {
62                         span_lint(cx, DOUBLE_PARENS, param.span, msg);
63                     }
64                 }
65             },
66             ExprKind::MethodCall(_, ref params, _) => {
67                 if params.len() == 2 {
68                     let param = &params[1];
69                     if let ExprKind::Paren(_) = param.kind {
70                         span_lint(cx, DOUBLE_PARENS, param.span, msg);
71                     }
72                 }
73             },
74             _ => {},
75         }
76     }
77 }