]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/clippy_lints/src/double_parens.rs
Box `ExprKind::{Closure,MethodCall}`, and `QSelf` in expressions, types, and patterns.
[rust.git] / src / tools / clippy / 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     /// fn simple_double_parens() -> i32 {
17     ///     ((0))
18     /// }
19     ///
20     /// # fn foo(bar: usize) {}
21     /// foo((0));
22     /// ```
23     ///
24     /// Use instead:
25     /// ```rust
26     /// fn simple_no_parens() -> i32 {
27     ///     0
28     /// }
29     ///
30     /// # fn foo(bar: usize) {}
31     /// foo(0);
32     /// ```
33     #[clippy::version = "pre 1.29.0"]
34     pub DOUBLE_PARENS,
35     complexity,
36     "Warn on unnecessary double parentheses"
37 }
38
39 declare_lint_pass!(DoubleParens => [DOUBLE_PARENS]);
40
41 impl EarlyLintPass for DoubleParens {
42     fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
43         if expr.span.from_expansion() {
44             return;
45         }
46
47         let msg: &str = "consider removing unnecessary double parentheses";
48
49         match expr.kind {
50             ExprKind::Paren(ref in_paren) => match in_paren.kind {
51                 ExprKind::Paren(_) | ExprKind::Tup(_) => {
52                     span_lint(cx, DOUBLE_PARENS, expr.span, msg);
53                 },
54                 _ => {},
55             },
56             ExprKind::Call(_, ref params) => {
57                 if params.len() == 1 {
58                     let param = &params[0];
59                     if let ExprKind::Paren(_) = param.kind {
60                         span_lint(cx, DOUBLE_PARENS, param.span, msg);
61                     }
62                 }
63             },
64             ExprKind::MethodCall(ref call) => {
65                 if let [ref arg] = call.args[..] {
66                     if let ExprKind::Paren(_) = arg.kind {
67                         span_lint(cx, DOUBLE_PARENS, arg.span, msg);
68                     }
69                 }
70             },
71             _ => {},
72         }
73     }
74 }