mirror of
https://github.com/rust-lang/rust-clippy
synced 2024-11-23 05:03:21 +00:00
re-implement fix for rust-lang#11357
This commit is contained in:
parent
5ba6480f02
commit
1661e7ee76
4 changed files with 67 additions and 22 deletions
|
@ -4,8 +4,8 @@ use clippy_utils::get_parent_expr;
|
|||
use clippy_utils::sugg::Sugg;
|
||||
use rustc_errors::Applicability;
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::intravisit as hir_visit;
|
||||
use rustc_hir::intravisit::{Visitor as HirVisitor, Visitor};
|
||||
use rustc_hir::{intravisit as hir_visit, CoroutineKind, CoroutineSource};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
|
@ -60,11 +60,14 @@ impl<'tcx> Visitor<'tcx> for ReturnVisitor {
|
|||
}
|
||||
}
|
||||
|
||||
/// Checks if the body is owned by an async closure
|
||||
fn is_async_closure(body: &hir::Body<'_>) -> bool {
|
||||
if let hir::ExprKind::Closure(closure) = body.value.kind
|
||||
&& let [resume_ty] = closure.fn_decl.inputs
|
||||
&& let hir::TyKind::Path(hir::QPath::LangItem(hir::LangItem::ResumeTy, ..)) = resume_ty.kind
|
||||
/// Checks if the body is owned by an async closure.
|
||||
/// Returns true for `async || whatever_expression`, but false for `|| async { whatever_expression
|
||||
/// }`.
|
||||
fn is_async_closure(cx: &LateContext<'_>, body: &hir::Body<'_>) -> bool {
|
||||
if let hir::ExprKind::Closure(innermost_closure_generated_by_desugar) = body.value.kind
|
||||
&& let desugared_inner_closure_body = cx.tcx.hir().body(innermost_closure_generated_by_desugar.body)
|
||||
// checks whether it is `async || whatever_expression`
|
||||
&& let Some(CoroutineKind::Async(CoroutineSource::Closure)) = desugared_inner_closure_body.coroutine_kind
|
||||
{
|
||||
true
|
||||
} else {
|
||||
|
@ -100,7 +103,7 @@ fn find_innermost_closure<'tcx>(
|
|||
data = Some((
|
||||
body.value,
|
||||
closure.fn_decl,
|
||||
if is_async_closure(body) {
|
||||
if is_async_closure(cx, body) {
|
||||
ty::Asyncness::Yes
|
||||
} else {
|
||||
ty::Asyncness::No
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#![allow(clippy::redundant_async_block)]
|
||||
#![allow(clippy::type_complexity)]
|
||||
#![allow(unused)]
|
||||
#![allow(clippy::double_parens)]
|
||||
|
||||
async fn something() -> u32 {
|
||||
21
|
||||
|
@ -84,3 +85,17 @@ fn issue9956() {
|
|||
bar()(42, 5);
|
||||
foo(42, 5);
|
||||
}
|
||||
|
||||
async fn issue11357() {
|
||||
(async {}).await;
|
||||
}
|
||||
|
||||
mod issue11707 {
|
||||
use core::future::Future;
|
||||
|
||||
fn spawn_on(fut: impl Future<Output = ()>) {}
|
||||
|
||||
fn demo() {
|
||||
spawn_on((async move {}));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#![allow(clippy::redundant_async_block)]
|
||||
#![allow(clippy::type_complexity)]
|
||||
#![allow(unused)]
|
||||
#![allow(clippy::double_parens)]
|
||||
|
||||
async fn something() -> u32 {
|
||||
21
|
||||
|
@ -84,3 +85,17 @@ fn issue9956() {
|
|||
bar()((|| || 42)()(), 5);
|
||||
foo((|| || 42)()(), 5);
|
||||
}
|
||||
|
||||
async fn issue11357() {
|
||||
(|| async {})().await;
|
||||
}
|
||||
|
||||
mod issue11707 {
|
||||
use core::future::Future;
|
||||
|
||||
fn spawn_on(fut: impl Future<Output = ()>) {}
|
||||
|
||||
fn demo() {
|
||||
spawn_on(((|| async move {})()));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:16:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:17:13
|
||||
|
|
||||
LL | let a = (|| 42)();
|
||||
| ^^^^^^^^^ help: try doing something like: `42`
|
||||
|
@ -8,7 +8,7 @@ LL | let a = (|| 42)();
|
|||
= help: to override `-D warnings` add `#[allow(clippy::redundant_closure_call)]`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:17:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:18:13
|
||||
|
|
||||
LL | let b = (async || {
|
||||
| _____________^
|
||||
|
@ -28,7 +28,7 @@ LL ~ };
|
|||
|
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:22:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:23:13
|
||||
|
|
||||
LL | let c = (|| {
|
||||
| _____________^
|
||||
|
@ -48,13 +48,13 @@ LL ~ };
|
|||
|
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:27:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:28:13
|
||||
|
|
||||
LL | let d = (async || something().await)();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try doing something like: `async { something().await }`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:36:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:37:13
|
||||
|
|
||||
LL | (|| m!())()
|
||||
| ^^^^^^^^^^^ help: try doing something like: `m!()`
|
||||
|
@ -65,7 +65,7 @@ LL | m2!();
|
|||
= note: this error originates in the macro `m2` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:31:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:32:13
|
||||
|
|
||||
LL | (|| 0)()
|
||||
| ^^^^^^^^ help: try doing something like: `0`
|
||||
|
@ -76,52 +76,64 @@ LL | m2!();
|
|||
= note: this error originates in the macro `m` which comes from the expansion of the macro `m2` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:44:16
|
||||
--> $DIR/redundant_closure_call_fixable.rs:45:16
|
||||
|
|
||||
LL | assert_eq!((|| || 43)()(), 42);
|
||||
| ^^^^^^^^^^^^^^ help: try doing something like: `43`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:53:10
|
||||
--> $DIR/redundant_closure_call_fixable.rs:54:10
|
||||
|
|
||||
LL | dbg!((|| 42)());
|
||||
| ^^^^^^^^^ help: try doing something like: `42`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:56:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:57:13
|
||||
|
|
||||
LL | let a = (|| || || 123)();
|
||||
| ^^^^^^^^^^^^^^^^ help: try doing something like: `(|| || 123)`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:60:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:61:13
|
||||
|
|
||||
LL | let a = (|| || || || async || 1)()()()()();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try doing something like: `async { 1 }`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:69:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:70:13
|
||||
|
|
||||
LL | let a = (|| echo!(|| echo!(|| 1)))()()();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try doing something like: `1`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:71:13
|
||||
--> $DIR/redundant_closure_call_fixable.rs:72:13
|
||||
|
|
||||
LL | let a = (|| echo!((|| 123)))()();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^ help: try doing something like: `123`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:84:11
|
||||
--> $DIR/redundant_closure_call_fixable.rs:85:11
|
||||
|
|
||||
LL | bar()((|| || 42)()(), 5);
|
||||
| ^^^^^^^^^^^^^^ help: try doing something like: `42`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:85:9
|
||||
--> $DIR/redundant_closure_call_fixable.rs:86:9
|
||||
|
|
||||
LL | foo((|| || 42)()(), 5);
|
||||
| ^^^^^^^^^^^^^^ help: try doing something like: `42`
|
||||
|
||||
error: aborting due to 14 previous errors
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:90:5
|
||||
|
|
||||
LL | (|| async {})().await;
|
||||
| ^^^^^^^^^^^^^^^ help: try doing something like: `(async {})`
|
||||
|
||||
error: try not to call a closure in the expression where it is declared
|
||||
--> $DIR/redundant_closure_call_fixable.rs:99:18
|
||||
|
|
||||
LL | spawn_on(((|| async move {})()));
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ help: try doing something like: `(async move {})`
|
||||
|
||||
error: aborting due to 16 previous errors
|
||||
|
||||
|
|
Loading…
Reference in a new issue