[Clippy] Remove final std paths for diagnostic item
This commit is contained in:
parent
976487c48b
commit
98e68e5040
@ -309,6 +309,7 @@
|
|||||||
RwLockReadGuard,
|
RwLockReadGuard,
|
||||||
RwLockWriteGuard,
|
RwLockWriteGuard,
|
||||||
Saturating,
|
Saturating,
|
||||||
|
SeekFrom,
|
||||||
Send,
|
Send,
|
||||||
SeqCst,
|
SeqCst,
|
||||||
Sized,
|
Sized,
|
||||||
|
@ -2058,6 +2058,7 @@ fn seek_relative(&mut self, offset: i64) -> Result<()> {
|
|||||||
/// It is used by the [`Seek`] trait.
|
/// It is used by the [`Seek`] trait.
|
||||||
#[derive(Copy, PartialEq, Eq, Clone, Debug)]
|
#[derive(Copy, PartialEq, Eq, Clone, Debug)]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
#[cfg_attr(not(test), rustc_diagnostic_item = "SeekFrom")]
|
||||||
pub enum SeekFrom {
|
pub enum SeekFrom {
|
||||||
/// Sets the offset to the provided number of bytes.
|
/// Sets the offset to the provided number of bytes.
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
use clippy_utils::diagnostics::span_lint_and_sugg;
|
use clippy_utils::diagnostics::span_lint_and_sugg;
|
||||||
use clippy_utils::source::snippet_with_applicability;
|
use clippy_utils::source::snippet_with_applicability;
|
||||||
use clippy_utils::ty::implements_trait;
|
use clippy_utils::ty::implements_trait;
|
||||||
use clippy_utils::{match_def_path, paths};
|
use clippy_utils::is_enum_variant_ctor;
|
||||||
|
|
||||||
use super::SEEK_FROM_CURRENT;
|
use super::SEEK_FROM_CURRENT;
|
||||||
|
|
||||||
@ -36,8 +36,8 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, recv: &'
|
|||||||
fn arg_is_seek_from_current<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) -> bool {
|
fn arg_is_seek_from_current<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) -> bool {
|
||||||
if let ExprKind::Call(f, args) = expr.kind
|
if let ExprKind::Call(f, args) = expr.kind
|
||||||
&& let ExprKind::Path(ref path) = f.kind
|
&& let ExprKind::Path(ref path) = f.kind
|
||||||
&& let Some(def_id) = cx.qpath_res(path, f.hir_id).opt_def_id()
|
&& let Some(ctor_call_id) = cx.qpath_res(path, f.hir_id).opt_def_id()
|
||||||
&& match_def_path(cx, def_id, &paths::STD_IO_SEEK_FROM_CURRENT)
|
&& is_enum_variant_ctor(cx, sym::SeekFrom, sym!(Current), ctor_call_id)
|
||||||
{
|
{
|
||||||
// check if argument of `SeekFrom::Current` is `0`
|
// check if argument of `SeekFrom::Current` is `0`
|
||||||
if args.len() == 1
|
if args.len() == 1
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use clippy_utils::diagnostics::span_lint_and_then;
|
use clippy_utils::diagnostics::span_lint_and_then;
|
||||||
use clippy_utils::ty::implements_trait;
|
use clippy_utils::ty::implements_trait;
|
||||||
use clippy_utils::{is_expr_used_or_unified, match_def_path, paths};
|
use clippy_utils::{is_expr_used_or_unified, is_enum_variant_ctor};
|
||||||
use rustc_ast::ast::{LitIntType, LitKind};
|
use rustc_ast::ast::{LitIntType, LitKind};
|
||||||
use rustc_data_structures::packed::Pu128;
|
use rustc_data_structures::packed::Pu128;
|
||||||
use rustc_errors::Applicability;
|
use rustc_errors::Applicability;
|
||||||
@ -28,8 +28,8 @@ pub(super) fn check<'tcx>(
|
|||||||
&& implements_trait(cx, ty, seek_trait_id, &[])
|
&& implements_trait(cx, ty, seek_trait_id, &[])
|
||||||
&& let ExprKind::Call(func, args1) = arg.kind
|
&& let ExprKind::Call(func, args1) = arg.kind
|
||||||
&& let ExprKind::Path(ref path) = func.kind
|
&& let ExprKind::Path(ref path) = func.kind
|
||||||
&& let Some(def_id) = cx.qpath_res(path, func.hir_id).opt_def_id()
|
&& let Some(ctor_call_id) = cx.qpath_res(path, func.hir_id).opt_def_id()
|
||||||
&& match_def_path(cx, def_id, &paths::STD_IO_SEEKFROM_START)
|
&& is_enum_variant_ctor(cx, sym::SeekFrom, sym!(Start), ctor_call_id)
|
||||||
&& args1.len() == 1
|
&& args1.len() == 1
|
||||||
&& let ExprKind::Lit(lit) = args1[0].kind
|
&& let ExprKind::Lit(lit) = args1[0].kind
|
||||||
&& let LitKind::Int(Pu128(0), LitIntType::Unsuffixed) = lit.node
|
&& let LitKind::Int(Pu128(0), LitIntType::Unsuffixed) = lit.node
|
||||||
|
@ -263,24 +263,18 @@ pub fn is_res_lang_ctor(cx: &LateContext<'_>, res: Res, lang_item: LangItem) ->
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_res_diagnostic_ctor(cx: &LateContext<'_>, res: Res, diag_item: Symbol) -> bool {
|
|
||||||
if let Res::Def(DefKind::Ctor(..), id) = res
|
|
||||||
&& let Some(id) = cx.tcx.opt_parent(id)
|
|
||||||
{
|
|
||||||
cx.tcx.is_diagnostic_item(diag_item, id)
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Checks if a `QPath` resolves to a constructor of a diagnostic item.
|
/// Checks if `{ctor_call_id}(...)` is `{enum_item}::{variant_name}(...)`.
|
||||||
pub fn is_diagnostic_ctor(cx: &LateContext<'_>, qpath: &QPath<'_>, diagnostic_item: Symbol) -> bool {
|
pub fn is_enum_variant_ctor(cx: &LateContext<'_>, enum_item: Symbol, variant_name: Symbol, ctor_call_id: DefId) -> bool {
|
||||||
if let QPath::Resolved(_, path) = qpath {
|
let Some(enum_def_id) = cx.tcx.get_diagnostic_item(enum_item) else {
|
||||||
if let Res::Def(DefKind::Ctor(..), ctor_id) = path.res {
|
return false;
|
||||||
return cx.tcx.is_diagnostic_item(diagnostic_item, cx.tcx.parent(ctor_id));
|
};
|
||||||
}
|
|
||||||
}
|
let variants = cx.tcx.adt_def(enum_def_id).variants().iter();
|
||||||
false
|
variants
|
||||||
|
.filter(|variant| variant.name == variant_name)
|
||||||
|
.filter_map(|variant| variant.ctor.as_ref())
|
||||||
|
.any(|(_, ctor_def_id)| *ctor_def_id == ctor_call_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Checks if the `DefId` matches the given diagnostic item or it's constructor.
|
/// Checks if the `DefId` matches the given diagnostic item or it's constructor.
|
||||||
|
@ -29,8 +29,7 @@
|
|||||||
pub const SYNTAX_CONTEXT: [&str; 3] = ["rustc_span", "hygiene", "SyntaxContext"];
|
pub const SYNTAX_CONTEXT: [&str; 3] = ["rustc_span", "hygiene", "SyntaxContext"];
|
||||||
|
|
||||||
// Paths in `core`/`alloc`/`std`. This should be avoided and cleaned up by adding diagnostic items.
|
// Paths in `core`/`alloc`/`std`. This should be avoided and cleaned up by adding diagnostic items.
|
||||||
pub const STD_IO_SEEK_FROM_CURRENT: [&str; 4] = ["std", "io", "SeekFrom", "Current"];
|
// ... none currently!
|
||||||
pub const STD_IO_SEEKFROM_START: [&str; 4] = ["std", "io", "SeekFrom", "Start"];
|
|
||||||
|
|
||||||
// Paths in clippy itself
|
// Paths in clippy itself
|
||||||
pub const MSRV: [&str; 3] = ["clippy_config", "msrvs", "Msrv"];
|
pub const MSRV: [&str; 3] = ["clippy_config", "msrvs", "Msrv"];
|
||||||
|
Loading…
Reference in New Issue
Block a user