summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/clippy_lints/src/use_self.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/clippy/clippy_lints/src/use_self.rs')
-rw-r--r--src/tools/clippy/clippy_lints/src/use_self.rs53
1 files changed, 22 insertions, 31 deletions
diff --git a/src/tools/clippy/clippy_lints/src/use_self.rs b/src/tools/clippy/clippy_lints/src/use_self.rs
index c6cdf3f85..4c755d812 100644
--- a/src/tools/clippy/clippy_lints/src/use_self.rs
+++ b/src/tools/clippy/clippy_lints/src/use_self.rs
@@ -1,6 +1,7 @@
use clippy_utils::diagnostics::span_lint_and_sugg;
+use clippy_utils::is_from_proc_macro;
+use clippy_utils::msrvs::{self, Msrv};
use clippy_utils::ty::same_type_and_consts;
-use clippy_utils::{is_from_proc_macro, meets_msrv, msrvs};
use if_chain::if_chain;
use rustc_data_structures::fx::FxHashSet;
use rustc_errors::Applicability;
@@ -14,7 +15,6 @@ use rustc_hir::{
};
use rustc_hir_analysis::hir_ty_to_ty;
use rustc_lint::{LateContext, LateLintPass};
-use rustc_semver::RustcVersion;
use rustc_session::{declare_tool_lint, impl_lint_pass};
use rustc_span::Span;
@@ -30,7 +30,6 @@ declare_clippy_lint! {
///
/// ### Known problems
/// - Unaddressed false negative in fn bodies of trait implementations
- /// - False positive with associated types in traits (#4140)
///
/// ### Example
/// ```rust
@@ -58,13 +57,13 @@ declare_clippy_lint! {
#[derive(Default)]
pub struct UseSelf {
- msrv: Option<RustcVersion>,
+ msrv: Msrv,
stack: Vec<StackItem>,
}
impl UseSelf {
#[must_use]
- pub fn new(msrv: Option<RustcVersion>) -> Self {
+ pub fn new(msrv: Msrv) -> Self {
Self {
msrv,
..Self::default()
@@ -103,6 +102,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
if parameters.as_ref().map_or(true, |params| {
!params.parenthesized && !params.args.iter().any(|arg| matches!(arg, GenericArg::Lifetime(_)))
});
+ if !item.span.from_expansion();
if !is_from_proc_macro(cx, item); // expensive, should be last check
then {
StackItem::Check {
@@ -199,7 +199,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
fn check_ty(&mut self, cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>) {
if_chain! {
if !hir_ty.span.from_expansion();
- if meets_msrv(self.msrv, msrvs::TYPE_ALIAS_ENUM_VARIANTS);
+ if self.msrv.meets(msrvs::TYPE_ALIAS_ENUM_VARIANTS);
if let Some(&StackItem::Check {
impl_id,
in_body,
@@ -228,30 +228,19 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
fn check_expr(&mut self, cx: &LateContext<'_>, expr: &Expr<'_>) {
if_chain! {
if !expr.span.from_expansion();
- if meets_msrv(self.msrv, msrvs::TYPE_ALIAS_ENUM_VARIANTS);
+ if self.msrv.meets(msrvs::TYPE_ALIAS_ENUM_VARIANTS);
if let Some(&StackItem::Check { impl_id, .. }) = self.stack.last();
if cx.typeck_results().expr_ty(expr) == cx.tcx.type_of(impl_id);
then {} else { return; }
}
match expr.kind {
- ExprKind::Struct(QPath::Resolved(_, path), ..) => match path.res {
- Res::SelfTyParam { .. } | Res::SelfTyAlias { .. } => (),
- Res::Def(DefKind::Variant, _) => lint_path_to_variant(cx, path),
- _ => span_lint(cx, path.span),
- },
- // tuple struct instantiation (`Foo(arg)` or `Enum::Foo(arg)`)
+ ExprKind::Struct(QPath::Resolved(_, path), ..) => check_path(cx, path),
ExprKind::Call(fun, _) => {
if let ExprKind::Path(QPath::Resolved(_, path)) = fun.kind {
- if let Res::Def(DefKind::Ctor(ctor_of, _), ..) = path.res {
- match ctor_of {
- CtorOf::Variant => lint_path_to_variant(cx, path),
- CtorOf::Struct => span_lint(cx, path.span),
- }
- }
+ check_path(cx, path);
}
},
- // unit enum variants (`Enum::A`)
- ExprKind::Path(QPath::Resolved(_, path)) => lint_path_to_variant(cx, path),
+ ExprKind::Path(QPath::Resolved(_, path)) => check_path(cx, path),
_ => (),
}
}
@@ -259,7 +248,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
fn check_pat(&mut self, cx: &LateContext<'_>, pat: &Pat<'_>) {
if_chain! {
if !pat.span.from_expansion();
- if meets_msrv(self.msrv, msrvs::TYPE_ALIAS_ENUM_VARIANTS);
+ if self.msrv.meets(msrvs::TYPE_ALIAS_ENUM_VARIANTS);
if let Some(&StackItem::Check { impl_id, .. }) = self.stack.last();
// get the path from the pattern
if let PatKind::Path(QPath::Resolved(_, path))
@@ -267,15 +256,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
| PatKind::Struct(QPath::Resolved(_, path), _, _) = pat.kind;
if cx.typeck_results().pat_ty(pat) == cx.tcx.type_of(impl_id);
then {
- match path.res {
- Res::Def(DefKind::Ctor(ctor_of, _), ..) => match ctor_of {
- CtorOf::Variant => lint_path_to_variant(cx, path),
- CtorOf::Struct => span_lint(cx, path.span),
- },
- Res::Def(DefKind::Variant, ..) => lint_path_to_variant(cx, path),
- Res::Def(DefKind::Struct, ..) => span_lint(cx, path.span),
- _ => ()
- }
+ check_path(cx, path);
}
}
}
@@ -313,6 +294,16 @@ fn span_lint(cx: &LateContext<'_>, span: Span) {
);
}
+fn check_path(cx: &LateContext<'_>, path: &Path<'_>) {
+ match path.res {
+ Res::Def(DefKind::Ctor(CtorOf::Variant, _) | DefKind::Variant, ..) => {
+ lint_path_to_variant(cx, path);
+ },
+ Res::Def(DefKind::Ctor(CtorOf::Struct, _) | DefKind::Struct, ..) => span_lint(cx, path.span),
+ _ => (),
+ }
+}
+
fn lint_path_to_variant(cx: &LateContext<'_>, path: &Path<'_>) {
if let [.., self_seg, _variant] = path.segments {
let span = path