Skip to content

Commit 3fc960d

Browse files
committed
Fix internal lint checking match_type uses
* Check for `is_item` instead * Check consts and statics from external crates * Check for lang items * Check for inherent functions which have the same name as a field
1 parent dd8070d commit 3fc960d

24 files changed

+406
-239
lines changed

clippy_lints/src/drop_forget_ref.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use clippy_utils::diagnostics::span_lint_and_note;
2+
use clippy_utils::is_any_item;
23
use clippy_utils::ty::is_copy;
3-
use clippy_utils::{is_any_item, paths};
44
use rustc_hir::{Expr, ExprKind};
55
use rustc_lint::{LateContext, LateLintPass};
66
use rustc_session::{declare_lint_pass, declare_tool_lint};
7+
use rustc_span::sym;
78

89
declare_clippy_lint! {
910
/// ### What it does
@@ -116,7 +117,7 @@ impl<'tcx> LateLintPass<'tcx> for DropForgetRef {
116117
if !(arg_ty.is_ref() || is_copy(cx, arg_ty)) {
117118
return;
118119
}
119-
let (lint, msg) = match is_any_item(cx, path, &[paths::DROP.as_slice(), paths::MEM_FORGET.as_slice()]) {
120+
let (lint, msg) = match is_any_item(cx, path, &[sym::mem_drop, sym::mem_forget]) {
120121
Some(0) if arg_ty.is_ref() => (DROP_REF, DROP_REF_SUMMARY.to_string()),
121122
Some(0) => (DROP_COPY, DROP_COPY_SUMMARY.to_string()),
122123
Some(1) if arg_ty.is_ref() => (FORGET_REF, FORGET_REF_SUMMARY.to_string()),

clippy_lints/src/duration_subsec.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ use rustc_errors::Applicability;
55
use rustc_hir::{BinOpKind, Expr, ExprKind};
66
use rustc_lint::{LateContext, LateLintPass};
77
use rustc_session::{declare_lint_pass, declare_tool_lint};
8-
use rustc_span::source_map::Spanned;
8+
use rustc_span::{source_map::Spanned, sym};
99

1010
use clippy_utils::consts::{constant, Constant};
1111
use clippy_utils::diagnostics::span_lint_and_sugg;
12-
use clippy_utils::paths;
1312

1413
declare_clippy_lint! {
1514
/// ### What it does
@@ -44,8 +43,8 @@ impl<'tcx> LateLintPass<'tcx> for DurationSubsec {
4443
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
4544
if_chain! {
4645
if let ExprKind::Binary(Spanned { node: BinOpKind::Div, .. }, left, right) = expr.kind;
47-
if let ExprKind::MethodCall(method_path, _ , args, _) = left.kind;
48-
if is_item(cx, cx.typeck_results().expr_ty(&args[0]).peel_refs(), &paths::DURATION);
46+
if let ExprKind::MethodCall(method_path, _ , [self_arg], _) = left.kind;
47+
if is_item(cx, cx.typeck_results().expr_ty(self_arg).peel_refs(), sym::Duration);
4948
if let Some((Constant::Int(divisor), _)) = constant(cx, cx.typeck_results(), right);
5049
then {
5150
let suggested_fn = match (method_path.ident.as_str().as_ref(), divisor) {
@@ -62,7 +61,7 @@ impl<'tcx> LateLintPass<'tcx> for DurationSubsec {
6261
"try",
6362
format!(
6463
"{}.{}()",
65-
snippet_with_applicability(cx, args[0].span, "_", &mut applicability),
64+
snippet_with_applicability(cx, self_arg.span, "_", &mut applicability),
6665
suggested_fn
6766
),
6867
applicability,

clippy_lints/src/infinite_iter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ fn is_infinite(cx: &LateContext<'_>, expr: &Expr<'_>) -> Finiteness {
165165
},
166166
ExprKind::Block(block, _) => block.expr.as_ref().map_or(Finite, |e| is_infinite(cx, e)),
167167
ExprKind::Box(e) | ExprKind::AddrOf(BorrowKind::Ref, _, e) => is_infinite(cx, e),
168-
ExprKind::Call(path, _) => is_item(cx, path, &paths::ITER_REPEAT).into(),
168+
ExprKind::Call(path, _) => is_item(cx, path, sym::iter_repeat).into(),
169169
ExprKind::Struct(..) => higher::Range::hir(expr).map_or(false, |r| r.end.is_none()).into(),
170170
_ => Finite,
171171
}

clippy_lints/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -520,9 +520,9 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
520520
#[cfg(feature = "internal-lints")]
521521
utils::internal_lints::INVALID_PATHS,
522522
#[cfg(feature = "internal-lints")]
523-
utils::internal_lints::LINT_WITHOUT_LINT_PASS,
523+
utils::internal_lints::IS_ITEM_DEF_PATH_ON_DIAGNOSTIC_OR_LANG_ITEM,
524524
#[cfg(feature = "internal-lints")]
525-
utils::internal_lints::MATCH_TYPE_ON_DIAGNOSTIC_ITEM,
525+
utils::internal_lints::LINT_WITHOUT_LINT_PASS,
526526
#[cfg(feature = "internal-lints")]
527527
utils::internal_lints::OUTER_EXPN_EXPN_DATA,
528528
#[cfg(feature = "internal-lints")]
@@ -1171,8 +1171,8 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
11711171
LintId::of(utils::internal_lints::IF_CHAIN_STYLE),
11721172
LintId::of(utils::internal_lints::INTERNING_DEFINED_SYMBOL),
11731173
LintId::of(utils::internal_lints::INVALID_PATHS),
1174+
LintId::of(utils::internal_lints::IS_ITEM_DEF_PATH_ON_DIAGNOSTIC_OR_LANG_ITEM),
11741175
LintId::of(utils::internal_lints::LINT_WITHOUT_LINT_PASS),
1175-
LintId::of(utils::internal_lints::MATCH_TYPE_ON_DIAGNOSTIC_ITEM),
11761176
LintId::of(utils::internal_lints::OUTER_EXPN_EXPN_DATA),
11771177
LintId::of(utils::internal_lints::PRODUCE_ICE),
11781178
LintId::of(utils::internal_lints::UNNECESSARY_SYMBOL_STR),
@@ -1847,7 +1847,7 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
18471847
store.register_late_pass(|| Box::new(utils::internal_lints::InvalidPaths));
18481848
store.register_late_pass(|| Box::new(utils::internal_lints::InterningDefinedSymbol::default()));
18491849
store.register_late_pass(|| Box::new(utils::internal_lints::LintWithoutLintPass::default()));
1850-
store.register_late_pass(|| Box::new(utils::internal_lints::MatchTypeOnDiagItem));
1850+
store.register_late_pass(|| Box::new(utils::internal_lints::IsItemDefPath));
18511851
store.register_late_pass(|| Box::new(utils::internal_lints::OuterExpnDataPass));
18521852
}
18531853

clippy_lints/src/mem_discriminant.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
2+
use clippy_utils::is_item;
23
use clippy_utils::source::snippet;
34
use clippy_utils::ty::walk_ptrs_ty_depth;
4-
use clippy_utils::{is_item, paths};
55
use if_chain::if_chain;
66
use rustc_errors::Applicability;
77
use rustc_hir::{BorrowKind, Expr, ExprKind};
88
use rustc_lint::{LateContext, LateLintPass};
99
use rustc_session::{declare_lint_pass, declare_tool_lint};
10+
use rustc_span::sym;
1011

1112
declare_clippy_lint! {
1213
/// ### What it does
@@ -35,7 +36,7 @@ impl<'tcx> LateLintPass<'tcx> for MemDiscriminant {
3536
if_chain! {
3637
if let ExprKind::Call(func, func_args) = expr.kind;
3738
// is `mem::discriminant`
38-
if is_item(cx, func, &paths::MEM_DISCRIMINANT);
39+
if is_item(cx, func, sym::mem_discriminant);
3940
// type is non-enum
4041
let ty_param = cx.typeck_results().node_substs(func.hir_id).type_at(0);
4142
if !ty_param.is_enum();

clippy_lints/src/mem_forget.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
use clippy_utils::diagnostics::span_lint;
2-
use clippy_utils::{is_item, paths};
2+
use clippy_utils::is_item;
33
use rustc_hir::{Expr, ExprKind};
44
use rustc_lint::{LateContext, LateLintPass};
55
use rustc_session::{declare_lint_pass, declare_tool_lint};
6+
use rustc_span::sym;
67

78
declare_clippy_lint! {
89
/// ### What it does
@@ -29,7 +30,7 @@ declare_lint_pass!(MemForget => [MEM_FORGET]);
2930
impl<'tcx> LateLintPass<'tcx> for MemForget {
3031
fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) {
3132
if let ExprKind::Call(path_expr, [ref first_arg, ..]) = e.kind {
32-
if is_item(cx, path_expr, &paths::MEM_FORGET) {
33+
if is_item(cx, path_expr, sym::mem_forget) {
3334
let forgot_ty = cx.typeck_results().expr_ty(first_arg);
3435
if forgot_ty.ty_adt_def().map_or(false, |def| def.has_dtor(cx.tcx)) {
3536
span_lint(cx, MEM_FORGET, e.span, "usage of `mem::forget` on `Drop` type");

clippy_lints/src/mem_replace.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::{span_lint_and_help, span_lint_and_sugg, span_lint_and_then};
22
use clippy_utils::source::{snippet, snippet_with_applicability};
33
use clippy_utils::ty::is_non_aggregate_primitive_type;
4-
use clippy_utils::{in_macro, is_default_equivalent, is_item, is_lang_ctor, meets_msrv, msrvs, paths};
4+
use clippy_utils::{in_macro, is_default_equivalent, is_item, is_lang_ctor, meets_msrv, msrvs};
55
use if_chain::if_chain;
66
use rustc_errors::Applicability;
77
use rustc_hir::LangItem::OptionNone;
@@ -244,7 +244,7 @@ impl<'tcx> LateLintPass<'tcx> for MemReplace {
244244
if_chain! {
245245
// Check that `expr` is a call to `mem::replace()`
246246
if let ExprKind::Call(func, [dest, src]) = expr.kind;
247-
if is_item(cx, func, &paths::MEM_REPLACE);
247+
if is_item(cx, func, sym::mem_replace);
248248
then {
249249
check_replace_option_with_none(cx, src, dest, expr.span);
250250
check_replace_with_uninit(cx, src, dest, expr.span);

clippy_lints/src/methods/filetype_is_file.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
use clippy_utils::diagnostics::span_lint_and_help;
2-
use clippy_utils::{get_parent_expr, is_item, paths};
2+
use clippy_utils::{get_parent_expr, is_item};
33
use if_chain::if_chain;
44
use rustc_hir as hir;
55
use rustc_lint::LateContext;
66
use rustc_span::source_map::Span;
7+
use rustc_span::sym;
78

89
use super::FILETYPE_IS_FILE;
910

1011
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) {
1112
let ty = cx.typeck_results().expr_ty(recv);
1213

13-
if !is_item(cx, ty, &paths::FILE_TYPE) {
14+
if !is_item(cx, ty, sym::FileType) {
1415
return;
1516
}
1617

clippy_lints/src/methods/inefficient_to_string.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::source::snippet_with_applicability;
33
use clippy_utils::ty::walk_ptrs_ty_depth;
4-
use clippy_utils::{is_item, paths};
4+
use clippy_utils::{is_any_item, is_item, paths};
55
use if_chain::if_chain;
66
use rustc_errors::Applicability;
77
use rustc_hir as hir;
@@ -50,11 +50,13 @@ pub fn check<'tcx>(cx: &LateContext<'tcx>, expr: &hir::Expr<'_>, method_name: Sy
5050
/// Returns whether `ty` specializes `ToString`.
5151
/// Currently, these are `str`, `String`, and `Cow<'_, str>`.
5252
fn specializes_tostring(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
53-
if ty.is_str() || is_item(cx, ty, sym::string_type) {
54-
true
55-
} else if let ty::Adt(adt, substs) = ty.kind() {
56-
is_item(cx, adt.did, &paths::COW) && substs.type_at(1).is_str()
57-
} else {
58-
false
53+
match *ty.kind() {
54+
ty::Str => true,
55+
ty::Adt(adt, subs) => match is_any_item(cx, adt.did, &[sym::string_type, sym::Cow]) {
56+
Some(0) => true,
57+
Some(1) => subs.type_at(1).is_str(),
58+
_ => false,
59+
},
60+
_ => false,
5961
}
6062
}

clippy_lints/src/methods/manual_str_repeat.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::{snippet_with_applicability, snippet_with_context};
33
use clippy_utils::sugg::Sugg;
4-
use clippy_utils::{is_item, paths};
4+
use clippy_utils::{is_any_item, is_item};
55
use if_chain::if_chain;
66
use rustc_ast::LitKind;
77
use rustc_errors::Applicability;
88
use rustc_hir::{Expr, ExprKind, LangItem};
99
use rustc_lint::LateContext;
10-
use rustc_middle::ty::{self, Ty, TyS};
10+
use rustc_middle::ty;
1111
use rustc_span::symbol::sym;
1212
use std::borrow::Cow;
1313

@@ -18,14 +18,6 @@ enum RepeatKind {
1818
Char(char),
1919
}
2020

21-
fn get_ty_param(ty: Ty<'_>) -> Option<Ty<'_>> {
22-
if let ty::Adt(_, subs) = ty.kind() {
23-
subs.types().next()
24-
} else {
25-
None
26-
}
27-
}
28-
2921
fn parse_repeat_arg(cx: &LateContext<'_>, e: &Expr<'_>) -> Option<RepeatKind> {
3022
if let ExprKind::Lit(lit) = &e.kind {
3123
match lit.node {
@@ -34,11 +26,16 @@ fn parse_repeat_arg(cx: &LateContext<'_>, e: &Expr<'_>) -> Option<RepeatKind> {
3426
_ => None,
3527
}
3628
} else {
37-
let ty = cx.typeck_results().expr_ty(e).peel_refs();
38-
(ty.is_str()
39-
|| is_item(cx, ty, sym::string_type)
40-
|| (is_item(cx, ty, LangItem::OwnedBox) && get_ty_param(ty).map_or(false, TyS::is_str))
41-
|| (is_item(cx, ty, &paths::COW) && get_ty_param(ty).map_or(false, TyS::is_str)))
29+
match cx.typeck_results().expr_ty(e).peel_refs().kind() {
30+
ty::Str => true,
31+
ty::Adt(adt, subs) if is_item(cx, adt.did, LangItem::OwnedBox) => subs.type_at(0).is_str(),
32+
ty::Adt(adt, subs) => match is_any_item(cx, adt.did, &[sym::string_type, sym::Cow]) {
33+
Some(0) => true,
34+
Some(1) => subs.type_at(1).is_str(),
35+
_ => false,
36+
},
37+
_ => false,
38+
}
4239
.then(|| RepeatKind::String)
4340
}
4441
}
@@ -52,7 +49,7 @@ pub(super) fn check(
5249
) {
5350
if_chain! {
5451
if let ExprKind::Call(repeat_fn, [repeat_arg]) = take_self_arg.kind;
55-
if is_item(cx, repeat_fn, &paths::ITER_REPEAT);
52+
if is_item(cx, repeat_fn, sym::iter_repeat);
5653
if is_item(cx, cx.typeck_results().expr_ty(collect_expr), sym::string_type);
5754
if let Some(collect_id) = cx.typeck_results().type_dependent_def_id(collect_expr.hir_id);
5855
if let Some(take_id) = cx.typeck_results().type_dependent_def_id(take_expr.hir_id);

clippy_lints/src/methods/uninit_assumed_init.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
use clippy_utils::diagnostics::span_lint;
2-
use clippy_utils::{is_item, paths};
2+
use clippy_utils::is_item;
33
use if_chain::if_chain;
44
use rustc_hir as hir;
55
use rustc_lint::LateContext;
66
use rustc_middle::ty::{self, Ty};
7+
use rustc_span::sym;
78

89
use super::UNINIT_ASSUMED_INIT;
910

1011
/// lint for `MaybeUninit::uninit().assume_init()` (we already have the latter)
1112
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) {
1213
if_chain! {
1314
if let hir::ExprKind::Call(callee, []) = recv.kind;
14-
if is_item(cx, callee, &paths::MEM_MAYBEUNINIT_UNINIT);
15+
if is_item(cx, callee, sym::maybe_uninit_uninit);
1516
if !is_maybe_uninit_ty_valid(cx, cx.typeck_results().expr_ty_adjusted(expr));
1617
then {
1718
span_lint(
@@ -28,7 +29,7 @@ fn is_maybe_uninit_ty_valid(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
2829
match ty.kind() {
2930
ty::Array(component, _) => is_maybe_uninit_ty_valid(cx, component),
3031
ty::Tuple(types) => types.types().all(|ty| is_maybe_uninit_ty_valid(cx, ty)),
31-
ty::Adt(adt, _) => is_item(cx, adt.did, &paths::MEM_MAYBEUNINIT),
32+
ty::Adt(adt, _) => is_item(cx, adt.did, hir::LangItem::MaybeUninit),
3233
_ => false,
3334
}
3435
}

0 commit comments

Comments
 (0)