Skip to content

Commit 0a15a67

Browse files
committed
add structured suggestions
1 parent 6f4e078 commit 0a15a67

File tree

4 files changed

+100
-27
lines changed

4 files changed

+100
-27
lines changed

clippy_lints/src/double_parens.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
use clippy_utils::diagnostics::span_lint;
1+
use clippy_utils::diagnostics::span_lint_and_sugg;
2+
use clippy_utils::source::{HasSession, snippet_with_applicability};
23
use rustc_ast::ast::{Expr, ExprKind};
4+
use rustc_errors::Applicability;
35
use rustc_lint::{EarlyContext, EarlyLintPass};
46
use rustc_session::declare_lint_pass;
57

@@ -40,28 +42,35 @@ declare_lint_pass!(DoubleParens => [DOUBLE_PARENS]);
4042

4143
impl EarlyLintPass for DoubleParens {
4244
fn check_expr(&mut self, cx: &EarlyContext<'_>, expr: &Expr) {
43-
let span = match &expr.kind {
44-
ExprKind::Paren(in_paren) if matches!(in_paren.kind, ExprKind::Paren(_) | ExprKind::Tup(_)) => expr.span,
45+
let (outer_span, inner_span) = match &expr.kind {
46+
ExprKind::Paren(in_paren) if matches!(in_paren.kind, ExprKind::Paren(_) | ExprKind::Tup(_)) => {
47+
(expr.span, in_paren.span)
48+
},
4549
ExprKind::Call(_, params)
4650
if let [param] = &**params
47-
&& let ExprKind::Paren(_) = param.kind =>
51+
&& let ExprKind::Paren(inner) = &param.kind =>
4852
{
49-
param.span
53+
(param.span, inner.span)
5054
},
5155
ExprKind::MethodCall(call)
5256
if let [arg] = &*call.args
53-
&& let ExprKind::Paren(_) = arg.kind =>
57+
&& let ExprKind::Paren(inner) = &arg.kind =>
5458
{
55-
arg.span
59+
(arg.span, inner.span)
5660
},
5761
_ => return,
5862
};
5963
if !expr.span.from_expansion() {
60-
span_lint(
64+
let mut applicability = Applicability::MachineApplicable;
65+
let sugg = snippet_with_applicability(cx.sess(), inner_span, "_", &mut applicability);
66+
span_lint_and_sugg(
6167
cx,
6268
DOUBLE_PARENS,
63-
span,
64-
"consider removing unnecessary double parentheses",
69+
outer_span,
70+
"unnecessary parentheses",
71+
"remove them",
72+
sugg.to_string(),
73+
applicability,
6574
);
6675
}
6776
}

tests/ui/double_parens.fixed

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#![warn(clippy::double_parens)]
2+
#![allow(dead_code, clippy::eq_op)]
3+
#![feature(custom_inner_attributes)]
4+
#![rustfmt::skip]
5+
6+
fn dummy_fn<T>(_: T) {}
7+
8+
struct DummyStruct;
9+
10+
impl DummyStruct {
11+
fn dummy_method<T>(self, _: T) {}
12+
}
13+
14+
fn simple_double_parens() -> i32 {
15+
(0)
16+
//~^ double_parens
17+
}
18+
19+
fn fn_double_parens() {
20+
dummy_fn(0);
21+
//~^ double_parens
22+
}
23+
24+
fn method_double_parens(x: DummyStruct) {
25+
x.dummy_method(0);
26+
//~^ double_parens
27+
}
28+
29+
fn tuple_double_parens() -> (i32, i32) {
30+
(1, 2)
31+
//~^ double_parens
32+
}
33+
34+
#[allow(clippy::unused_unit)]
35+
fn unit_double_parens() {
36+
()
37+
//~^ double_parens
38+
}
39+
40+
fn fn_tuple_ok() {
41+
dummy_fn((1, 2));
42+
}
43+
44+
fn method_tuple_ok(x: DummyStruct) {
45+
x.dummy_method((1, 2));
46+
}
47+
48+
fn fn_unit_ok() {
49+
dummy_fn(());
50+
}
51+
52+
fn method_unit_ok(x: DummyStruct) {
53+
x.dummy_method(());
54+
}
55+
56+
// Issue #3206
57+
fn inside_macro() {
58+
assert_eq!((1, 2), (1, 2), "Error");
59+
assert_eq!((1, 2), (1, 2), "Error");
60+
//~^ double_parens
61+
}
62+
63+
fn main() {}

tests/ui/double_parens.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ fn tuple_double_parens() -> (i32, i32) {
3131
//~^ double_parens
3232
}
3333

34+
#[allow(clippy::unused_unit)]
3435
fn unit_double_parens() {
3536
(())
3637
//~^ double_parens

tests/ui/double_parens.stderr

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
1-
error: consider removing unnecessary double parentheses
1+
error: unnecessary parentheses
22
--> tests/ui/double_parens.rs:15:5
33
|
44
LL | ((0))
5-
| ^^^^^
5+
| ^^^^^ help: remove them: `(0)`
66
|
77
= note: `-D clippy::double-parens` implied by `-D warnings`
88
= help: to override `-D warnings` add `#[allow(clippy::double_parens)]`
99

10-
error: consider removing unnecessary double parentheses
11-
--> tests/ui/double_parens.rs:22:14
10+
error: unnecessary parentheses
11+
--> tests/ui/double_parens.rs:20:14
1212
|
1313
LL | dummy_fn((0));
14-
| ^^^
14+
| ^^^ help: remove them: `0`
1515

16-
error: consider removing unnecessary double parentheses
17-
--> tests/ui/double_parens.rs:28:20
16+
error: unnecessary parentheses
17+
--> tests/ui/double_parens.rs:25:20
1818
|
1919
LL | x.dummy_method((0));
20-
| ^^^
20+
| ^^^ help: remove them: `0`
2121

22-
error: consider removing unnecessary double parentheses
23-
--> tests/ui/double_parens.rs:34:5
22+
error: unnecessary parentheses
23+
--> tests/ui/double_parens.rs:30:5
2424
|
2525
LL | ((1, 2))
26-
| ^^^^^^^^
26+
| ^^^^^^^^ help: remove them: `(1, 2)`
2727

28-
error: consider removing unnecessary double parentheses
29-
--> tests/ui/double_parens.rs:40:5
28+
error: unnecessary parentheses
29+
--> tests/ui/double_parens.rs:36:5
3030
|
3131
LL | (())
32-
| ^^^^
32+
| ^^^^ help: remove them: `()`
3333

34-
error: consider removing unnecessary double parentheses
35-
--> tests/ui/double_parens.rs:64:16
34+
error: unnecessary parentheses
35+
--> tests/ui/double_parens.rs:59:16
3636
|
3737
LL | assert_eq!(((1, 2)), (1, 2), "Error");
38-
| ^^^^^^^^
38+
| ^^^^^^^^ help: remove them: `(1, 2)`
3939

4040
error: aborting due to 6 previous errors
4141

0 commit comments

Comments
 (0)