Backport #4101
https://github.com/rust-lang/rust-clippy/pull/4101 Splits up redundant_closure's method checking into a pedantic lint
This commit is contained in:
parent
37f5c1ec73
commit
9170ca3349
@ -1,6 +1,6 @@
|
|||||||
language: rust
|
language: rust
|
||||||
|
|
||||||
rust: nightly
|
rust: beta
|
||||||
|
|
||||||
os:
|
os:
|
||||||
- linux
|
- linux
|
||||||
@ -17,6 +17,7 @@ branches:
|
|||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- RUST_BACKTRACE=1
|
- RUST_BACKTRACE=1
|
||||||
|
- RUSTC_BOOTSTRAP=1
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- |
|
- |
|
||||||
@ -90,7 +91,7 @@ matrix:
|
|||||||
script:
|
script:
|
||||||
- |
|
- |
|
||||||
rm rust-toolchain
|
rm rust-toolchain
|
||||||
./setup-toolchain.sh
|
rustup override set beta
|
||||||
export LD_LIBRARY_PATH=$(rustc --print sysroot)/lib
|
export LD_LIBRARY_PATH=$(rustc --print sysroot)/lib
|
||||||
- |
|
- |
|
||||||
if [ -z ${INTEGRATION} ]; then
|
if [ -z ${INTEGRATION} ]; then
|
||||||
|
@ -978,6 +978,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
[`redundant_clone`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_clone
|
[`redundant_clone`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_clone
|
||||||
[`redundant_closure`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure
|
[`redundant_closure`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure
|
||||||
[`redundant_closure_call`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_call
|
[`redundant_closure_call`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_call
|
||||||
|
[`redundant_closure_for_method_calls`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_closure_for_method_calls
|
||||||
[`redundant_field_names`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names
|
[`redundant_field_names`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_field_names
|
||||||
[`redundant_pattern`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern
|
[`redundant_pattern`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern
|
||||||
[`redundant_pattern_matching`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching
|
[`redundant_pattern_matching`]: https://rust-lang.github.io/rust-clippy/master/index.html#redundant_pattern_matching
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
A collection of lints to catch common mistakes and improve your [Rust](https://github.com/rust-lang/rust) code.
|
A collection of lints to catch common mistakes and improve your [Rust](https://github.com/rust-lang/rust) code.
|
||||||
|
|
||||||
[There are 298 lints included in this crate!](https://rust-lang.github.io/rust-clippy/master/index.html)
|
[There are 299 lints included in this crate!](https://rust-lang.github.io/rust-clippy/master/index.html)
|
||||||
|
|
||||||
We have a bunch of lint categories to allow you to choose how much Clippy is supposed to ~~annoy~~ help you:
|
We have a bunch of lint categories to allow you to choose how much Clippy is supposed to ~~annoy~~ help you:
|
||||||
|
|
||||||
|
@ -16,14 +16,8 @@ branches:
|
|||||||
|
|
||||||
install:
|
install:
|
||||||
- curl -sSf -o rustup-init.exe https://win.rustup.rs/
|
- curl -sSf -o rustup-init.exe https://win.rustup.rs/
|
||||||
- rustup-init.exe -y --default-host %TARGET% --default-toolchain nightly
|
- rustup-init.exe -y --default-host %TARGET% --default-toolchain beta
|
||||||
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
|
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
|
||||||
- git ls-remote https://github.com/rust-lang/rust.git master | awk '{print $1}' >rustc-hash.txt
|
|
||||||
- set /p RUSTC_HASH=<rustc-hash.txt
|
|
||||||
- del rust-toolchain
|
|
||||||
- cargo install rustup-toolchain-install-master --debug || echo "rustup-toolchain-install-master already installed"
|
|
||||||
- rustup-toolchain-install-master %RUSTC_HASH% -f -n master
|
|
||||||
- rustup default master
|
|
||||||
- set PATH=%PATH%;C:\Users\appveyor\.rustup\toolchains\master\bin
|
- set PATH=%PATH%;C:\Users\appveyor\.rustup\toolchains\master\bin
|
||||||
- rustc -V
|
- rustc -V
|
||||||
- cargo -V
|
- cargo -V
|
||||||
@ -32,6 +26,7 @@ build: false
|
|||||||
|
|
||||||
test_script:
|
test_script:
|
||||||
- set RUST_BACKTRACE=1
|
- set RUST_BACKTRACE=1
|
||||||
|
- set RUSTC_BOOTSTRAP=1
|
||||||
- cargo build --features debugging
|
- cargo build --features debugging
|
||||||
- cargo test --features debugging
|
- cargo test --features debugging
|
||||||
|
|
||||||
|
@ -75,4 +75,4 @@ if [ "${tests_need_reformatting}" == "true" ] ; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# switch back to master
|
# switch back to master
|
||||||
rustup override set master
|
# rustup override set master
|
||||||
|
@ -33,9 +33,31 @@ declare_clippy_lint! {
|
|||||||
"redundant closures, i.e., `|a| foo(a)` (which can be written as just `foo`)"
|
"redundant closures, i.e., `|a| foo(a)` (which can be written as just `foo`)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
declare_clippy_lint! {
|
||||||
|
/// **What it does:** Checks for closures which only invoke a method on the closure
|
||||||
|
/// argument and can be replaced by referencing the method directly.
|
||||||
|
///
|
||||||
|
/// **Why is this bad?** It's unnecessary to create the closure.
|
||||||
|
///
|
||||||
|
/// **Known problems:** rust-lang/rust-clippy#3071, rust-lang/rust-clippy#4002,
|
||||||
|
/// rust-lang/rust-clippy#3942
|
||||||
|
///
|
||||||
|
/// **Example:**
|
||||||
|
/// ```rust,ignore
|
||||||
|
/// Some('a').map(|s| s.to_uppercase());
|
||||||
|
/// ```
|
||||||
|
/// may be rewritten as
|
||||||
|
/// ```rust,ignore
|
||||||
|
/// Some('a').map(char::to_uppercase);
|
||||||
|
/// ```
|
||||||
|
pub REDUNDANT_CLOSURE_FOR_METHOD_CALLS,
|
||||||
|
pedantic,
|
||||||
|
"redundant closures for method calls"
|
||||||
|
}
|
||||||
|
|
||||||
impl LintPass for EtaPass {
|
impl LintPass for EtaPass {
|
||||||
fn get_lints(&self) -> LintArray {
|
fn get_lints(&self) -> LintArray {
|
||||||
lint_array!(REDUNDANT_CLOSURE)
|
lint_array!(REDUNDANT_CLOSURE, REDUNDANT_CLOSURE_FOR_METHOD_CALLS)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn name(&self) -> &'static str {
|
fn name(&self) -> &'static str {
|
||||||
@ -110,7 +132,7 @@ fn check_closure(cx: &LateContext<'_, '_>, expr: &Expr) {
|
|||||||
if let Some(name) = get_ufcs_type_name(cx, method_def_id, &args[0]);
|
if let Some(name) = get_ufcs_type_name(cx, method_def_id, &args[0]);
|
||||||
|
|
||||||
then {
|
then {
|
||||||
span_lint_and_then(cx, REDUNDANT_CLOSURE, expr.span, "redundant closure found", |db| {
|
span_lint_and_then(cx, REDUNDANT_CLOSURE_FOR_METHOD_CALLS, expr.span, "redundant closure found", |db| {
|
||||||
db.span_suggestion(
|
db.span_suggestion(
|
||||||
expr.span,
|
expr.span,
|
||||||
"remove closure as shown",
|
"remove closure as shown",
|
||||||
|
@ -611,6 +611,7 @@ pub fn register_plugins(reg: &mut rustc_plugin::Registry<'_>, conf: &Conf) {
|
|||||||
enum_glob_use::ENUM_GLOB_USE,
|
enum_glob_use::ENUM_GLOB_USE,
|
||||||
enum_variants::MODULE_NAME_REPETITIONS,
|
enum_variants::MODULE_NAME_REPETITIONS,
|
||||||
enum_variants::PUB_ENUM_VARIANT_NAMES,
|
enum_variants::PUB_ENUM_VARIANT_NAMES,
|
||||||
|
eta_reduction::REDUNDANT_CLOSURE_FOR_METHOD_CALLS,
|
||||||
functions::TOO_MANY_LINES,
|
functions::TOO_MANY_LINES,
|
||||||
if_not_else::IF_NOT_ELSE,
|
if_not_else::IF_NOT_ELSE,
|
||||||
infinite_iter::MAYBE_INFINITE_ITER,
|
infinite_iter::MAYBE_INFINITE_ITER,
|
||||||
|
@ -1 +1 @@
|
|||||||
nightly
|
beta
|
||||||
|
@ -7,7 +7,11 @@
|
|||||||
clippy::option_map_unit_fn,
|
clippy::option_map_unit_fn,
|
||||||
clippy::trivially_copy_pass_by_ref
|
clippy::trivially_copy_pass_by_ref
|
||||||
)]
|
)]
|
||||||
#![warn(clippy::redundant_closure, clippy::needless_borrow)]
|
#![warn(
|
||||||
|
clippy::redundant_closure,
|
||||||
|
clippy::redundant_closure_for_method_calls,
|
||||||
|
clippy::needless_borrow
|
||||||
|
)]
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:15:27
|
--> $DIR/eta.rs:19:27
|
||||||
|
|
|
|
||||||
LL | let a = Some(1u8).map(|a| foo(a));
|
LL | let a = Some(1u8).map(|a| foo(a));
|
||||||
| ^^^^^^^^^^ help: remove closure as shown: `foo`
|
| ^^^^^^^^^^ help: remove closure as shown: `foo`
|
||||||
@ -7,19 +7,19 @@ LL | let a = Some(1u8).map(|a| foo(a));
|
|||||||
= note: `-D clippy::redundant-closure` implied by `-D warnings`
|
= note: `-D clippy::redundant-closure` implied by `-D warnings`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:16:10
|
--> $DIR/eta.rs:20:10
|
||||||
|
|
|
|
||||||
LL | meta(|a| foo(a));
|
LL | meta(|a| foo(a));
|
||||||
| ^^^^^^^^^^ help: remove closure as shown: `foo`
|
| ^^^^^^^^^^ help: remove closure as shown: `foo`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:17:27
|
--> $DIR/eta.rs:21:27
|
||||||
|
|
|
|
||||||
LL | let c = Some(1u8).map(|a| {1+2; foo}(a));
|
LL | let c = Some(1u8).map(|a| {1+2; foo}(a));
|
||||||
| ^^^^^^^^^^^^^^^^^ help: remove closure as shown: `{1+2; foo}`
|
| ^^^^^^^^^^^^^^^^^ help: remove closure as shown: `{1+2; foo}`
|
||||||
|
|
||||||
error: this expression borrows a reference that is immediately dereferenced by the compiler
|
error: this expression borrows a reference that is immediately dereferenced by the compiler
|
||||||
--> $DIR/eta.rs:19:21
|
--> $DIR/eta.rs:23:21
|
||||||
|
|
|
|
||||||
LL | all(&[1, 2, 3], &&2, |x, y| below(x, y)); //is adjusted
|
LL | all(&[1, 2, 3], &&2, |x, y| below(x, y)); //is adjusted
|
||||||
| ^^^ help: change this to: `&2`
|
| ^^^ help: change this to: `&2`
|
||||||
@ -27,43 +27,45 @@ LL | all(&[1, 2, 3], &&2, |x, y| below(x, y)); //is adjusted
|
|||||||
= note: `-D clippy::needless-borrow` implied by `-D warnings`
|
= note: `-D clippy::needless-borrow` implied by `-D warnings`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:26:27
|
--> $DIR/eta.rs:30:27
|
||||||
|
|
|
|
||||||
LL | let e = Some(1u8).map(|a| generic(a));
|
LL | let e = Some(1u8).map(|a| generic(a));
|
||||||
| ^^^^^^^^^^^^^^ help: remove closure as shown: `generic`
|
| ^^^^^^^^^^^^^^ help: remove closure as shown: `generic`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:69:51
|
--> $DIR/eta.rs:73:51
|
||||||
|
|
|
|
||||||
LL | let e = Some(TestStruct { some_ref: &i }).map(|a| a.foo());
|
LL | let e = Some(TestStruct { some_ref: &i }).map(|a| a.foo());
|
||||||
| ^^^^^^^^^^^ help: remove closure as shown: `TestStruct::foo`
|
| ^^^^^^^^^^^ help: remove closure as shown: `TestStruct::foo`
|
||||||
|
|
|
||||||
|
= note: `-D clippy::redundant-closure-for-method-calls` implied by `-D warnings`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:71:51
|
--> $DIR/eta.rs:75:51
|
||||||
|
|
|
|
||||||
LL | let e = Some(TestStruct { some_ref: &i }).map(|a| a.trait_foo());
|
LL | let e = Some(TestStruct { some_ref: &i }).map(|a| a.trait_foo());
|
||||||
| ^^^^^^^^^^^^^^^^^ help: remove closure as shown: `TestTrait::trait_foo`
|
| ^^^^^^^^^^^^^^^^^ help: remove closure as shown: `TestTrait::trait_foo`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:74:42
|
--> $DIR/eta.rs:78:42
|
||||||
|
|
|
|
||||||
LL | let e = Some(&mut vec![1, 2, 3]).map(|v| v.clear());
|
LL | let e = Some(&mut vec![1, 2, 3]).map(|v| v.clear());
|
||||||
| ^^^^^^^^^^^^^ help: remove closure as shown: `std::vec::Vec::clear`
|
| ^^^^^^^^^^^^^ help: remove closure as shown: `std::vec::Vec::clear`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:79:29
|
--> $DIR/eta.rs:83:29
|
||||||
|
|
|
|
||||||
LL | let e = Some("str").map(|s| s.to_string());
|
LL | let e = Some("str").map(|s| s.to_string());
|
||||||
| ^^^^^^^^^^^^^^^^^ help: remove closure as shown: `std::string::ToString::to_string`
|
| ^^^^^^^^^^^^^^^^^ help: remove closure as shown: `std::string::ToString::to_string`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:81:27
|
--> $DIR/eta.rs:85:27
|
||||||
|
|
|
|
||||||
LL | let e = Some('a').map(|s| s.to_uppercase());
|
LL | let e = Some('a').map(|s| s.to_uppercase());
|
||||||
| ^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `char::to_uppercase`
|
| ^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `char::to_uppercase`
|
||||||
|
|
||||||
error: redundant closure found
|
error: redundant closure found
|
||||||
--> $DIR/eta.rs:84:65
|
--> $DIR/eta.rs:88:65
|
||||||
|
|
|
|
||||||
LL | let e: std::vec::Vec<char> = vec!['a', 'b', 'c'].iter().map(|c| c.to_ascii_uppercase()).collect();
|
LL | let e: std::vec::Vec<char> = vec!['a', 'b', 'c'].iter().map(|c| c.to_ascii_uppercase()).collect();
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `char::to_ascii_uppercase`
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove closure as shown: `char::to_ascii_uppercase`
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#![allow(clippy::iter_cloned_collect)]
|
#![allow(clippy::iter_cloned_collect)]
|
||||||
#![allow(clippy::clone_on_copy)]
|
#![allow(clippy::clone_on_copy)]
|
||||||
#![allow(clippy::missing_docs_in_private_items)]
|
#![allow(clippy::missing_docs_in_private_items)]
|
||||||
#![allow(clippy::redundant_closure)]
|
#![allow(clippy::redundant_closure_for_method_calls)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _: Vec<i8> = vec![5_i8; 6].iter().cloned().collect();
|
let _: Vec<i8> = vec![5_i8; 6].iter().cloned().collect();
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#![allow(clippy::iter_cloned_collect)]
|
#![allow(clippy::iter_cloned_collect)]
|
||||||
#![allow(clippy::clone_on_copy)]
|
#![allow(clippy::clone_on_copy)]
|
||||||
#![allow(clippy::missing_docs_in_private_items)]
|
#![allow(clippy::missing_docs_in_private_items)]
|
||||||
#![allow(clippy::redundant_closure)]
|
#![allow(clippy::redundant_closure_for_method_calls)]
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let _: Vec<i8> = vec![5_i8; 6].iter().map(|x| *x).collect();
|
let _: Vec<i8> = vec![5_i8; 6].iter().map(|x| *x).collect();
|
||||||
|
Loading…
Reference in New Issue
Block a user