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};
8 /// Checks for unnecessary double parentheses.
10 /// ### Why is this bad?
11 /// This makes code harder to read and might indicate a
17 /// fn simple_double_parens() -> i32 {
22 /// fn simple_no_parens() -> i32 {
28 /// # fn foo(bar: usize) {}
35 #[clippy::version = "pre 1.29.0"]
38 "Warn on unnecessary double parentheses"
41 declare_lint_pass!(DoubleParens => [DOUBLE_PARENS]);
43 impl EarlyLintPass for DoubleParens {
44 fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
45 if expr.span.from_expansion() {
49 let msg: &str = "consider removing unnecessary double parentheses";
52 ExprKind::Paren(ref in_paren) => match in_paren.kind {
53 ExprKind::Paren(_) | ExprKind::Tup(_) => {
54 span_lint(cx, DOUBLE_PARENS, expr.span, msg);
58 ExprKind::Call(_, ref params) => {
59 if params.len() == 1 {
60 let param = ¶ms[0];
61 if let ExprKind::Paren(_) = param.kind {
62 span_lint(cx, DOUBLE_PARENS, param.span, msg);
66 ExprKind::MethodCall(_, ref params, _) => {
67 if params.len() == 2 {
68 let param = ¶ms[1];
69 if let ExprKind::Paren(_) = param.kind {
70 span_lint(cx, DOUBLE_PARENS, param.span, msg);