about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDennis Luxen <info@project-osrm.org>2022-06-03 16:12:26 +0200
committerDennis Luxen <info@project-osrm.org>2022-06-05 22:45:57 +0200
commitba43f0aee9c32bad8a3d9fabfd0f442122403aaf (patch)
treee4b0a3f2a0b46220f5b1d714bd764a262342478f
parent3e52dee6467fb5c1602e7ac65b7e8a2e143ab5c6 (diff)
downloadrust-ba43f0aee9c32bad8a3d9fabfd0f442122403aaf.tar.gz
rust-ba43f0aee9c32bad8a3d9fabfd0f442122403aaf.zip
Add new lint [`needless_braces_on_range_literal`]
-rw-r--r--CHANGELOG.md1
-rw-r--r--clippy_lints/src/lib.register_all.rs1
-rw-r--r--clippy_lints/src/lib.register_lints.rs1
-rw-r--r--clippy_lints/src/lib.register_style.rs1
-rw-r--r--clippy_lints/src/lib.rs2
-rw-r--r--clippy_lints/src/needless_braces_on_range_literal.rs67
-rw-r--r--tests/ui/almost_complete_letter_range.fixed1
-rw-r--r--tests/ui/almost_complete_letter_range.rs1
-rw-r--r--tests/ui/almost_complete_letter_range.stderr24
-rw-r--r--tests/ui/needless_braces_on_range_literal.fixed9
-rw-r--r--tests/ui/needless_braces_on_range_literal.rs9
-rw-r--r--tests/ui/needless_braces_on_range_literal.stderr16
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
+