Skip to content

Commit ba43f0a

Browse files
committed
Add new lint [needless_braces_on_range_literal]
1 parent 3e52dee commit ba43f0a

12 files changed

+121
-12
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3596,6 +3596,7 @@ Released 2018-09-13
35963596
[`needless_bool`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_bool
35973597
[`needless_borrow`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow
35983598
[`needless_borrowed_reference`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrowed_reference
3599+
[`needless_braces_on_range_literal`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_braces_on_range_literal
35993600
[`needless_collect`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_collect
36003601
[`needless_continue`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_continue
36013602
[`needless_doctest_main`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_doctest_main

clippy_lints/src/lib.register_all.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ store.register_group(true, "clippy::all", Some("clippy_all"), vec![
241241
LintId::of(needless_bool::BOOL_COMPARISON),
242242
LintId::of(needless_bool::NEEDLESS_BOOL),
243243
LintId::of(needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE),
244+
LintId::of(needless_braces_on_range_literal::NEEDLESS_BRACES_ON_RANGE_LITERAL),
244245
LintId::of(needless_late_init::NEEDLESS_LATE_INIT),
245246
LintId::of(needless_question_mark::NEEDLESS_QUESTION_MARK),
246247
LintId::of(needless_update::NEEDLESS_UPDATE),

clippy_lints/src/lib.register_lints.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ store.register_lints(&[
405405
needless_bool::BOOL_COMPARISON,
406406
needless_bool::NEEDLESS_BOOL,
407407
needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE,
408+
needless_braces_on_range_literal::NEEDLESS_BRACES_ON_RANGE_LITERAL,
408409
needless_continue::NEEDLESS_CONTINUE,
409410
needless_for_each::NEEDLESS_FOR_EACH,
410411
needless_late_init::NEEDLESS_LATE_INIT,

clippy_lints/src/lib.register_style.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ store.register_group(true, "clippy::style", Some("clippy_style"), vec![
9090
LintId::of(misc_early::REDUNDANT_PATTERN),
9191
LintId::of(mut_mutex_lock::MUT_MUTEX_LOCK),
9292
LintId::of(mut_reference::UNNECESSARY_MUT_PASSED),
93+
LintId::of(needless_braces_on_range_literal::NEEDLESS_BRACES_ON_RANGE_LITERAL),
9394
LintId::of(needless_late_init::NEEDLESS_LATE_INIT),
9495
LintId::of(neg_multiply::NEG_MULTIPLY),
9596
LintId::of(new_without_default::NEW_WITHOUT_DEFAULT),

clippy_lints/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ mod needless_arbitrary_self_type;
312312
mod needless_bitwise_bool;
313313
mod needless_bool;
314314
mod needless_borrowed_ref;
315+
mod needless_braces_on_range_literal;
315316
mod needless_continue;
316317
mod needless_for_each;
317318
mod needless_late_init;
@@ -746,6 +747,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
746747
store.register_early_pass(|| Box::new(collapsible_if::CollapsibleIf));
747748
store.register_early_pass(|| Box::new(items_after_statements::ItemsAfterStatements));
748749
store.register_early_pass(|| Box::new(precedence::Precedence));
750+
store.register_early_pass(|| Box::new(needless_braces_on_range_literal::NeedlessBracesOnRangeLiteral));
749751
store.register_early_pass(|| Box::new(needless_continue::NeedlessContinue));
750752
store.register_early_pass(|| Box::new(redundant_else::RedundantElse));
751753
store.register_late_pass(|| Box::new(create_dir::CreateDir));
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
//! Checks for braces on literals in range statements
2+
//!
3+
//! For example, the lint would catch
4+
//!
5+
//! ```rust
6+
//! for i in (0)..10 {
7+
//! println!("{i}");
8+
//! }
9+
//! ```
10+
//!
11+
//! And suggest this:
12+
//!
13+
//! ```rust
14+
//! for i in 0..10 {
15+
//! println!("{i}");
16+
//! }
17+
//! ```
18+
//!
19+
//! This lint is **warn** by default.
20+
21+
use clippy_utils::{diagnostics::span_lint_and_then, source::snippet_opt};
22+
use rustc_ast::ast::{Expr, ExprKind};
23+
use rustc_errors::Applicability;
24+
use rustc_lint::{EarlyContext, EarlyLintPass};
25+
use rustc_session::{declare_lint_pass, declare_tool_lint};
26+
27+
declare_clippy_lint! {
28+
/// ### What it does
29+
/// The lint checks for braces on literals in range statements that are
30+
/// superflous.
31+
///
32+
/// ### Why is this bad?
33+
/// Having superflous braces makes the code less legible as the impose an
34+
/// overhead when reading.
35+
36+
#[clippy::version = "1.63.0"]
37+
pub NEEDLESS_BRACES_ON_RANGE_LITERAL,
38+
style,
39+
"needless braces on range literal can be removed"
40+
}
41+
42+
declare_lint_pass!(NeedlessBracesOnRangeLiteral => [NEEDLESS_BRACES_ON_RANGE_LITERAL]);
43+
44+
fn check_for_braces(cx: &EarlyContext<'_>, e: &Expr) {
45+
if_chain! {
46+
if let ExprKind::Paren(ref start_statement) = &e.kind;
47+
if let ExprKind::Lit(ref literal) = start_statement.kind;
48+
then {
49+
span_lint_and_then(cx, NEEDLESS_BRACES_ON_RANGE_LITERAL, e.span,
50+
"needless braces on range literal can be removed",
51+
|diag| {
52+
if let Some(suggestion) = snippet_opt(cx, literal.span) {
53+
diag.span_suggestion(e.span, "try", suggestion, Applicability::MachineApplicable);
54+
}
55+
});
56+
}
57+
}
58+
}
59+
60+
impl EarlyLintPass for NeedlessBracesOnRangeLiteral {
61+
fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) {
62+
if let ExprKind::Range(Some(start), Some(end), _) = &e.kind {
63+
check_for_braces(cx, start);
64+
check_for_braces(cx, end);
65+
}
66+
}
67+
}

tests/ui/almost_complete_letter_range.fixed

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![feature(stmt_expr_attributes)]
77
#![warn(clippy::almost_complete_letter_range)]
88
#![allow(ellipsis_inclusive_range_patterns)]
9+
#![allow(clippy::needless_braces_on_range_literal)]
910

1011
macro_rules! a {
1112
() => {

tests/ui/almost_complete_letter_range.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![feature(stmt_expr_attributes)]
77
#![warn(clippy::almost_complete_letter_range)]
88
#![allow(ellipsis_inclusive_range_patterns)]
9+
#![allow(clippy::needless_braces_on_range_literal)]
910

1011
macro_rules! a {
1112
() => {

tests/ui/almost_complete_letter_range.stderr

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: almost complete ascii letter range
2-
--> $DIR/almost_complete_letter_range.rs:19:17
2+
--> $DIR/almost_complete_letter_range.rs:20:17
33
|
44
LL | let _ = ('a') ..'z';
55
| ^^^^^^--^^^
@@ -9,87 +9,87 @@ LL | let _ = ('a') ..'z';
99
= note: `-D clippy::almost-complete-letter-range` implied by `-D warnings`
1010

1111
error: almost complete ascii letter range
12-
--> $DIR/almost_complete_letter_range.rs:20:17
12+
--> $DIR/almost_complete_letter_range.rs:21:17
1313
|
1414
LL | let _ = 'A' .. ('Z');
1515
| ^^^^--^^^^^^
1616
| |
1717
| help: use an inclusive range: `..=`
1818

1919
error: almost complete ascii letter range
20-
--> $DIR/almost_complete_letter_range.rs:26:13
20+
--> $DIR/almost_complete_letter_range.rs:27:13
2121
|
2222
LL | let _ = (b'a')..(b'z');
2323
| ^^^^^^--^^^^^^
2424
| |
2525
| help: use an inclusive range: `..=`
2626

2727
error: almost complete ascii letter range
28-
--> $DIR/almost_complete_letter_range.rs:27:13
28+
--> $DIR/almost_complete_letter_range.rs:28:13
2929
|
3030
LL | let _ = b'A'..b'Z';
3131
| ^^^^--^^^^
3232
| |
3333
| help: use an inclusive range: `..=`
3434

3535
error: almost complete ascii letter range
36-
--> $DIR/almost_complete_letter_range.rs:32:13
36+
--> $DIR/almost_complete_letter_range.rs:33:13
3737
|
3838
LL | let _ = a!()..'z';
3939
| ^^^^--^^^
4040
| |
4141
| help: use an inclusive range: `..=`
4242

4343
error: almost complete ascii letter range
44-
--> $DIR/almost_complete_letter_range.rs:35:9
44+
--> $DIR/almost_complete_letter_range.rs:36:9
4545
|
4646
LL | b'a'..b'z' if true => 1,
4747
| ^^^^--^^^^
4848
| |
4949
| help: use an inclusive range: `..=`
5050

5151
error: almost complete ascii letter range
52-
--> $DIR/almost_complete_letter_range.rs:36:9
52+
--> $DIR/almost_complete_letter_range.rs:37:9
5353
|
5454
LL | b'A'..b'Z' if true => 2,
5555
| ^^^^--^^^^
5656
| |
5757
| help: use an inclusive range: `..=`
5858

5959
error: almost complete ascii letter range
60-
--> $DIR/almost_complete_letter_range.rs:43:9
60+
--> $DIR/almost_complete_letter_range.rs:44:9
6161
|
6262
LL | 'a'..'z' if true => 1,
6363
| ^^^--^^^
6464
| |
6565
| help: use an inclusive range: `..=`
6666

6767
error: almost complete ascii letter range
68-
--> $DIR/almost_complete_letter_range.rs:44:9
68+
--> $DIR/almost_complete_letter_range.rs:45:9
6969
|
7070
LL | 'A'..'Z' if true => 2,
7171
| ^^^--^^^
7272
| |
7373
| help: use an inclusive range: `..=`
7474

7575
error: almost complete ascii letter range
76-
--> $DIR/almost_complete_letter_range.rs:54:9
76+
--> $DIR/almost_complete_letter_range.rs:55:9
7777
|
7878
LL | 'a'..'z' => 1,
7979
| ^^^--^^^
8080
| |
8181
| help: use an inclusive range: `...`
8282

8383
error: almost complete ascii letter range
84-
--> $DIR/almost_complete_letter_range.rs:61:13
84+
--> $DIR/almost_complete_letter_range.rs:62:13
8585
|
8686
LL | let _ = 'a'..'z';
8787
| ^^^--^^^
8888
| |
8989
| help: use an inclusive range: `..=`
9090

9191
error: almost complete ascii letter range
92-
--> $DIR/almost_complete_letter_range.rs:63:9
92+
--> $DIR/almost_complete_letter_range.rs:64:9
9393
|
9494
LL | 'a'..'z' => 1,
9595
| ^^^--^^^
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// run-rustfix
2+
// edition:2018
3+
4+
#![warn(clippy::needless_braces_on_range_literal)]
5+
#![allow(clippy::almost_complete_letter_range)]
6+
7+
fn main() {
8+
let _ = 'a'..='z';
9+
}

0 commit comments

Comments
 (0)