mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
[Clippy] Swap manual_while_let_some
to use diagnostic items instead of paths
This commit is contained in:
parent
15240a93c9
commit
25da0e2e5d
@ -1366,6 +1366,8 @@ symbols! {
|
|||||||
optin_builtin_traits,
|
optin_builtin_traits,
|
||||||
option,
|
option,
|
||||||
option_env,
|
option_env,
|
||||||
|
option_expect,
|
||||||
|
option_unwrap,
|
||||||
options,
|
options,
|
||||||
or,
|
or,
|
||||||
or_patterns,
|
or_patterns,
|
||||||
@ -2092,8 +2094,10 @@ symbols! {
|
|||||||
vec_as_mut_slice,
|
vec_as_mut_slice,
|
||||||
vec_as_slice,
|
vec_as_slice,
|
||||||
vec_from_elem,
|
vec_from_elem,
|
||||||
|
vec_is_empty,
|
||||||
vec_macro,
|
vec_macro,
|
||||||
vec_new,
|
vec_new,
|
||||||
|
vec_pop,
|
||||||
vec_with_capacity,
|
vec_with_capacity,
|
||||||
vecdeque_iter,
|
vecdeque_iter,
|
||||||
version,
|
version,
|
||||||
|
@ -2384,6 +2384,7 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||||||
/// Takes *O*(1) time.
|
/// Takes *O*(1) time.
|
||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[cfg_attr(not(test), rustc_diagnostic_item = "vec_pop")]
|
||||||
pub fn pop(&mut self) -> Option<T> {
|
pub fn pop(&mut self) -> Option<T> {
|
||||||
if self.len == 0 {
|
if self.len == 0 {
|
||||||
None
|
None
|
||||||
@ -2577,6 +2578,7 @@ impl<T, A: Allocator> Vec<T, A> {
|
|||||||
/// assert!(!v.is_empty());
|
/// assert!(!v.is_empty());
|
||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[cfg_attr(not(test), rustc_diagnostic_item = "vec_is_empty")]
|
||||||
pub fn is_empty(&self) -> bool {
|
pub fn is_empty(&self) -> bool {
|
||||||
self.len() == 0
|
self.len() == 0
|
||||||
}
|
}
|
||||||
|
@ -923,6 +923,7 @@ impl<T> Option<T> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[cfg_attr(not(test), rustc_diagnostic_item = "option_expect")]
|
||||||
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
|
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
|
||||||
pub const fn expect(self, msg: &str) -> T {
|
pub const fn expect(self, msg: &str) -> T {
|
||||||
match self {
|
match self {
|
||||||
@ -960,6 +961,7 @@ impl<T> Option<T> {
|
|||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[cfg_attr(not(test), rustc_diagnostic_item = "option_unwrap")]
|
||||||
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
|
#[rustc_const_unstable(feature = "const_option", issue = "67441")]
|
||||||
pub const fn unwrap(self) -> T {
|
pub const fn unwrap(self) -> T {
|
||||||
match self {
|
match self {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
use clippy_utils::diagnostics::span_lint_and_then;
|
use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::source::snippet;
|
use clippy_utils::source::snippet;
|
||||||
use clippy_utils::{match_def_path, paths, SpanlessEq};
|
use clippy_utils::SpanlessEq;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
use rustc_hir::{Expr, ExprKind, Pat, Stmt, StmtKind, UnOp};
|
use rustc_hir::{Expr, ExprKind, Pat, Stmt, StmtKind, UnOp};
|
||||||
use rustc_lint::LateContext;
|
use rustc_lint::LateContext;
|
||||||
use rustc_span::Span;
|
use rustc_span::{sym, Symbol, Span};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
use super::MANUAL_WHILE_LET_SOME;
|
use super::MANUAL_WHILE_LET_SOME;
|
||||||
@ -47,20 +47,20 @@ fn report_lint(cx: &LateContext<'_>, pop_span: Span, pop_stmt_kind: PopStmt<'_>,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn match_method_call(cx: &LateContext<'_>, expr: &Expr<'_>, method: &[&str]) -> bool {
|
fn match_method_call(cx: &LateContext<'_>, expr: &Expr<'_>, method: Symbol) -> bool {
|
||||||
if let ExprKind::MethodCall(..) = expr.kind
|
if let ExprKind::MethodCall(..) = expr.kind
|
||||||
&& let Some(id) = cx.typeck_results().type_dependent_def_id(expr.hir_id)
|
&& let Some(id) = cx.typeck_results().type_dependent_def_id(expr.hir_id)
|
||||||
{
|
{
|
||||||
match_def_path(cx, id, method)
|
cx.tcx.is_diagnostic_item(method, id)
|
||||||
} else {
|
} else {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_vec_pop_unwrap(cx: &LateContext<'_>, expr: &Expr<'_>, is_empty_recv: &Expr<'_>) -> bool {
|
fn is_vec_pop_unwrap(cx: &LateContext<'_>, expr: &Expr<'_>, is_empty_recv: &Expr<'_>) -> bool {
|
||||||
if (match_method_call(cx, expr, &paths::OPTION_UNWRAP) || match_method_call(cx, expr, &paths::OPTION_EXPECT))
|
if (match_method_call(cx, expr, sym::option_unwrap) || match_method_call(cx, expr, sym::option_expect))
|
||||||
&& let ExprKind::MethodCall(_, unwrap_recv, ..) = expr.kind
|
&& let ExprKind::MethodCall(_, unwrap_recv, ..) = expr.kind
|
||||||
&& match_method_call(cx, unwrap_recv, &paths::VEC_POP)
|
&& match_method_call(cx, unwrap_recv, sym::vec_pop)
|
||||||
&& let ExprKind::MethodCall(_, pop_recv, ..) = unwrap_recv.kind
|
&& let ExprKind::MethodCall(_, pop_recv, ..) = unwrap_recv.kind
|
||||||
{
|
{
|
||||||
// make sure they're the same `Vec`
|
// make sure they're the same `Vec`
|
||||||
@ -96,7 +96,7 @@ fn check_call_arguments(cx: &LateContext<'_>, stmt: &Stmt<'_>, is_empty_recv: &E
|
|||||||
pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, full_cond: &'tcx Expr<'_>, body: &'tcx Expr<'_>, loop_span: Span) {
|
pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, full_cond: &'tcx Expr<'_>, body: &'tcx Expr<'_>, loop_span: Span) {
|
||||||
if let ExprKind::Unary(UnOp::Not, cond) = full_cond.kind
|
if let ExprKind::Unary(UnOp::Not, cond) = full_cond.kind
|
||||||
&& let ExprKind::MethodCall(_, is_empty_recv, _, _) = cond.kind
|
&& let ExprKind::MethodCall(_, is_empty_recv, _, _) = cond.kind
|
||||||
&& match_method_call(cx, cond, &paths::VEC_IS_EMPTY)
|
&& match_method_call(cx, cond, sym::vec_is_empty)
|
||||||
&& let ExprKind::Block(body, _) = body.kind
|
&& let ExprKind::Block(body, _) = body.kind
|
||||||
&& let Some(stmt) = body.stmts.first()
|
&& let Some(stmt) = body.stmts.first()
|
||||||
{
|
{
|
||||||
|
@ -73,9 +73,5 @@ pub const TOKIO_IO_OPEN_OPTIONS: [&str; 4] = ["tokio", "fs", "open_options", "Op
|
|||||||
#[expect(clippy::invalid_paths)] // internal lints do not know about all external crates
|
#[expect(clippy::invalid_paths)] // internal lints do not know about all external crates
|
||||||
pub const TOKIO_IO_OPEN_OPTIONS_NEW: [&str; 5] = ["tokio", "fs", "open_options", "OpenOptions", "new"];
|
pub const TOKIO_IO_OPEN_OPTIONS_NEW: [&str; 5] = ["tokio", "fs", "open_options", "OpenOptions", "new"];
|
||||||
pub const INSTANT_NOW: [&str; 4] = ["std", "time", "Instant", "now"];
|
pub const INSTANT_NOW: [&str; 4] = ["std", "time", "Instant", "now"];
|
||||||
pub const VEC_IS_EMPTY: [&str; 4] = ["alloc", "vec", "Vec", "is_empty"];
|
|
||||||
pub const VEC_POP: [&str; 4] = ["alloc", "vec", "Vec", "pop"];
|
|
||||||
pub const WAKER: [&str; 4] = ["core", "task", "wake", "Waker"];
|
pub const WAKER: [&str; 4] = ["core", "task", "wake", "Waker"];
|
||||||
pub const OPTION_UNWRAP: [&str; 4] = ["core", "option", "Option", "unwrap"];
|
|
||||||
pub const OPTION_EXPECT: [&str; 4] = ["core", "option", "Option", "expect"];
|
|
||||||
pub const BOOL_THEN: [&str; 4] = ["core", "bool", "<impl bool>", "then"];
|
pub const BOOL_THEN: [&str; 4] = ["core", "bool", "<impl bool>", "then"];
|
||||||
|
Loading…
Reference in New Issue
Block a user