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
16 /// fn simple_double_parens() -> i32 {
20 /// # fn foo(bar: usize) {}
26 /// fn simple_no_parens() -> i32 {
30 /// # fn foo(bar: usize) {}
33 #[clippy::version = "pre 1.29.0"]
36 "Warn on unnecessary double parentheses"
39 declare_lint_pass!(DoubleParens => [DOUBLE_PARENS]);
41 impl EarlyLintPass for DoubleParens {
42 fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
43 if expr.span.from_expansion() {
47 let msg: &str = "consider removing unnecessary double parentheses";
50 ExprKind::Paren(ref in_paren) => match in_paren.kind {
51 ExprKind::Paren(_) | ExprKind::Tup(_) => {
52 span_lint(cx, DOUBLE_PARENS, expr.span, msg);
56 ExprKind::Call(_, ref params) => {
57 if params.len() == 1 {
58 let param = ¶ms[0];
59 if let ExprKind::Paren(_) = param.kind {
60 span_lint(cx, DOUBLE_PARENS, param.span, msg);
64 ExprKind::MethodCall(_, _, ref params, _) => {
65 if let [ref param] = params[..] {
66 if let ExprKind::Paren(_) = param.kind {
67 span_lint(cx, DOUBLE_PARENS, param.span, msg);