Skip to content

Commit 3c62ddb

Browse files
committed
feat(zero_repeat_side_effects): put the suggestion on two lines
1 parent 19343bf commit 3c62ddb

File tree

3 files changed

+78
-37
lines changed

3 files changed

+78
-37
lines changed

clippy_lints/src/zero_repeat_side_effects.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::higher::VecArgs;
3-
use clippy_utils::source::snippet;
3+
use clippy_utils::source::{snippet, snippet_indent};
44
use rustc_ast::LitKind;
55
use rustc_data_structures::packed::Pu128;
66
use rustc_errors::Applicability;
@@ -75,24 +75,34 @@ fn inner_check(cx: &LateContext<'_>, expr: &'_ rustc_hir::Expr<'_>, inner_expr:
7575
let return_type = cx.typeck_results().expr_ty(expr);
7676

7777
let inner_expr = snippet(cx, inner_expr.span.source_callsite(), "..");
78+
let indent = snippet_indent(cx, expr.span).unwrap_or_default();
7879
let vec = if is_vec { "vec!" } else { "" };
7980

8081
let (span, sugg) = match parent_hir_node {
8182
Node::LetStmt(l) => (
8283
l.span,
8384
format!(
84-
"{inner_expr}; let {var_name}: {return_type} = {vec}[];",
85+
"{inner_expr};\n{indent}let {var_name}: {return_type} = {vec}[];",
8586
var_name = snippet(cx, l.pat.span.source_callsite(), "..")
8687
),
8788
),
8889
Node::Expr(x) if let ExprKind::Assign(l, _, _) = x.kind => (
8990
x.span,
9091
format!(
91-
"{inner_expr}; {var_name} = {vec}[] as {return_type}",
92+
"{inner_expr};\n{indent}{var_name} = {vec}[] as {return_type}",
9293
var_name = snippet(cx, l.span.source_callsite(), "..")
9394
),
9495
),
95-
_ => (expr.span, format!("{{ {inner_expr}; {vec}[] as {return_type} }}")),
96+
_ => (
97+
expr.span,
98+
format!(
99+
"\
100+
{{
101+
{indent} {inner_expr};
102+
{indent} {vec}[] as {return_type}
103+
{indent}}}"
104+
),
105+
),
96106
};
97107
span_lint_and_then(
98108
cx,

tests/ui/zero_repeat_side_effects.fixed

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,36 +13,51 @@ fn main() {
1313
// should trigger
1414

1515
// on arrays
16-
f(); let a: [i32; 0] = [];
16+
f();
17+
let a: [i32; 0] = [];
1718
//~^ zero_repeat_side_effects
1819
let mut b;
19-
f(); b = [] as [i32; 0];
20+
f();
21+
b = [] as [i32; 0];
2022
//~^ zero_repeat_side_effects
2123

2224
// on vecs
2325
// vecs dont support inferring value of consts
24-
f(); let c: std::vec::Vec<i32> = vec![];
26+
f();
27+
let c: std::vec::Vec<i32> = vec![];
2528
//~^ zero_repeat_side_effects
2629
let d;
27-
f(); d = vec![] as std::vec::Vec<i32>;
30+
f();
31+
d = vec![] as std::vec::Vec<i32>;
2832
//~^ zero_repeat_side_effects
2933

3034
// for macros
31-
println!("side effect"); let e: [(); 0] = [];
35+
println!("side effect");
36+
let e: [(); 0] = [];
3237
//~^ zero_repeat_side_effects
3338

3439
// for nested calls
35-
{ f() }; let g: [i32; 0] = [];
40+
{ f() };
41+
let g: [i32; 0] = [];
3642
//~^ zero_repeat_side_effects
3743

3844
// as function param
39-
drop({ f(); vec![] as std::vec::Vec<i32> });
45+
drop({
46+
f();
47+
vec![] as std::vec::Vec<i32>
48+
});
4049
//~^ zero_repeat_side_effects
4150

4251
// when singled out/not part of assignment/local
43-
{ f(); vec![] as std::vec::Vec<i32> };
52+
{
53+
f();
54+
vec![] as std::vec::Vec<i32>
55+
};
4456
//~^ zero_repeat_side_effects
45-
{ f(); [] as [i32; 0] };
57+
{
58+
f();
59+
[] as [i32; 0]
60+
};
4661
//~^ zero_repeat_side_effects
4762

4863
// should not trigger
@@ -96,8 +111,14 @@ fn issue_14681() {
96111

97112
foo(&[Some(0i64); 0]);
98113
foo(&[Some(Some(0i64)); 0]);
99-
foo(&{ Some(f()); [] as [std::option::Option<i32>; 0] });
114+
foo(&{
115+
Some(f());
116+
[] as [std::option::Option<i32>; 0]
117+
});
100118
//~^ zero_repeat_side_effects
101-
foo(&{ Some(Some(S::new())); [] as [std::option::Option<std::option::Option<S>>; 0] });
119+
foo(&{
120+
Some(Some(S::new()));
121+
[] as [std::option::Option<std::option::Option<S>>; 0]
122+
});
102123
//~^ zero_repeat_side_effects
103124
}

tests/ui/zero_repeat_side_effects.stderr

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ LL | let a = [f(); 0];
88
= help: to override `-D warnings` add `#[allow(clippy::zero_repeat_side_effects)]`
99
help: consider performing the side effect separately
1010
|
11-
LL - let a = [f(); 0];
12-
LL + f(); let a: [i32; 0] = [];
11+
LL ~ f();
12+
LL + let a: [i32; 0] = [];
1313
|
1414

1515
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -20,8 +20,8 @@ LL | b = [f(); 0];
2020
|
2121
help: consider performing the side effect separately
2222
|
23-
LL - b = [f(); 0];
24-
LL + f(); b = [] as [i32; 0];
23+
LL ~ f();
24+
LL ~ b = [] as [i32; 0];
2525
|
2626

2727
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -32,8 +32,8 @@ LL | let c = vec![f(); 0];
3232
|
3333
help: consider performing the side effect separately
3434
|
35-
LL - let c = vec![f(); 0];
36-
LL + f(); let c: std::vec::Vec<i32> = vec![];
35+
LL ~ f();
36+
LL + let c: std::vec::Vec<i32> = vec![];
3737
|
3838

3939
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -44,8 +44,8 @@ LL | d = vec![f(); 0];
4444
|
4545
help: consider performing the side effect separately
4646
|
47-
LL - d = vec![f(); 0];
48-
LL + f(); d = vec![] as std::vec::Vec<i32>;
47+
LL ~ f();
48+
LL ~ d = vec![] as std::vec::Vec<i32>;
4949
|
5050

5151
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -56,8 +56,8 @@ LL | let e = [println!("side effect"); 0];
5656
|
5757
help: consider performing the side effect separately
5858
|
59-
LL - let e = [println!("side effect"); 0];
60-
LL + println!("side effect"); let e: [(); 0] = [];
59+
LL ~ println!("side effect");
60+
LL + let e: [(); 0] = [];
6161
|
6262

6363
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -68,8 +68,8 @@ LL | let g = [{ f() }; 0];
6868
|
6969
help: consider performing the side effect separately
7070
|
71-
LL - let g = [{ f() }; 0];
72-
LL + { f() }; let g: [i32; 0] = [];
71+
LL ~ { f() };
72+
LL + let g: [i32; 0] = [];
7373
|
7474

7575
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -80,8 +80,10 @@ LL | drop(vec![f(); 0]);
8080
|
8181
help: consider performing the side effect separately
8282
|
83-
LL - drop(vec![f(); 0]);
84-
LL + drop({ f(); vec![] as std::vec::Vec<i32> });
83+
LL ~ drop({
84+
LL + f();
85+
LL + vec![] as std::vec::Vec<i32>
86+
LL ~ });
8587
|
8688

8789
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -92,8 +94,10 @@ LL | vec![f(); 0];
9294
|
9395
help: consider performing the side effect separately
9496
|
95-
LL - vec![f(); 0];
96-
LL + { f(); vec![] as std::vec::Vec<i32> };
97+
LL ~ {
98+
LL + f();
99+
LL + vec![] as std::vec::Vec<i32>
100+
LL ~ };
97101
|
98102

99103
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -104,8 +108,10 @@ LL | [f(); 0];
104108
|
105109
help: consider performing the side effect separately
106110
|
107-
LL - [f(); 0];
108-
LL + { f(); [] as [i32; 0] };
111+
LL ~ {
112+
LL + f();
113+
LL + [] as [i32; 0]
114+
LL ~ };
109115
|
110116

111117
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -116,8 +122,10 @@ LL | foo(&[Some(f()); 0]);
116122
|
117123
help: consider performing the side effect separately
118124
|
119-
LL - foo(&[Some(f()); 0]);
120-
LL + foo(&{ Some(f()); [] as [std::option::Option<i32>; 0] });
125+
LL ~ foo(&{
126+
LL + Some(f());
127+
LL + [] as [std::option::Option<i32>; 0]
128+
LL ~ });
121129
|
122130

123131
error: expression with side effects as the initial value in a zero-sized array initializer
@@ -128,8 +136,10 @@ LL | foo(&[Some(Some(S::new())); 0]);
128136
|
129137
help: consider performing the side effect separately
130138
|
131-
LL - foo(&[Some(Some(S::new())); 0]);
132-
LL + foo(&{ Some(Some(S::new())); [] as [std::option::Option<std::option::Option<S>>; 0] });
139+
LL ~ foo(&{
140+
LL + Some(Some(S::new()));
141+
LL + [] as [std::option::Option<std::option::Option<S>>; 0]
142+
LL ~ });
133143
|
134144

135145
error: aborting due to 11 previous errors

0 commit comments

Comments
 (0)