mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-26 14:40:32 +00:00
add MSRV for manual_pattern_char_comparison
This commit is contained in:
parent
0dc265ff82
commit
63388cbab8
7 changed files with 53 additions and 6 deletions
|
@ -693,6 +693,7 @@ The minimum rust version that the project supports. Defaults to the `rust-versio
|
||||||
* [`manual_is_ascii_check`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_ascii_check)
|
* [`manual_is_ascii_check`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_is_ascii_check)
|
||||||
* [`manual_let_else`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else)
|
* [`manual_let_else`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_let_else)
|
||||||
* [`manual_non_exhaustive`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_non_exhaustive)
|
* [`manual_non_exhaustive`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_non_exhaustive)
|
||||||
|
* [`manual_pattern_char_comparison`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_pattern_char_comparison)
|
||||||
* [`manual_range_contains`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains)
|
* [`manual_range_contains`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_range_contains)
|
||||||
* [`manual_rem_euclid`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid)
|
* [`manual_rem_euclid`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_rem_euclid)
|
||||||
* [`manual_retain`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_retain)
|
* [`manual_retain`](https://rust-lang.github.io/rust-clippy/master/index.html#manual_retain)
|
||||||
|
|
|
@ -265,7 +265,7 @@ define_Conf! {
|
||||||
///
|
///
|
||||||
/// Suppress lints whenever the suggested change would cause breakage for other crates.
|
/// Suppress lints whenever the suggested change would cause breakage for other crates.
|
||||||
(avoid_breaking_exported_api: bool = true),
|
(avoid_breaking_exported_api: bool = true),
|
||||||
/// Lint: MANUAL_SPLIT_ONCE, MANUAL_STR_REPEAT, CLONED_INSTEAD_OF_COPIED, REDUNDANT_FIELD_NAMES, OPTION_MAP_UNWRAP_OR, REDUNDANT_STATIC_LIFETIMES, FILTER_MAP_NEXT, CHECKED_CONVERSIONS, MANUAL_RANGE_CONTAINS, USE_SELF, MEM_REPLACE_WITH_DEFAULT, MANUAL_NON_EXHAUSTIVE, OPTION_AS_REF_DEREF, MAP_UNWRAP_OR, MATCH_LIKE_MATCHES_MACRO, MANUAL_STRIP, MISSING_CONST_FOR_FN, UNNESTED_OR_PATTERNS, FROM_OVER_INTO, PTR_AS_PTR, IF_THEN_SOME_ELSE_NONE, APPROX_CONSTANT, DEPRECATED_CFG_ATTR, INDEX_REFUTABLE_SLICE, MAP_CLONE, BORROW_AS_PTR, MANUAL_BITS, ERR_EXPECT, CAST_ABS_TO_UNSIGNED, UNINLINED_FORMAT_ARGS, MANUAL_CLAMP, MANUAL_LET_ELSE, UNCHECKED_DURATION_SUBTRACTION, COLLAPSIBLE_STR_REPLACE, SEEK_FROM_CURRENT, SEEK_REWIND, UNNECESSARY_LAZY_EVALUATIONS, TRANSMUTE_PTR_TO_REF, ALMOST_COMPLETE_RANGE, NEEDLESS_BORROW, DERIVABLE_IMPLS, MANUAL_IS_ASCII_CHECK, MANUAL_REM_EUCLID, MANUAL_RETAIN, TYPE_REPETITION_IN_BOUNDS, TUPLE_ARRAY_CONVERSIONS, MANUAL_TRY_FOLD, MANUAL_HASH_ONE, ITER_KV_MAP, MANUAL_C_STR_LITERALS, ASSIGNING_CLONES, LEGACY_NUMERIC_CONSTANTS.
|
/// Lint: MANUAL_SPLIT_ONCE, MANUAL_STR_REPEAT, CLONED_INSTEAD_OF_COPIED, REDUNDANT_FIELD_NAMES, OPTION_MAP_UNWRAP_OR, REDUNDANT_STATIC_LIFETIMES, FILTER_MAP_NEXT, CHECKED_CONVERSIONS, MANUAL_RANGE_CONTAINS, USE_SELF, MEM_REPLACE_WITH_DEFAULT, MANUAL_NON_EXHAUSTIVE, OPTION_AS_REF_DEREF, MAP_UNWRAP_OR, MATCH_LIKE_MATCHES_MACRO, MANUAL_STRIP, MISSING_CONST_FOR_FN, UNNESTED_OR_PATTERNS, FROM_OVER_INTO, PTR_AS_PTR, IF_THEN_SOME_ELSE_NONE, APPROX_CONSTANT, DEPRECATED_CFG_ATTR, INDEX_REFUTABLE_SLICE, MAP_CLONE, BORROW_AS_PTR, MANUAL_BITS, ERR_EXPECT, CAST_ABS_TO_UNSIGNED, UNINLINED_FORMAT_ARGS, MANUAL_CLAMP, MANUAL_LET_ELSE, UNCHECKED_DURATION_SUBTRACTION, COLLAPSIBLE_STR_REPLACE, SEEK_FROM_CURRENT, SEEK_REWIND, UNNECESSARY_LAZY_EVALUATIONS, TRANSMUTE_PTR_TO_REF, ALMOST_COMPLETE_RANGE, NEEDLESS_BORROW, DERIVABLE_IMPLS, MANUAL_IS_ASCII_CHECK, MANUAL_REM_EUCLID, MANUAL_RETAIN, TYPE_REPETITION_IN_BOUNDS, TUPLE_ARRAY_CONVERSIONS, MANUAL_TRY_FOLD, MANUAL_HASH_ONE, ITER_KV_MAP, MANUAL_C_STR_LITERALS, ASSIGNING_CLONES, LEGACY_NUMERIC_CONSTANTS, MANUAL_PATTERN_CHAR_COMPARISON.
|
||||||
///
|
///
|
||||||
/// The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
|
/// The minimum rust version that the project supports. Defaults to the `rust-version` field in `Cargo.toml`
|
||||||
#[default_text = ""]
|
#[default_text = ""]
|
||||||
|
|
|
@ -1168,7 +1168,7 @@ pub fn register_lints(store: &mut rustc_lint::LintStore, conf: &'static Conf) {
|
||||||
..Default::default()
|
..Default::default()
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
store.register_late_pass(|_| Box::new(string_patterns::StringPatterns));
|
store.register_late_pass(move |_| Box::new(string_patterns::StringPatterns::new(msrv())));
|
||||||
// add lints here, do not remove this comment, it's used in `new_lint`
|
// add lints here, do not remove this comment, it's used in `new_lint`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
use std::ops::ControlFlow;
|
use std::ops::ControlFlow;
|
||||||
|
|
||||||
|
use clippy_config::msrvs::{self, Msrv};
|
||||||
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
|
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
|
||||||
use clippy_utils::eager_or_lazy::switch_to_eager_eval;
|
use clippy_utils::eager_or_lazy::switch_to_eager_eval;
|
||||||
use clippy_utils::macros::matching_root_macro_call;
|
use clippy_utils::macros::matching_root_macro_call;
|
||||||
|
@ -12,7 +13,7 @@ use rustc_errors::Applicability;
|
||||||
use rustc_hir::{Expr, ExprKind, PatKind};
|
use rustc_hir::{Expr, ExprKind, PatKind};
|
||||||
use rustc_lint::{LateContext, LateLintPass};
|
use rustc_lint::{LateContext, LateLintPass};
|
||||||
use rustc_middle::ty;
|
use rustc_middle::ty;
|
||||||
use rustc_session::declare_lint_pass;
|
use rustc_session::impl_lint_pass;
|
||||||
use rustc_span::{sym, Span};
|
use rustc_span::{sym, Span};
|
||||||
|
|
||||||
declare_clippy_lint! {
|
declare_clippy_lint! {
|
||||||
|
@ -69,7 +70,18 @@ declare_clippy_lint! {
|
||||||
"using a single-character str where a char could be used, e.g., `_.split(\"x\")`"
|
"using a single-character str where a char could be used, e.g., `_.split(\"x\")`"
|
||||||
}
|
}
|
||||||
|
|
||||||
declare_lint_pass!(StringPatterns => [MANUAL_PATTERN_CHAR_COMPARISON, SINGLE_CHAR_PATTERN]);
|
pub struct StringPatterns {
|
||||||
|
msrv: Msrv,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StringPatterns {
|
||||||
|
#[must_use]
|
||||||
|
pub fn new(msrv: Msrv) -> Self {
|
||||||
|
Self { msrv }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_lint_pass!(StringPatterns => [MANUAL_PATTERN_CHAR_COMPARISON, SINGLE_CHAR_PATTERN]);
|
||||||
|
|
||||||
const PATTERN_METHODS: [(&str, usize); 22] = [
|
const PATTERN_METHODS: [(&str, usize); 22] = [
|
||||||
("contains", 0),
|
("contains", 0),
|
||||||
|
@ -220,8 +232,12 @@ impl<'tcx> LateLintPass<'tcx> for StringPatterns {
|
||||||
&& let Some(arg) = args.get(pos)
|
&& let Some(arg) = args.get(pos)
|
||||||
{
|
{
|
||||||
check_single_char_pattern_lint(cx, arg);
|
check_single_char_pattern_lint(cx, arg);
|
||||||
|
if !self.msrv.meets(msrvs::PATTERN_TRAIT_CHAR_ARRAY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
check_manual_pattern_char_comparison(cx, arg);
|
check_manual_pattern_char_comparison(cx, arg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extract_msrv_attr!(LateContext);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,3 +47,15 @@ fn main() {
|
||||||
}
|
}
|
||||||
"".find(|c| m!(c));
|
"".find(|c| m!(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[clippy::msrv = "1.57"]
|
||||||
|
fn msrv_1_57() {
|
||||||
|
let sentence = "Hello, world!";
|
||||||
|
sentence.trim_end_matches(|c: char| c == '.' || c == ',' || c == '!' || c == '?');
|
||||||
|
}
|
||||||
|
|
||||||
|
#[clippy::msrv = "1.58"]
|
||||||
|
fn msrv_1_58() {
|
||||||
|
let sentence = "Hello, world!";
|
||||||
|
sentence.trim_end_matches(['.', ',', '!', '?']);
|
||||||
|
}
|
|
@ -47,3 +47,15 @@ fn main() {
|
||||||
}
|
}
|
||||||
"".find(|c| m!(c));
|
"".find(|c| m!(c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[clippy::msrv = "1.57"]
|
||||||
|
fn msrv_1_57() {
|
||||||
|
let sentence = "Hello, world!";
|
||||||
|
sentence.trim_end_matches(|c: char| c == '.' || c == ',' || c == '!' || c == '?');
|
||||||
|
}
|
||||||
|
|
||||||
|
#[clippy::msrv = "1.58"]
|
||||||
|
fn msrv_1_58() {
|
||||||
|
let sentence = "Hello, world!";
|
||||||
|
sentence.trim_end_matches(|c: char| c == '.' || c == ',' || c == '!' || c == '?');
|
||||||
|
}
|
||||||
|
|
|
@ -55,5 +55,11 @@ error: this manual char comparison can be written more succinctly
|
||||||
LL | sentence.find(|c| c == '🎈');
|
LL | sentence.find(|c| c == '🎈');
|
||||||
| ^^^^^^^^^^^^^ help: consider using a `char`: `'🎈'`
|
| ^^^^^^^^^^^^^ help: consider using a `char`: `'🎈'`
|
||||||
|
|
||||||
error: aborting due to 9 previous errors
|
error: this manual char comparison can be written more succinctly
|
||||||
|
--> tests/ui/manual_pattern_char_comparison.rs:60:31
|
||||||
|
|
|
||||||
|
LL | sentence.trim_end_matches(|c: char| c == '.' || c == ',' || c == '!' || c == '?');
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using an array of `char`: `['.', ',', '!', '?']`
|
||||||
|
|
||||||
|
error: aborting due to 10 previous errors
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue