diff options
| author | Dennis Luxen <info@project-osrm.org> | 2022-06-03 16:12:26 +0200 |
|---|---|---|
| committer | Dennis Luxen <info@project-osrm.org> | 2022-06-05 22:45:57 +0200 |
| commit | ba43f0aee9c32bad8a3d9fabfd0f442122403aaf (patch) | |
| tree | e4b0a3f2a0b46220f5b1d714bd764a262342478f | |
| parent | 3e52dee6467fb5c1602e7ac65b7e8a2e143ab5c6 (diff) | |
| download | rust-ba43f0aee9c32bad8a3d9fabfd0f442122403aaf.tar.gz rust-ba43f0aee9c32bad8a3d9fabfd0f442122403aaf.zip | |
Add new lint [`needless_braces_on_range_literal`]
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | clippy_lints/src/lib.register_all.rs | 1 | ||||
| -rw-r--r-- | clippy_lints/src/lib.register_lints.rs | 1 | ||||
| -rw-r--r-- | clippy_lints/src/lib.register_style.rs | 1 | ||||
| -rw-r--r-- | clippy_lints/src/lib.rs | 2 | ||||
| -rw-r--r-- | clippy_lints/src/needless_braces_on_range_literal.rs | 67 | ||||
| -rw-r--r-- | tests/ui/almost_complete_letter_range.fixed | 1 | ||||
| -rw-r--r-- | tests/ui/almost_complete_letter_range.rs | 1 | ||||
| -rw-r--r-- | tests/ui/almost_complete_letter_range.stderr | 24 | ||||
| -rw-r--r-- | tests/ui/needless_braces_on_range_literal.fixed | 9 | ||||
| -rw-r--r-- | tests/ui/needless_braces_on_range_literal.rs | 9 | ||||
| -rw-r--r-- | tests/ui/needless_braces_on_range_literal.stderr | 16 |
12 files changed, 121 insertions, 12 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ef338b819d..ce5fa64c0d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3596,6 +3596,7 @@ Released 2018-09-13 [`needless_bool`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_bool [`needless_borrow`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrow [`needless_borrowed_reference`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_borrowed_reference +[`needless_braces_on_range_literal`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_braces_on_range_literal [`needless_collect`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_collect [`needless_continue`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_continue [`needless_doctest_main`]: https://rust-lang.github.io/rust-clippy/master/index.html#needless_doctest_main diff --git a/clippy_lints/src/lib.register_all.rs b/clippy_lints/src/lib.register_all.rs index d4ec046d0bb..68c6a33403b 100644 --- a/clippy_lints/src/lib.register_all.rs +++ b/clippy_lints/src/lib.register_all.rs @@ -241,6 +241,7 @@ store.register_group(true, "clippy::all", Some("clippy_all"), vec![ LintId::of(needless_bool::BOOL_COMPARISON), LintId::of(needless_bool::NEEDLESS_BOOL), LintId::of(needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE), + LintId::of(needless_braces_on_range_literal::NEEDLESS_BRACES_ON_RANGE_LITERAL), LintId::of(needless_late_init::NEEDLESS_LATE_INIT), LintId::of(needless_question_mark::NEEDLESS_QUESTION_MARK), LintId::of(needless_update::NEEDLESS_UPDATE), diff --git a/clippy_lints/src/lib.register_lints.rs b/clippy_lints/src/lib.register_lints.rs index b927ba3b17c..01d7d404cf6 100644 --- a/clippy_lints/src/lib.register_lints.rs +++ b/clippy_lints/src/lib.register_lints.rs @@ -405,6 +405,7 @@ store.register_lints(&[ needless_bool::BOOL_COMPARISON, needless_bool::NEEDLESS_BOOL, needless_borrowed_ref::NEEDLESS_BORROWED_REFERENCE, + needless_braces_on_range_literal::NEEDLESS_BRACES_ON_RANGE_LITERAL, needless_continue::NEEDLESS_CONTINUE, needless_for_each::NEEDLESS_FOR_EACH, needless_late_init::NEEDLESS_LATE_INIT, diff --git a/clippy_lints/src/lib.register_style.rs b/clippy_lints/src/lib.register_style.rs index 35575351784..f5d89e67fb6 100644 --- a/clippy_lints/src/lib.register_style.rs +++ b/clippy_lints/src/lib.register_style.rs @@ -90,6 +90,7 @@ store.register_group(true, "clippy::style", Some("clippy_style"), vec![ LintId::of(misc_early::REDUNDANT_PATTERN), LintId::of(mut_mutex_lock::MUT_MUTEX_LOCK), LintId::of(mut_reference::UNNECESSARY_MUT_PASSED), + LintId::of(needless_braces_on_range_literal::NEEDLESS_BRACES_ON_RANGE_LITERAL), LintId::of(needless_late_init::NEEDLESS_LATE_INIT), LintId::of(neg_multiply::NEG_MULTIPLY), LintId::of(new_without_default::NEW_WITHOUT_DEFAULT), diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs index ee0416fc0ff..d43dbc06e8e 100644 --- a/clippy_lints/src/lib.rs +++ b/clippy_lints/src/lib.rs @@ -312,6 +312,7 @@ mod needless_arbitrary_self_type; mod needless_bitwise_bool; mod needless_bool; mod needless_borrowed_ref; +mod needless_braces_on_range_literal; mod needless_continue; mod needless_for_each; mod needless_late_init; @@ -746,6 +747,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf: store.register_early_pass(|| Box::new(collapsible_if::CollapsibleIf)); store.register_early_pass(|| Box::new(items_after_statements::ItemsAfterStatements)); store.register_early_pass(|| Box::new(precedence::Precedence)); + store.register_early_pass(|| Box::new(needless_braces_on_range_literal::NeedlessBracesOnRangeLiteral)); store.register_early_pass(|| Box::new(needless_continue::NeedlessContinue)); store.register_early_pass(|| Box::new(redundant_else::RedundantElse)); store.register_late_pass(|| Box::new(create_dir::CreateDir)); diff --git a/clippy_lints/src/needless_braces_on_range_literal.rs b/clippy_lints/src/needless_braces_on_range_literal.rs new file mode 100644 index 00000000000..031008c5092 --- /dev/null +++ b/clippy_lints/src/needless_braces_on_range_literal.rs @@ -0,0 +1,67 @@ +//! Checks for braces on literals in range statements +//! +//! For example, the lint would catch +//! +//! ```rust +//! for i in (0)..10 { +//! println!("{i}"); +//! } +//! ``` +//! +//! And suggest this: +//! +//! ```rust +//! for i in 0..10 { +//! println!("{i}"); +//! } +//! ``` +//! +//! This lint is **warn** by default. + +use clippy_utils::{diagnostics::span_lint_and_then, source::snippet_opt}; +use rustc_ast::ast::{Expr, ExprKind}; +use rustc_errors::Applicability; +use rustc_lint::{EarlyContext, EarlyLintPass}; +use rustc_session::{declare_lint_pass, declare_tool_lint}; + +declare_clippy_lint! { + /// ### What it does + /// The lint checks for braces on literals in range statements that are + /// superflous. + /// + /// ### Why is this bad? + /// Having superflous braces makes the code less legible as the impose an + /// overhead when reading. + + #[clippy::version = "1.63.0"] + pub NEEDLESS_BRACES_ON_RANGE_LITERAL, + style, + "needless braces on range literal can be removed" +} + +declare_lint_pass!(NeedlessBracesOnRangeLiteral => [NEEDLESS_BRACES_ON_RANGE_LITERAL]); + +fn check_for_braces(cx: &EarlyContext<'_>, e: &Expr) { + if_chain! { + if let ExprKind::Paren(ref start_statement) = &e.kind; + if let ExprKind::Lit(ref literal) = start_statement.kind; + then { + span_lint_and_then(cx, NEEDLESS_BRACES_ON_RANGE_LITERAL, e.span, + "needless braces on range literal can be removed", + |diag| { + if let Some(suggestion) = snippet_opt(cx, literal.span) { + diag.span_suggestion(e.span, "try", suggestion, Applicability::MachineApplicable); + } + }); + } + } +} + +impl EarlyLintPass for NeedlessBracesOnRangeLiteral { + fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &Expr) { + if let ExprKind::Range(Some(start), Some(end), _) = &e.kind { + check_for_braces(cx, start); + check_for_braces(cx, end); + } + } +} diff --git a/tests/ui/almost_complete_letter_range.fixed b/tests/ui/almost_complete_letter_range.fixed index 39f8f0c2949..d2d1bdb969d 100644 --- a/tests/ui/almost_complete_letter_range.fixed +++ b/tests/ui/almost_complete_letter_range.fixed @@ -6,6 +6,7 @@ #![feature(stmt_expr_attributes)] #![warn(clippy::almost_complete_letter_range)] #![allow(ellipsis_inclusive_range_patterns)] +#![allow(clippy::needless_braces_on_range_literal)] macro_rules! a { () => { diff --git a/tests/ui/almost_complete_letter_range.rs b/tests/ui/almost_complete_letter_range.rs index 3dc02199257..28965df0805 100644 --- a/tests/ui/almost_complete_letter_range.rs +++ b/tests/ui/almost_complete_letter_range.rs @@ -6,6 +6,7 @@ #![feature(stmt_expr_attributes)] #![warn(clippy::almost_complete_letter_range)] #![allow(ellipsis_inclusive_range_patterns)] +#![allow(clippy::needless_braces_on_range_literal)] macro_rules! a { () => { diff --git a/tests/ui/almost_complete_letter_range.stderr b/tests/ui/almost_complete_letter_range.stderr index 74980ec1a92..5b5dc40ee54 100644 --- a/tests/ui/almost_complete_letter_range.stderr +++ b/tests/ui/almost_complete_letter_range.stderr @@ -1,5 +1,5 @@ error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:19:17 + --> $DIR/almost_complete_letter_range.rs:20:17 | LL | let _ = ('a') ..'z'; | ^^^^^^--^^^ @@ -9,7 +9,7 @@ LL | let _ = ('a') ..'z'; = note: `-D clippy::almost-complete-letter-range` implied by `-D warnings` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:20:17 + --> $DIR/almost_complete_letter_range.rs:21:17 | LL | let _ = 'A' .. ('Z'); | ^^^^--^^^^^^ @@ -17,7 +17,7 @@ LL | let _ = 'A' .. ('Z'); | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:26:13 + --> $DIR/almost_complete_letter_range.rs:27:13 | LL | let _ = (b'a')..(b'z'); | ^^^^^^--^^^^^^ @@ -25,7 +25,7 @@ LL | let _ = (b'a')..(b'z'); | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:27:13 + --> $DIR/almost_complete_letter_range.rs:28:13 | LL | let _ = b'A'..b'Z'; | ^^^^--^^^^ @@ -33,7 +33,7 @@ LL | let _ = b'A'..b'Z'; | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:32:13 + --> $DIR/almost_complete_letter_range.rs:33:13 | LL | let _ = a!()..'z'; | ^^^^--^^^ @@ -41,7 +41,7 @@ LL | let _ = a!()..'z'; | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:35:9 + --> $DIR/almost_complete_letter_range.rs:36:9 | LL | b'a'..b'z' if true => 1, | ^^^^--^^^^ @@ -49,7 +49,7 @@ LL | b'a'..b'z' if true => 1, | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:36:9 + --> $DIR/almost_complete_letter_range.rs:37:9 | LL | b'A'..b'Z' if true => 2, | ^^^^--^^^^ @@ -57,7 +57,7 @@ LL | b'A'..b'Z' if true => 2, | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:43:9 + --> $DIR/almost_complete_letter_range.rs:44:9 | LL | 'a'..'z' if true => 1, | ^^^--^^^ @@ -65,7 +65,7 @@ LL | 'a'..'z' if true => 1, | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:44:9 + --> $DIR/almost_complete_letter_range.rs:45:9 | LL | 'A'..'Z' if true => 2, | ^^^--^^^ @@ -73,7 +73,7 @@ LL | 'A'..'Z' if true => 2, | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:54:9 + --> $DIR/almost_complete_letter_range.rs:55:9 | LL | 'a'..'z' => 1, | ^^^--^^^ @@ -81,7 +81,7 @@ LL | 'a'..'z' => 1, | help: use an inclusive range: `...` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:61:13 + --> $DIR/almost_complete_letter_range.rs:62:13 | LL | let _ = 'a'..'z'; | ^^^--^^^ @@ -89,7 +89,7 @@ LL | let _ = 'a'..'z'; | help: use an inclusive range: `..=` error: almost complete ascii letter range - --> $DIR/almost_complete_letter_range.rs:63:9 + --> $DIR/almost_complete_letter_range.rs:64:9 | LL | 'a'..'z' => 1, | ^^^--^^^ diff --git a/tests/ui/needless_braces_on_range_literal.fixed b/tests/ui/needless_braces_on_range_literal.fixed new file mode 100644 index 00000000000..a6cf610005c --- /dev/null +++ b/tests/ui/needless_braces_on_range_literal.fixed @@ -0,0 +1,9 @@ +// run-rustfix +// edition:2018 + +#![warn(clippy::needless_braces_on_range_literal)] +#![allow(clippy::almost_complete_letter_range)] + +fn main() { + let _ = 'a'..='z'; +} diff --git a/tests/ui/needless_braces_on_range_literal.rs b/tests/ui/needless_braces_on_range_literal.rs new file mode 100644 index 00000000000..7c24a4eb494 --- /dev/null +++ b/tests/ui/needless_braces_on_range_literal.rs @@ -0,0 +1,9 @@ +// run-rustfix +// edition:2018 + +#![warn(clippy::needless_braces_on_range_literal)] +#![allow(clippy::almost_complete_letter_range)] + +fn main() { + let _ = ('a')..=('z'); +} diff --git a/tests/ui/needless_braces_on_range_literal.stderr b/tests/ui/needless_braces_on_range_literal.stderr new file mode 100644 index 00000000000..581488d19fa --- /dev/null +++ b/tests/ui/needless_braces_on_range_literal.stderr @@ -0,0 +1,16 @@ +error: needless braces on range literal can be removed + --> $DIR/needless_braces_on_range_literal.rs:8:13 + | +LL | let _ = ('a')..=('z'); + | ^^^^^ help: try: `'a'` + | + = note: `-D clippy::needless-braces-on-range-literal` implied by `-D warnings` + +error: needless braces on range literal can be removed + --> $DIR/needless_braces_on_range_literal.rs:8:21 + | +LL | let _ = ('a')..=('z'); + | ^^^^^ help: try: `'z'` + +error: aborting due to 2 previous errors + |
