[Clippy] Swap VecArgs::hir to use diagnostic items instead of paths

This commit is contained in:
GnomedDev 2024-09-18 21:42:38 +01:00
parent 28f4c8293a
commit 846ae57fc1
No known key found for this signature in database
GPG Key ID: 9BF10F8372B254D1
6 changed files with 11 additions and 8 deletions

View File

@ -1836,6 +1836,7 @@ symbols! {
slice, slice,
slice_from_raw_parts, slice_from_raw_parts,
slice_from_raw_parts_mut, slice_from_raw_parts_mut,
slice_into_vec,
slice_iter, slice_iter,
slice_len_fn, slice_len_fn,
slice_patterns, slice_patterns,
@ -2090,7 +2091,9 @@ symbols! {
vec, vec,
vec_as_mut_slice, vec_as_mut_slice,
vec_as_slice, vec_as_slice,
vec_from_elem,
vec_macro, vec_macro,
vec_new,
vecdeque_iter, vecdeque_iter,
version, version,
vfp2, vfp2,

View File

@ -496,6 +496,7 @@ impl<T> [T] {
#[rustc_allow_incoherent_impl] #[rustc_allow_incoherent_impl]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[inline] #[inline]
#[cfg_attr(not(test), rustc_diagnostic_item = "slice_into_vec")]
pub fn into_vec<A: Allocator>(self: Box<Self, A>) -> Vec<T, A> { pub fn into_vec<A: Allocator>(self: Box<Self, A>) -> Vec<T, A> {
// N.B., see the `hack` module in this file for more details. // N.B., see the `hack` module in this file for more details.
hack::into_vec(self) hack::into_vec(self)

View File

@ -416,6 +416,7 @@ impl<T> Vec<T> {
/// ``` /// ```
#[inline] #[inline]
#[rustc_const_stable(feature = "const_vec_new", since = "1.39.0")] #[rustc_const_stable(feature = "const_vec_new", since = "1.39.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "vec_new")]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[must_use] #[must_use]
pub const fn new() -> Self { pub const fn new() -> Self {
@ -3046,6 +3047,7 @@ impl<T: PartialEq, A: Allocator> Vec<T, A> {
#[doc(hidden)] #[doc(hidden)]
#[cfg(not(no_global_oom_handling))] #[cfg(not(no_global_oom_handling))]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "vec_from_elem")]
pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> { pub fn from_elem<T: Clone>(elem: T, n: usize) -> Vec<T> {
<T as SpecFromElem>::from_elem(elem, n, Global) <T as SpecFromElem>::from_elem(elem, n, Global)
} }

View File

@ -153,7 +153,7 @@ impl SlowVectorInit {
&& is_expr_path_def_path(cx, func, &paths::VEC_WITH_CAPACITY) && is_expr_path_def_path(cx, func, &paths::VEC_WITH_CAPACITY)
{ {
Some(InitializedSize::Initialized(len_expr)) Some(InitializedSize::Initialized(len_expr))
} else if matches!(expr.kind, ExprKind::Call(func, _) if is_expr_path_def_path(cx, func, &paths::VEC_NEW)) { } else if matches!(expr.kind, ExprKind::Call(func, _) if is_path_diagnostic_item(cx, func, sym::vec_new)) {
Some(InitializedSize::Uninitialized) Some(InitializedSize::Uninitialized)
} else { } else {
None None

View File

@ -4,7 +4,7 @@
use crate::consts::{ConstEvalCtxt, Constant}; use crate::consts::{ConstEvalCtxt, Constant};
use crate::ty::is_type_diagnostic_item; use crate::ty::is_type_diagnostic_item;
use crate::{is_expn_of, match_def_path, paths}; use crate::is_expn_of;
use rustc_ast::ast; use rustc_ast::ast;
use rustc_hir as hir; use rustc_hir as hir;
@ -297,10 +297,10 @@ impl<'a> VecArgs<'a> {
&& is_expn_of(fun.span, "vec").is_some() && is_expn_of(fun.span, "vec").is_some()
&& let Some(fun_def_id) = cx.qpath_res(qpath, fun.hir_id).opt_def_id() && let Some(fun_def_id) = cx.qpath_res(qpath, fun.hir_id).opt_def_id()
{ {
return if match_def_path(cx, fun_def_id, &paths::VEC_FROM_ELEM) && args.len() == 2 { return if cx.tcx.is_diagnostic_item(sym::vec_from_elem, fun_def_id) && args.len() == 2 {
// `vec![elem; size]` case // `vec![elem; size]` case
Some(VecArgs::Repeat(&args[0], &args[1])) Some(VecArgs::Repeat(&args[0], &args[1]))
} else if match_def_path(cx, fun_def_id, &paths::SLICE_INTO_VEC) && args.len() == 1 { } else if cx.tcx.is_diagnostic_item(sym::slice_into_vec, fun_def_id) && args.len() == 1 {
// `vec![a, b, c]` case // `vec![a, b, c]` case
if let ExprKind::Call(_, [arg]) = &args[0].kind if let ExprKind::Call(_, [arg]) = &args[0].kind
&& let ExprKind::Array(args) = arg.kind && let ExprKind::Array(args) = arg.kind
@ -309,7 +309,7 @@ impl<'a> VecArgs<'a> {
} else { } else {
None None
} }
} else if match_def_path(cx, fun_def_id, &paths::VEC_NEW) && args.is_empty() { } else if cx.tcx.is_diagnostic_item(sym::vec_new, fun_def_id) && args.is_empty() {
Some(VecArgs::Vec(&[])) Some(VecArgs::Vec(&[]))
} else { } else {
None None

View File

@ -49,7 +49,6 @@ pub const REGEX_NEW: [&str; 3] = ["regex", "Regex", "new"];
pub const REGEX_SET_NEW: [&str; 3] = ["regex", "RegexSet", "new"]; pub const REGEX_SET_NEW: [&str; 3] = ["regex", "RegexSet", "new"];
pub const SERDE_DESERIALIZE: [&str; 3] = ["serde", "de", "Deserialize"]; pub const SERDE_DESERIALIZE: [&str; 3] = ["serde", "de", "Deserialize"];
pub const SERDE_DE_VISITOR: [&str; 3] = ["serde", "de", "Visitor"]; pub const SERDE_DE_VISITOR: [&str; 3] = ["serde", "de", "Visitor"];
pub const SLICE_INTO_VEC: [&str; 4] = ["alloc", "slice", "<impl [T]>", "into_vec"];
pub const STD_IO_SEEK_FROM_CURRENT: [&str; 4] = ["std", "io", "SeekFrom", "Current"]; pub const STD_IO_SEEK_FROM_CURRENT: [&str; 4] = ["std", "io", "SeekFrom", "Current"];
pub const STD_IO_SEEKFROM_START: [&str; 4] = ["std", "io", "SeekFrom", "Start"]; pub const STD_IO_SEEKFROM_START: [&str; 4] = ["std", "io", "SeekFrom", "Start"];
pub const STRING_NEW: [&str; 4] = ["alloc", "string", "String", "new"]; pub const STRING_NEW: [&str; 4] = ["alloc", "string", "String", "new"];
@ -73,8 +72,6 @@ pub const TOKIO_IO_ASYNCWRITEEXT: [&str; 5] = ["tokio", "io", "util", "async_wri
pub const TOKIO_IO_OPEN_OPTIONS: [&str; 4] = ["tokio", "fs", "open_options", "OpenOptions"]; pub const TOKIO_IO_OPEN_OPTIONS: [&str; 4] = ["tokio", "fs", "open_options", "OpenOptions"];
#[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 VEC_FROM_ELEM: [&str; 3] = ["alloc", "vec", "from_elem"];
pub const VEC_NEW: [&str; 4] = ["alloc", "vec", "Vec", "new"];
pub const VEC_WITH_CAPACITY: [&str; 4] = ["alloc", "vec", "Vec", "with_capacity"]; pub const VEC_WITH_CAPACITY: [&str; 4] = ["alloc", "vec", "Vec", "with_capacity"];
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_IS_EMPTY: [&str; 4] = ["alloc", "vec", "Vec", "is_empty"];