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) {}
37 "Warn on unnecessary double parentheses"
40 declare_lint_pass
!(DoubleParens
=> [DOUBLE_PARENS
]);
42 impl EarlyLintPass
for DoubleParens
{
43 fn check_expr(&mut self, cx
: &EarlyContext
<'_
>, expr
: &Expr
) {
44 if expr
.span
.from_expansion() {
48 let msg
: &str = "consider removing unnecessary double parentheses";
51 ExprKind
::Paren(ref in_paren
) => match in_paren
.kind
{
52 ExprKind
::Paren(_
) | ExprKind
::Tup(_
) => {
53 span_lint(cx
, DOUBLE_PARENS
, expr
.span
, msg
);
57 ExprKind
::Call(_
, ref params
) => {
58 if params
.len() == 1 {
59 let param
= ¶ms
[0];
60 if let ExprKind
::Paren(_
) = param
.kind
{
61 span_lint(cx
, DOUBLE_PARENS
, param
.span
, msg
);
65 ExprKind
::MethodCall(_
, ref params
, _
) => {
66 if params
.len() == 2 {
67 let param
= ¶ms
[1];
68 if let ExprKind
::Paren(_
) = param
.kind
{
69 span_lint(cx
, DOUBLE_PARENS
, param
.span
, msg
);