]> git.proxmox.com Git - rustc.git/blob - src/tools/clippy/clippy_lints/src/double_parens.rs
New upstream version 1.52.1+dfsg1
[rustc.git] / src / tools / clippy / 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 let msg: &str = "consider removing unnecessary double parentheses";
49
50 match expr.kind {
51 ExprKind::Paren(ref in_paren) => match in_paren.kind {
52 ExprKind::Paren(_) | ExprKind::Tup(_) => {
53 span_lint(cx, DOUBLE_PARENS, expr.span, &msg);
54 },
55 _ => {},
56 },
57 ExprKind::Call(_, ref params) => {
58 if params.len() == 1 {
59 let param = &params[0];
60 if let ExprKind::Paren(_) = param.kind {
61 span_lint(cx, DOUBLE_PARENS, param.span, &msg);
62 }
63 }
64 },
65 ExprKind::MethodCall(_, ref params, _) => {
66 if params.len() == 2 {
67 let param = &params[1];
68 if let ExprKind::Paren(_) = param.kind {
69 span_lint(cx, DOUBLE_PARENS, param.span, &msg);
70 }
71 }
72 },
73 _ => {},
74 }
75 }
76 }