1
Fork 0

Make diangostic item names consistent

This commit is contained in:
Cameron Steffen 2021-10-02 18:51:01 -05:00
parent 2cb37a1911
commit e165c12932
96 changed files with 196 additions and 193 deletions

View file

@ -260,8 +260,8 @@ fn simplify_not(cx: &LateContext<'_>, expr: &Expr<'_>) -> Option<String> {
}, },
ExprKind::MethodCall(path, _, args, _) if args.len() == 1 => { ExprKind::MethodCall(path, _, args, _) if args.len() == 1 => {
let type_of_receiver = cx.typeck_results().expr_ty(&args[0]); let type_of_receiver = cx.typeck_results().expr_ty(&args[0]);
if !is_type_diagnostic_item(cx, type_of_receiver, sym::option_type) if !is_type_diagnostic_item(cx, type_of_receiver, sym::Option)
&& !is_type_diagnostic_item(cx, type_of_receiver, sym::result_type) && !is_type_diagnostic_item(cx, type_of_receiver, sym::Result)
{ {
return None; return None;
} }

View file

@ -55,7 +55,7 @@ fn check_case_sensitive_file_extension_comparison(ctx: &LateContext<'_>, expr: &
return Some(span); return Some(span);
}, },
ty::Adt(&ty::AdtDef { did, .. }, _) => { ty::Adt(&ty::AdtDef { did, .. }, _) => {
if ctx.tcx.is_diagnostic_item(sym::string_type, did) { if ctx.tcx.is_diagnostic_item(sym::String, did) {
return Some(span); return Some(span);
} }
}, },

View file

@ -67,7 +67,7 @@ impl CognitiveComplexity {
helper.visit_expr(expr); helper.visit_expr(expr);
let CcHelper { cc, returns } = helper; let CcHelper { cc, returns } = helper;
let ret_ty = cx.typeck_results().node_type(expr.hir_id); let ret_ty = cx.typeck_results().node_type(expr.hir_id);
let ret_adjust = if is_type_diagnostic_item(cx, ret_ty, sym::result_type) { let ret_adjust = if is_type_diagnostic_item(cx, ret_ty, sym::Result) {
returns returns
} else { } else {
#[allow(clippy::integer_division)] #[allow(clippy::integer_division)]

View file

@ -307,7 +307,7 @@ fn lint_for_missing_headers<'tcx>(
} }
if !headers.errors { if !headers.errors {
let hir_id = cx.tcx.hir().local_def_id_to_hir_id(def_id); let hir_id = cx.tcx.hir().local_def_id_to_hir_id(def_id);
if is_type_diagnostic_item(cx, return_ty(cx, hir_id), sym::result_type) { if is_type_diagnostic_item(cx, return_ty(cx, hir_id), sym::Result) {
span_lint( span_lint(
cx, cx,
MISSING_ERRORS_DOC, MISSING_ERRORS_DOC,
@ -325,7 +325,7 @@ fn lint_for_missing_headers<'tcx>(
if let ty::Opaque(_, subs) = ret_ty.kind(); if let ty::Opaque(_, subs) = ret_ty.kind();
if let Some(gen) = subs.types().next(); if let Some(gen) = subs.types().next();
if let ty::Generator(_, subs, _) = gen.kind(); if let ty::Generator(_, subs, _) = gen.kind();
if is_type_diagnostic_item(cx, subs.as_generator().return_ty(), sym::result_type); if is_type_diagnostic_item(cx, subs.as_generator().return_ty(), sym::Result);
then { then {
span_lint( span_lint(
cx, cx,
@ -760,8 +760,8 @@ impl<'a, 'tcx> Visitor<'tcx> for FindPanicUnwrap<'a, 'tcx> {
// check for `unwrap` // check for `unwrap`
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) { if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs(); let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
if is_type_diagnostic_item(self.cx, reciever_ty, sym::option_type) if is_type_diagnostic_item(self.cx, reciever_ty, sym::Option)
|| is_type_diagnostic_item(self.cx, reciever_ty, sym::result_type) || is_type_diagnostic_item(self.cx, reciever_ty, sym::Result)
{ {
self.panic_span = Some(expr.span); self.panic_span = Some(expr.span);
} }

View file

@ -57,7 +57,7 @@ impl<'tcx> LateLintPass<'tcx> for FallibleImplFrom {
if_chain! { if_chain! {
if let hir::ItemKind::Impl(impl_) = &item.kind; if let hir::ItemKind::Impl(impl_) = &item.kind;
if let Some(impl_trait_ref) = cx.tcx.impl_trait_ref(item.def_id); if let Some(impl_trait_ref) = cx.tcx.impl_trait_ref(item.def_id);
if cx.tcx.is_diagnostic_item(sym::from_trait, impl_trait_ref.def_id); if cx.tcx.is_diagnostic_item(sym::From, impl_trait_ref.def_id);
then { then {
lint_impl_body(cx, item.span, impl_.items); lint_impl_body(cx, item.span, impl_.items);
} }
@ -94,8 +94,8 @@ fn lint_impl_body<'tcx>(cx: &LateContext<'tcx>, impl_span: Span, impl_items: &[h
// check for `unwrap` // check for `unwrap`
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) { if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs(); let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
if is_type_diagnostic_item(self.lcx, reciever_ty, sym::option_type) if is_type_diagnostic_item(self.lcx, reciever_ty, sym::Option)
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym::result_type) || is_type_diagnostic_item(self.lcx, reciever_ty, sym::Result)
{ {
self.result.push(expr.span); self.result.push(expr.span);
} }

View file

@ -65,7 +65,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessFormat {
if_chain! { if_chain! {
if format_args.format_string_symbols == [kw::Empty]; if format_args.format_string_symbols == [kw::Empty];
if match cx.typeck_results().expr_ty(value).peel_refs().kind() { if match cx.typeck_results().expr_ty(value).peel_refs().kind() {
ty::Adt(adt, _) => cx.tcx.is_diagnostic_item(sym::string_type, adt.did), ty::Adt(adt, _) => cx.tcx.is_diagnostic_item(sym::String, adt.did),
ty::Str => true, ty::Str => true,
_ => false, _ => false,
}; };

View file

@ -61,7 +61,7 @@ impl LateLintPass<'_> for FromOverInto {
if_chain! { if_chain! {
if let hir::ItemKind::Impl{ .. } = &item.kind; if let hir::ItemKind::Impl{ .. } = &item.kind;
if let Some(impl_trait_ref) = cx.tcx.impl_trait_ref(item.def_id); if let Some(impl_trait_ref) = cx.tcx.impl_trait_ref(item.def_id);
if cx.tcx.is_diagnostic_item(sym::into_trait, impl_trait_ref.def_id); if cx.tcx.is_diagnostic_item(sym::Into, impl_trait_ref.def_id);
then { then {
span_lint_and_help( span_lint_and_help(

View file

@ -98,5 +98,5 @@ impl LateLintPass<'tcx> for FromStrRadix10 {
/// Checks if a Ty is `String` or `&str` /// Checks if a Ty is `String` or `&str`
fn is_ty_stringish(cx: &LateContext<'_>, ty: Ty<'_>) -> bool { fn is_ty_stringish(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
is_type_diagnostic_item(cx, ty, sym::string_type) || is_type_diagnostic_item(cx, ty, sym::str) is_type_diagnostic_item(cx, ty, sym::String) || is_type_diagnostic_item(cx, ty, sym::str)
} }

View file

@ -48,7 +48,7 @@ fn check_result_unit_err(cx: &LateContext<'_>, decl: &hir::FnDecl<'_>, item_span
if !in_external_macro(cx.sess(), item_span); if !in_external_macro(cx.sess(), item_span);
if let hir::FnRetTy::Return(ty) = decl.output; if let hir::FnRetTy::Return(ty) = decl.output;
let ty = hir_ty_to_ty(cx.tcx, ty); let ty = hir_ty_to_ty(cx.tcx, ty);
if is_type_diagnostic_item(cx, ty, sym::result_type); if is_type_diagnostic_item(cx, ty, sym::Result);
if let ty::Adt(_, substs) = ty.kind(); if let ty::Adt(_, substs) = ty.kind();
let err_ty = substs.type_at(1); let err_ty = substs.type_at(1);
if err_ty.is_unit(); if err_ty.is_unit();

View file

@ -75,7 +75,7 @@ impl<'tcx> LateLintPass<'tcx> for FutureNotSend {
} }
} }
if is_future { if is_future {
let send_trait = cx.tcx.get_diagnostic_item(sym::send_trait).unwrap(); let send_trait = cx.tcx.get_diagnostic_item(sym::Send).unwrap();
let span = decl.output.span(); let span = decl.output.span();
let send_result = cx.tcx.infer_ctxt().enter(|infcx| { let send_result = cx.tcx.infer_ctxt().enter(|infcx| {
let cause = traits::ObligationCause::misc(span, hir_id); let cause = traits::ObligationCause::misc(span, hir_id);

View file

@ -58,7 +58,7 @@ impl<'tcx> LateLintPass<'tcx> for GetLastWithLen {
// Argument 0 (the struct we're calling the method on) is a vector // Argument 0 (the struct we're calling the method on) is a vector
if let Some(struct_calling_on) = args.get(0); if let Some(struct_calling_on) = args.get(0);
let struct_ty = cx.typeck_results().expr_ty(struct_calling_on); let struct_ty = cx.typeck_results().expr_ty(struct_calling_on);
if is_type_diagnostic_item(cx, struct_ty, sym::vec_type); if is_type_diagnostic_item(cx, struct_ty, sym::Vec);
// Argument to "get" is a subtraction // Argument to "get" is a subtraction
if let Some(get_index_arg) = args.get(1); if let Some(get_index_arg) = args.get(1);

View file

@ -8,6 +8,7 @@ use rustc_hir::{Expr, ExprKind};
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::hir::map::Map; use rustc_middle::hir::map::Map;
use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::sym;
declare_clippy_lint! { declare_clippy_lint! {
/// ### What it does /// ### What it does
@ -141,7 +142,7 @@ fn is_mutex_lock_call<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) -> Opt
if let ExprKind::MethodCall(path, _span, [self_arg, ..], _) = &expr.kind; if let ExprKind::MethodCall(path, _span, [self_arg, ..], _) = &expr.kind;
if path.ident.as_str() == "lock"; if path.ident.as_str() == "lock";
let ty = cx.typeck_results().expr_ty(self_arg); let ty = cx.typeck_results().expr_ty(self_arg);
if is_type_diagnostic_item(cx, ty, sym!(mutex_type)); if is_type_diagnostic_item(cx, ty, sym::Mutex);
then { then {
Some(self_arg) Some(self_arg)
} else { } else {

View file

@ -225,14 +225,14 @@ impl<'tcx> ImplicitHasherType<'tcx> {
let ty = hir_ty_to_ty(cx.tcx, hir_ty); let ty = hir_ty_to_ty(cx.tcx, hir_ty);
if is_type_diagnostic_item(cx, ty, sym::hashmap_type) && params_len == 2 { if is_type_diagnostic_item(cx, ty, sym::HashMap) && params_len == 2 {
Some(ImplicitHasherType::HashMap( Some(ImplicitHasherType::HashMap(
hir_ty.span, hir_ty.span,
ty, ty,
snippet(cx, params[0].span, "K"), snippet(cx, params[0].span, "K"),
snippet(cx, params[1].span, "V"), snippet(cx, params[1].span, "V"),
)) ))
} else if is_type_diagnostic_item(cx, ty, sym::hashset_type) && params_len == 1 { } else if is_type_diagnostic_item(cx, ty, sym::HashSet) && params_len == 1 {
Some(ImplicitHasherType::HashSet( Some(ImplicitHasherType::HashSet(
hir_ty.span, hir_ty.span,
ty, ty,
@ -347,7 +347,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for ImplicitHasherConstructorVisitor<'a, 'b, 't
return; return;
} }
if self.cx.tcx.is_diagnostic_item(sym::hashmap_type, ty_did) { if self.cx.tcx.is_diagnostic_item(sym::HashMap, ty_did) {
if method.ident.name == sym::new { if method.ident.name == sym::new {
self.suggestions self.suggestions
.insert(e.span, "HashMap::default()".to_string()); .insert(e.span, "HashMap::default()".to_string());
@ -360,7 +360,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for ImplicitHasherConstructorVisitor<'a, 'b, 't
), ),
); );
} }
} else if self.cx.tcx.is_diagnostic_item(sym::hashset_type, ty_did) { } else if self.cx.tcx.is_diagnostic_item(sym::HashSet, ty_did) {
if method.ident.name == sym::new { if method.ident.name == sym::new {
self.suggestions self.suggestions
.insert(e.span, "HashSet::default()".to_string()); .insert(e.span, "HashSet::default()".to_string());

View file

@ -210,11 +210,11 @@ const INFINITE_COLLECTORS: &[Symbol] = &[
sym::BinaryHeap, sym::BinaryHeap,
sym::BTreeMap, sym::BTreeMap,
sym::BTreeSet, sym::BTreeSet,
sym::hashmap_type, sym::HashMap,
sym::hashset_type, sym::HashSet,
sym::LinkedList, sym::LinkedList,
sym::vec_type, sym::Vec,
sym::vecdeque_type, sym::VecDeque,
]; ];
fn complete_infinite_iter(cx: &LateContext<'_>, expr: &Expr<'_>) -> Finiteness { fn complete_infinite_iter(cx: &LateContext<'_>, expr: &Expr<'_>) -> Finiteness {

View file

@ -111,7 +111,7 @@ impl<'tcx> LateLintPass<'tcx> for InherentToString {
if impl_item.generics.params.is_empty(); if impl_item.generics.params.is_empty();
// Check if return type is String // Check if return type is String
if is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::string_type); if is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::String);
// Filters instances of to_string which are required by a trait // Filters instances of to_string which are required by a trait
if trait_ref_of_method(cx, impl_item.hir_id()).is_none(); if trait_ref_of_method(cx, impl_item.hir_id()).is_none();

View file

@ -245,10 +245,10 @@ enum LenOutput<'tcx> {
fn parse_len_output(cx: &LateContext<'_>, sig: FnSig<'tcx>) -> Option<LenOutput<'tcx>> { fn parse_len_output(cx: &LateContext<'_>, sig: FnSig<'tcx>) -> Option<LenOutput<'tcx>> {
match *sig.output().kind() { match *sig.output().kind() {
ty::Int(_) | ty::Uint(_) => Some(LenOutput::Integral), ty::Int(_) | ty::Uint(_) => Some(LenOutput::Integral),
ty::Adt(adt, subs) if cx.tcx.is_diagnostic_item(sym::option_type, adt.did) => { ty::Adt(adt, subs) if cx.tcx.is_diagnostic_item(sym::Option, adt.did) => {
subs.type_at(0).is_integral().then(|| LenOutput::Option(adt.did)) subs.type_at(0).is_integral().then(|| LenOutput::Option(adt.did))
}, },
ty::Adt(adt, subs) if cx.tcx.is_diagnostic_item(sym::result_type, adt.did) => subs ty::Adt(adt, subs) if cx.tcx.is_diagnostic_item(sym::Result, adt.did) => subs
.type_at(0) .type_at(0)
.is_integral() .is_integral()
.then(|| LenOutput::Result(adt.did, subs.type_at(1))), .then(|| LenOutput::Result(adt.did, subs.type_at(1))),

View file

@ -54,11 +54,11 @@ fn is_ref_iterable_type(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
// will allow further borrows afterwards // will allow further borrows afterwards
let ty = cx.typeck_results().expr_ty(e); let ty = cx.typeck_results().expr_ty(e);
is_iterable_array(ty, cx) || is_iterable_array(ty, cx) ||
is_type_diagnostic_item(cx, ty, sym::vec_type) || is_type_diagnostic_item(cx, ty, sym::Vec) ||
is_type_diagnostic_item(cx, ty, sym::LinkedList) || is_type_diagnostic_item(cx, ty, sym::LinkedList) ||
is_type_diagnostic_item(cx, ty, sym::hashmap_type) || is_type_diagnostic_item(cx, ty, sym::HashMap) ||
is_type_diagnostic_item(cx, ty, sym::hashset_type) || is_type_diagnostic_item(cx, ty, sym::HashSet) ||
is_type_diagnostic_item(cx, ty, sym::vecdeque_type) || is_type_diagnostic_item(cx, ty, sym::VecDeque) ||
is_type_diagnostic_item(cx, ty, sym::BinaryHeap) || is_type_diagnostic_item(cx, ty, sym::BinaryHeap) ||
is_type_diagnostic_item(cx, ty, sym::BTreeMap) || is_type_diagnostic_item(cx, ty, sym::BTreeMap) ||
is_type_diagnostic_item(cx, ty, sym::BTreeSet) is_type_diagnostic_item(cx, ty, sym::BTreeSet)

View file

@ -33,7 +33,7 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, pat: &'tcx Pat<'_>, arg: &'tcx
_ => arg, _ => arg,
}; };
if is_type_diagnostic_item(cx, ty, sym::hashmap_type) || is_type_diagnostic_item(cx, ty, sym::BTreeMap) { if is_type_diagnostic_item(cx, ty, sym::HashMap) || is_type_diagnostic_item(cx, ty, sym::BTreeMap) {
span_lint_and_then( span_lint_and_then(
cx, cx,
FOR_KV_MAP, FOR_KV_MAP,

View file

@ -9,7 +9,7 @@ use rustc_span::symbol::sym;
/// Checks for `for` loops over `Option`s and `Result`s. /// Checks for `for` loops over `Option`s and `Result`s.
pub(super) fn check(cx: &LateContext<'_>, pat: &Pat<'_>, arg: &Expr<'_>) { pub(super) fn check(cx: &LateContext<'_>, pat: &Pat<'_>, arg: &Expr<'_>) {
let ty = cx.typeck_results().expr_ty(arg); let ty = cx.typeck_results().expr_ty(arg);
if is_type_diagnostic_item(cx, ty, sym::option_type) { if is_type_diagnostic_item(cx, ty, sym::Option) {
span_lint_and_help( span_lint_and_help(
cx, cx,
FOR_LOOPS_OVER_FALLIBLES, FOR_LOOPS_OVER_FALLIBLES,
@ -26,7 +26,7 @@ pub(super) fn check(cx: &LateContext<'_>, pat: &Pat<'_>, arg: &Expr<'_>) {
snippet(cx, arg.span, "_") snippet(cx, arg.span, "_")
), ),
); );
} else if is_type_diagnostic_item(cx, ty, sym::result_type) { } else if is_type_diagnostic_item(cx, ty, sym::Result) {
span_lint_and_help( span_lint_and_help(
cx, cx,
FOR_LOOPS_OVER_FALLIBLES, FOR_LOOPS_OVER_FALLIBLES,

View file

@ -332,7 +332,7 @@ fn is_slice_like<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'_>) -> bool {
_ => false, _ => false,
}; };
is_slice || is_type_diagnostic_item(cx, ty, sym::vec_type) || is_type_diagnostic_item(cx, ty, sym::vecdeque_type) is_slice || is_type_diagnostic_item(cx, ty, sym::Vec) || is_type_diagnostic_item(cx, ty, sym::VecDeque)
} }
fn fetch_cloned_expr<'tcx>(expr: &'tcx Expr<'tcx>) -> &'tcx Expr<'tcx> { fn fetch_cloned_expr<'tcx>(expr: &'tcx Expr<'tcx>) -> &'tcx Expr<'tcx> {

View file

@ -29,8 +29,8 @@ fn check_needless_collect_direct_usage<'tcx>(expr: &'tcx Expr<'_>, cx: &LateCont
let mut applicability = Applicability::MaybeIncorrect; let mut applicability = Applicability::MaybeIncorrect;
let is_empty_sugg = "next().is_none()".to_string(); let is_empty_sugg = "next().is_none()".to_string();
let method_name = &*method.ident.name.as_str(); let method_name = &*method.ident.name.as_str();
let sugg = if is_type_diagnostic_item(cx, ty, sym::vec_type) || let sugg = if is_type_diagnostic_item(cx, ty, sym::Vec) ||
is_type_diagnostic_item(cx, ty, sym::vecdeque_type) || is_type_diagnostic_item(cx, ty, sym::VecDeque) ||
is_type_diagnostic_item(cx, ty, sym::LinkedList) || is_type_diagnostic_item(cx, ty, sym::LinkedList) ||
is_type_diagnostic_item(cx, ty, sym::BinaryHeap) { is_type_diagnostic_item(cx, ty, sym::BinaryHeap) {
match method_name { match method_name {
@ -47,7 +47,7 @@ fn check_needless_collect_direct_usage<'tcx>(expr: &'tcx Expr<'_>, cx: &LateCont
} }
} }
else if is_type_diagnostic_item(cx, ty, sym::BTreeMap) || else if is_type_diagnostic_item(cx, ty, sym::BTreeMap) ||
is_type_diagnostic_item(cx, ty, sym::hashmap_type) { is_type_diagnostic_item(cx, ty, sym::HashMap) {
match method_name { match method_name {
"is_empty" => is_empty_sugg, "is_empty" => is_empty_sugg,
_ => return, _ => return,
@ -79,8 +79,8 @@ fn check_needless_collect_indirect_usage<'tcx>(expr: &'tcx Expr<'_>, cx: &LateCo
if let ExprKind::MethodCall(method_name, collect_span, &[ref iter_source], ..) = init_expr.kind; if let ExprKind::MethodCall(method_name, collect_span, &[ref iter_source], ..) = init_expr.kind;
if method_name.ident.name == sym!(collect) && is_trait_method(cx, init_expr, sym::Iterator); if method_name.ident.name == sym!(collect) && is_trait_method(cx, init_expr, sym::Iterator);
let ty = cx.typeck_results().expr_ty(init_expr); let ty = cx.typeck_results().expr_ty(init_expr);
if is_type_diagnostic_item(cx, ty, sym::vec_type) || if is_type_diagnostic_item(cx, ty, sym::Vec) ||
is_type_diagnostic_item(cx, ty, sym::vecdeque_type) || is_type_diagnostic_item(cx, ty, sym::VecDeque) ||
is_type_diagnostic_item(cx, ty, sym::BinaryHeap) || is_type_diagnostic_item(cx, ty, sym::BinaryHeap) ||
is_type_diagnostic_item(cx, ty, sym::LinkedList); is_type_diagnostic_item(cx, ty, sym::LinkedList);
if let Some(iter_calls) = detect_iter_and_into_iters(block, id); if let Some(iter_calls) = detect_iter_and_into_iters(block, id);

View file

@ -192,7 +192,7 @@ fn get_vec_push<'tcx>(cx: &LateContext<'tcx>, stmt: &'tcx Stmt<'_>) -> Option<(&
if let Some(self_expr) = args.get(0); if let Some(self_expr) = args.get(0);
if let Some(pushed_item) = args.get(1); if let Some(pushed_item) = args.get(1);
// Check that the method being called is push() on a Vec // Check that the method being called is push() on a Vec
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(self_expr), sym::vec_type); if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(self_expr), sym::Vec);
if path.ident.name.as_str() == "push"; if path.ident.name.as_str() == "push";
then { then {
return Some((self_expr, pushed_item)) return Some((self_expr, pushed_item))

View file

@ -61,8 +61,8 @@ impl LateLintPass<'_> for ManualMap {
let (scrutinee_ty, ty_ref_count, ty_mutability) = let (scrutinee_ty, ty_ref_count, ty_mutability) =
peel_mid_ty_refs_is_mutable(cx.typeck_results().expr_ty(scrutinee)); peel_mid_ty_refs_is_mutable(cx.typeck_results().expr_ty(scrutinee));
if !(is_type_diagnostic_item(cx, scrutinee_ty, sym::option_type) if !(is_type_diagnostic_item(cx, scrutinee_ty, sym::Option)
&& is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::option_type)) && is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::Option))
{ {
return; return;
} }

View file

@ -51,7 +51,7 @@ impl LateLintPass<'_> for ManualOkOr {
if args.len() == 3; if args.len() == 3;
let method_receiver = &args[0]; let method_receiver = &args[0];
let ty = cx.typeck_results().expr_ty(method_receiver); let ty = cx.typeck_results().expr_ty(method_receiver);
if is_type_diagnostic_item(cx, ty, sym::option_type); if is_type_diagnostic_item(cx, ty, sym::Option);
let or_expr = &args[1]; let or_expr = &args[1];
if is_ok_wrapping(cx, &args[2]); if is_ok_wrapping(cx, &args[2]);
if let ExprKind::Call(Expr { kind: ExprKind::Path(err_path), .. }, &[ref err_arg]) = or_expr.kind; if let ExprKind::Call(Expr { kind: ExprKind::Path(err_path), .. }, &[ref err_arg]) = or_expr.kind;

View file

@ -82,9 +82,9 @@ fn lint_manual_unwrap_or<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) {
if_chain! { if_chain! {
if let ExprKind::Match(scrutinee, match_arms, _) = expr.kind; if let ExprKind::Match(scrutinee, match_arms, _) = expr.kind;
let ty = cx.typeck_results().expr_ty(scrutinee); let ty = cx.typeck_results().expr_ty(scrutinee);
if let Some(ty_name) = if is_type_diagnostic_item(cx, ty, sym::option_type) { if let Some(ty_name) = if is_type_diagnostic_item(cx, ty, sym::Option) {
Some("Option") Some("Option")
} else if is_type_diagnostic_item(cx, ty, sym::result_type) { } else if is_type_diagnostic_item(cx, ty, sym::Result) {
Some("Result") Some("Result")
} else { } else {
None None

View file

@ -55,7 +55,7 @@ impl<'tcx> LateLintPass<'tcx> for MapClone {
if args.len() == 2; if args.len() == 2;
if method.ident.name == sym::map; if method.ident.name == sym::map;
let ty = cx.typeck_results().expr_ty(&args[0]); let ty = cx.typeck_results().expr_ty(&args[0]);
if is_type_diagnostic_item(cx, ty, sym::option_type) || is_trait_method(cx, e, sym::Iterator); if is_type_diagnostic_item(cx, ty, sym::Option) || is_trait_method(cx, e, sym::Iterator);
if let hir::ExprKind::Closure(_, _, body_id, _, _) = args[1].kind; if let hir::ExprKind::Closure(_, _, body_id, _, _) = args[1].kind;
then { then {
let closure_body = cx.tcx.hir().body(body_id); let closure_body = cx.tcx.hir().body(body_id);

View file

@ -206,9 +206,9 @@ fn lint_map_unit_fn(cx: &LateContext<'_>, stmt: &hir::Stmt<'_>, expr: &hir::Expr
let var_arg = &map_args[0]; let var_arg = &map_args[0];
let (map_type, variant, lint) = let (map_type, variant, lint) =
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(var_arg), sym::option_type) { if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(var_arg), sym::Option) {
("Option", "Some", OPTION_MAP_UNIT_FN) ("Option", "Some", OPTION_MAP_UNIT_FN)
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(var_arg), sym::result_type) { } else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(var_arg), sym::Result) {
("Result", "Ok", RESULT_MAP_UNIT_FN) ("Result", "Ok", RESULT_MAP_UNIT_FN)
} else { } else {
return; return;

View file

@ -93,7 +93,7 @@ fn is_vec_indexing<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Opti
fn is_vector(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool { fn is_vector(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
let ty = cx.typeck_results().expr_ty(expr); let ty = cx.typeck_results().expr_ty(expr);
let ty = ty.peel_refs(); let ty = ty.peel_refs();
is_type_diagnostic_item(cx, ty, sym::vec_type) is_type_diagnostic_item(cx, ty, sym::Vec)
} }
fn is_full_range(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool { fn is_full_range(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {

View file

@ -60,7 +60,7 @@ impl<'tcx> LateLintPass<'tcx> for MatchResultOk {
if let ExprKind::MethodCall(_, ok_span, [ref result_types_0, ..], _) = let_expr.kind; //check is expr.ok() has type Result<T,E>.ok(, _) if let ExprKind::MethodCall(_, ok_span, [ref result_types_0, ..], _) = let_expr.kind; //check is expr.ok() has type Result<T,E>.ok(, _)
if let PatKind::TupleStruct(QPath::Resolved(_, x), y, _) = let_pat.kind; //get operation if let PatKind::TupleStruct(QPath::Resolved(_, x), y, _) = let_pat.kind; //get operation
if method_chain_args(let_expr, &["ok"]).is_some(); //test to see if using ok() methoduse std::marker::Sized; if method_chain_args(let_expr, &["ok"]).is_some(); //test to see if using ok() methoduse std::marker::Sized;
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(result_types_0), sym::result_type); if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(result_types_0), sym::Result);
if rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_path(x, false)) == "Some"; if rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_path(x, false)) == "Some";
then { then {

View file

@ -948,7 +948,7 @@ fn check_overlapping_arms<'tcx>(cx: &LateContext<'tcx>, ex: &'tcx Expr<'_>, arms
fn check_wild_err_arm<'tcx>(cx: &LateContext<'tcx>, ex: &Expr<'tcx>, arms: &[Arm<'tcx>]) { fn check_wild_err_arm<'tcx>(cx: &LateContext<'tcx>, ex: &Expr<'tcx>, arms: &[Arm<'tcx>]) {
let ex_ty = cx.typeck_results().expr_ty(ex).peel_refs(); let ex_ty = cx.typeck_results().expr_ty(ex).peel_refs();
if is_type_diagnostic_item(cx, ex_ty, sym::result_type) { if is_type_diagnostic_item(cx, ex_ty, sym::Result) {
for arm in arms { for arm in arms {
if let PatKind::TupleStruct(ref path, inner, _) = arm.pat.kind { if let PatKind::TupleStruct(ref path, inner, _) = arm.pat.kind {
let path_str = rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_qpath(path, false)); let path_str = rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| s.print_qpath(path, false));
@ -1025,8 +1025,8 @@ fn check_wild_enum_match(cx: &LateContext<'_>, ex: &Expr<'_>, arms: &[Arm<'_>])
let adt_def = match ty.kind() { let adt_def = match ty.kind() {
ty::Adt(adt_def, _) ty::Adt(adt_def, _)
if adt_def.is_enum() if adt_def.is_enum()
&& !(is_type_diagnostic_item(cx, ty, sym::option_type) && !(is_type_diagnostic_item(cx, ty, sym::Option)
|| is_type_diagnostic_item(cx, ty, sym::result_type)) => || is_type_diagnostic_item(cx, ty, sym::Result)) =>
{ {
adt_def adt_def
}, },
@ -1869,7 +1869,7 @@ mod redundant_pattern_match {
} }
} }
// Check for std types which implement drop, but only for memory allocation. // Check for std types which implement drop, but only for memory allocation.
else if is_type_diagnostic_item(cx, ty, sym::vec_type) else if is_type_diagnostic_item(cx, ty, sym::Vec)
|| is_type_lang_item(cx, ty, LangItem::OwnedBox) || is_type_lang_item(cx, ty, LangItem::OwnedBox)
|| is_type_diagnostic_item(cx, ty, sym::Rc) || is_type_diagnostic_item(cx, ty, sym::Rc)
|| is_type_diagnostic_item(cx, ty, sym::Arc) || is_type_diagnostic_item(cx, ty, sym::Arc)

View file

@ -12,7 +12,7 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &Expr<'_>, recv: &'tcx E
let ty = cx.typeck_results().expr_ty(recv).peel_refs(); let ty = cx.typeck_results().expr_ty(recv).peel_refs();
let caller_type = if ty.is_str() { let caller_type = if ty.is_str() {
"str" "str"
} else if is_type_diagnostic_item(cx, ty, sym::string_type) { } else if is_type_diagnostic_item(cx, ty, sym::String) {
"String" "String"
} else { } else {
return; return;

View file

@ -15,7 +15,7 @@ pub fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, span: Span,
let inner_ty = match recv_ty.kind() { let inner_ty = match recv_ty.kind() {
// `Option<T>` -> `T` // `Option<T>` -> `T`
ty::Adt(adt, subst) ty::Adt(adt, subst)
if cx.tcx.is_diagnostic_item(sym::option_type, adt.did) && meets_msrv(msrv, &msrvs::OPTION_COPIED) => if cx.tcx.is_diagnostic_item(sym::Option, adt.did) && meets_msrv(msrv, &msrvs::OPTION_COPIED) =>
{ {
subst.type_at(0) subst.type_at(0)
}, },

View file

@ -28,7 +28,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, method_span: Spa
&& { && {
let arg_type = cx.typeck_results().expr_ty(&call_args[0]); let arg_type = cx.typeck_results().expr_ty(&call_args[0]);
let base_type = arg_type.peel_refs(); let base_type = arg_type.peel_refs();
*base_type.kind() == ty::Str || is_type_diagnostic_item(cx, base_type, sym::string_type) *base_type.kind() == ty::Str || is_type_diagnostic_item(cx, base_type, sym::String)
} }
{ {
&call_args[0] &call_args[0]
@ -46,7 +46,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, method_span: Spa
// converted to string. // converted to string.
fn requires_to_string(cx: &LateContext<'_>, arg: &hir::Expr<'_>) -> bool { fn requires_to_string(cx: &LateContext<'_>, arg: &hir::Expr<'_>) -> bool {
let arg_ty = cx.typeck_results().expr_ty(arg); let arg_ty = cx.typeck_results().expr_ty(arg);
if is_type_diagnostic_item(cx, arg_ty, sym::string_type) { if is_type_diagnostic_item(cx, arg_ty, sym::String) {
return false; return false;
} }
if let ty::Ref(_, ty, ..) = arg_ty.kind() { if let ty::Ref(_, ty, ..) = arg_ty.kind() {
@ -113,9 +113,9 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, method_span: Spa
} }
let receiver_type = cx.typeck_results().expr_ty_adjusted(&args[0]); let receiver_type = cx.typeck_results().expr_ty_adjusted(&args[0]);
let closure_args = if is_type_diagnostic_item(cx, receiver_type, sym::option_type) { let closure_args = if is_type_diagnostic_item(cx, receiver_type, sym::Option) {
"||" "||"
} else if is_type_diagnostic_item(cx, receiver_type, sym::result_type) { } else if is_type_diagnostic_item(cx, receiver_type, sym::Result) {
"|_|" "|_|"
} else { } else {
return; return;

View file

@ -10,9 +10,9 @@ use super::EXPECT_USED;
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) { pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) {
let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs(); let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs();
let mess = if is_type_diagnostic_item(cx, obj_ty, sym::option_type) { let mess = if is_type_diagnostic_item(cx, obj_ty, sym::Option) {
Some((EXPECT_USED, "an Option", "None")) Some((EXPECT_USED, "an Option", "None"))
} else if is_type_diagnostic_item(cx, obj_ty, sym::result_type) { } else if is_type_diagnostic_item(cx, obj_ty, sym::Result) {
Some((EXPECT_USED, "a Result", "Err")) Some((EXPECT_USED, "a Result", "Err"))
} else { } else {
None None

View file

@ -12,7 +12,7 @@ use super::EXTEND_WITH_DRAIN;
pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, arg: &Expr<'_>) { pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, arg: &Expr<'_>) {
let ty = cx.typeck_results().expr_ty(recv).peel_refs(); let ty = cx.typeck_results().expr_ty(recv).peel_refs();
if_chain! { if_chain! {
if is_type_diagnostic_item(cx, ty, sym::vec_type); if is_type_diagnostic_item(cx, ty, sym::Vec);
//check source object //check source object
if let ExprKind::MethodCall(src_method, _, [drain_vec, drain_arg], _) = &arg.kind; if let ExprKind::MethodCall(src_method, _, [drain_vec, drain_arg], _) = &arg.kind;
if src_method.ident.as_str() == "drain"; if src_method.ident.as_str() == "drain";
@ -20,7 +20,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &Expr<'_>, recv: &Expr<'_>, arg:
//check if actual src type is mutable for code suggestion //check if actual src type is mutable for code suggestion
let immutable = src_ty.is_mutable_ptr(); let immutable = src_ty.is_mutable_ptr();
let src_ty = src_ty.peel_refs(); let src_ty = src_ty.peel_refs();
if is_type_diagnostic_item(cx, src_ty, sym::vec_type); if is_type_diagnostic_item(cx, src_ty, sym::Vec);
//check drain range //check drain range
if let src_ty_range = cx.typeck_results().expr_ty(drain_arg).peel_refs(); if let src_ty_range = cx.typeck_results().expr_ty(drain_arg).peel_refs();
if is_type_lang_item(cx, src_ty_range, LangItem::RangeFull); if is_type_lang_item(cx, src_ty_range, LangItem::RangeFull);

View file

@ -61,7 +61,7 @@ fn lint_filter_some_map_unwrap(
methods_span: Span, methods_span: Span,
) { ) {
let iterator = is_trait_method(cx, expr, sym::Iterator); let iterator = is_trait_method(cx, expr, sym::Iterator);
let option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(filter_recv), sym::option_type); let option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(filter_recv), sym::Option);
if (iterator || option) && is_option_filter_map(cx, filter_arg, map_arg) { if (iterator || option) && is_option_filter_map(cx, filter_arg, map_arg) {
let msg = "`filter` for `Some` followed by `unwrap`"; let msg = "`filter` for `Some` followed by `unwrap`";
let help = "consider using `flatten` instead"; let help = "consider using `flatten` instead";
@ -120,9 +120,9 @@ pub(super) fn check<'tcx>(
if let PatKind::Binding(_, filter_param_id, _, None) = filter_pat.kind; if let PatKind::Binding(_, filter_param_id, _, None) = filter_pat.kind;
if let ExprKind::MethodCall(path, _, [filter_arg], _) = filter_body.value.kind; if let ExprKind::MethodCall(path, _, [filter_arg], _) = filter_body.value.kind;
if let Some(opt_ty) = cx.typeck_results().expr_ty(filter_arg).ty_adt_def(); if let Some(opt_ty) = cx.typeck_results().expr_ty(filter_arg).ty_adt_def();
if let Some(is_result) = if cx.tcx.is_diagnostic_item(sym::option_type, opt_ty.did) { if let Some(is_result) = if cx.tcx.is_diagnostic_item(sym::Option, opt_ty.did) {
Some(false) Some(false)
} else if cx.tcx.is_diagnostic_item(sym::result_type, opt_ty.did) { } else if cx.tcx.is_diagnostic_item(sym::Result, opt_ty.did) {
Some(true) Some(true)
} else { } else {
None None

View file

@ -19,7 +19,7 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>, arg
_ if arg_ty.is_fn() => arg_ty.fn_sig(cx.tcx), _ if arg_ty.is_fn() => arg_ty.fn_sig(cx.tcx),
_ => return, _ => return,
}; };
if !is_type_diagnostic_item(cx, sig.output().skip_binder(), sym::option_type) { if !is_type_diagnostic_item(cx, sig.output().skip_binder(), sym::Option) {
return; return;
} }
span_lint_and_sugg( span_lint_and_sugg(

View file

@ -27,13 +27,13 @@ pub(super) fn check<'tcx>(
let caller_type = if derefs_to_slice(cx, recv, expr_ty).is_some() { let caller_type = if derefs_to_slice(cx, recv, expr_ty).is_some() {
needs_ref = get_args_str.parse::<usize>().is_ok(); needs_ref = get_args_str.parse::<usize>().is_ok();
"slice" "slice"
} else if is_type_diagnostic_item(cx, expr_ty, sym::vec_type) { } else if is_type_diagnostic_item(cx, expr_ty, sym::Vec) {
needs_ref = get_args_str.parse::<usize>().is_ok(); needs_ref = get_args_str.parse::<usize>().is_ok();
"Vec" "Vec"
} else if is_type_diagnostic_item(cx, expr_ty, sym::vecdeque_type) { } else if is_type_diagnostic_item(cx, expr_ty, sym::VecDeque) {
needs_ref = get_args_str.parse::<usize>().is_ok(); needs_ref = get_args_str.parse::<usize>().is_ok();
"VecDeque" "VecDeque"
} else if !is_mut && is_type_diagnostic_item(cx, expr_ty, sym::hashmap_type) { } else if !is_mut && is_type_diagnostic_item(cx, expr_ty, sym::HashMap) {
needs_ref = true; needs_ref = true;
"HashMap" "HashMap"
} else if !is_mut && is_type_diagnostic_item(cx, expr_ty, sym::BTreeMap) { } else if !is_mut && is_type_diagnostic_item(cx, expr_ty, sym::BTreeMap) {

View file

@ -55,7 +55,7 @@ fn specializes_tostring(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
return true; return true;
} }
if is_type_diagnostic_item(cx, ty, sym::string_type) { if is_type_diagnostic_item(cx, ty, sym::String) {
return true; return true;
} }

View file

@ -11,7 +11,7 @@ use super::ITER_CLONED_COLLECT;
pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &hir::Expr<'_>, recv: &'tcx hir::Expr<'_>) { pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &hir::Expr<'_>, recv: &'tcx hir::Expr<'_>) {
if_chain! { if_chain! {
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::vec_type); if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::Vec);
if let Some(slice) = derefs_to_slice(cx, recv, cx.typeck_results().expr_ty(recv)); if let Some(slice) = derefs_to_slice(cx, recv, cx.typeck_results().expr_ty(recv));
if let Some(to_replace) = expr.span.trim_start(slice.span.source_callsite()); if let Some(to_replace) = expr.span.trim_start(slice.span.source_callsite());

View file

@ -13,13 +13,13 @@ pub(crate) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &Expr<'_>, recv: &'tcx E
let ty = cx.typeck_results().expr_ty(recv); let ty = cx.typeck_results().expr_ty(recv);
let caller_type = if derefs_to_slice(cx, recv, ty).is_some() { let caller_type = if derefs_to_slice(cx, recv, ty).is_some() {
"slice" "slice"
} else if is_type_diagnostic_item(cx, ty, sym::vec_type) { } else if is_type_diagnostic_item(cx, ty, sym::Vec) {
"Vec" "Vec"
} else if is_type_diagnostic_item(cx, ty, sym::vecdeque_type) { } else if is_type_diagnostic_item(cx, ty, sym::VecDeque) {
"VecDeque" "VecDeque"
} else if is_type_diagnostic_item(cx, ty, sym::hashset_type) { } else if is_type_diagnostic_item(cx, ty, sym::HashSet) {
"HashSet" "HashSet"
} else if is_type_diagnostic_item(cx, ty, sym::hashmap_type) { } else if is_type_diagnostic_item(cx, ty, sym::HashMap) {
"HashMap" "HashMap"
} else if is_type_diagnostic_item(cx, ty, sym::BTreeMap) { } else if is_type_diagnostic_item(cx, ty, sym::BTreeMap) {
"BTreeMap" "BTreeMap"

View file

@ -64,6 +64,6 @@ pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>, cal
} }
fn is_vec_or_array<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>) -> bool { fn is_vec_or_array<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx hir::Expr<'_>) -> bool {
is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::vec_type) is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::Vec)
|| matches!(&cx.typeck_results().expr_ty(expr).peel_refs().kind(), ty::Array(_, _)) || matches!(&cx.typeck_results().expr_ty(expr).peel_refs().kind(), ty::Array(_, _))
} }

View file

@ -19,9 +19,9 @@ pub(super) fn check<'tcx>(
let mut_str = if is_mut { "_mut" } else { "" }; let mut_str = if is_mut { "_mut" } else { "" };
let caller_type = if derefs_to_slice(cx, iter_recv, cx.typeck_results().expr_ty(iter_recv)).is_some() { let caller_type = if derefs_to_slice(cx, iter_recv, cx.typeck_results().expr_ty(iter_recv)).is_some() {
"slice" "slice"
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(iter_recv), sym::vec_type) { } else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(iter_recv), sym::Vec) {
"Vec" "Vec"
} else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(iter_recv), sym::vecdeque_type) { } else if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(iter_recv), sym::VecDeque) {
"VecDeque" "VecDeque"
} else { } else {
iter_nth_zero::check(cx, expr, nth_recv, nth_arg); iter_nth_zero::check(cx, expr, nth_recv, nth_arg);

View file

@ -123,7 +123,7 @@ fn parse_iter_usage(
return if_chain! { return if_chain! {
if match_def_path(cx, did, &paths::ITERTOOLS_NEXT_TUPLE); if match_def_path(cx, did, &paths::ITERTOOLS_NEXT_TUPLE);
if let ty::Adt(adt_def, subs) = cx.typeck_results().expr_ty(e).kind(); if let ty::Adt(adt_def, subs) = cx.typeck_results().expr_ty(e).kind();
if cx.tcx.is_diagnostic_item(sym::option_type, adt_def.did); if cx.tcx.is_diagnostic_item(sym::Option, adt_def.did);
if let ty::Tuple(subs) = subs.type_at(0).kind(); if let ty::Tuple(subs) = subs.type_at(0).kind();
if subs.len() == 2; if subs.len() == 2;
then { then {
@ -193,7 +193,7 @@ fn parse_iter_usage(
&& cx && cx
.typeck_results() .typeck_results()
.type_dependent_def_id(e.hir_id) .type_dependent_def_id(e.hir_id)
.map_or(false, |id| is_diag_item_method(cx, id, sym::option_type)) => .map_or(false, |id| is_diag_item_method(cx, id, sym::Option)) =>
{ {
(Some(UnwrapKind::Unwrap), e.span) (Some(UnwrapKind::Unwrap), e.span)
}, },

View file

@ -36,14 +36,14 @@ fn parse_repeat_arg(cx: &LateContext<'_>, e: &Expr<'_>) -> Option<RepeatKind> {
} }
} else { } else {
let ty = cx.typeck_results().expr_ty(e); let ty = cx.typeck_results().expr_ty(e);
if is_type_diagnostic_item(cx, ty, sym::string_type) if is_type_diagnostic_item(cx, ty, sym::String)
|| (is_type_lang_item(cx, ty, LangItem::OwnedBox) && get_ty_param(ty).map_or(false, TyS::is_str)) || (is_type_lang_item(cx, ty, LangItem::OwnedBox) && get_ty_param(ty).map_or(false, TyS::is_str))
|| (match_type(cx, ty, &paths::COW) && get_ty_param(ty).map_or(false, TyS::is_str)) || (match_type(cx, ty, &paths::COW) && get_ty_param(ty).map_or(false, TyS::is_str))
{ {
Some(RepeatKind::String) Some(RepeatKind::String)
} else { } else {
let ty = ty.peel_refs(); let ty = ty.peel_refs();
(ty.is_str() || is_type_diagnostic_item(cx, ty, sym::string_type)).then(|| RepeatKind::String) (ty.is_str() || is_type_diagnostic_item(cx, ty, sym::String)).then(|| RepeatKind::String)
} }
} }
} }
@ -58,7 +58,7 @@ pub(super) fn check(
if_chain! { if_chain! {
if let ExprKind::Call(repeat_fn, [repeat_arg]) = take_self_arg.kind; if let ExprKind::Call(repeat_fn, [repeat_arg]) = take_self_arg.kind;
if is_expr_path_def_path(cx, repeat_fn, &paths::ITER_REPEAT); if is_expr_path_def_path(cx, repeat_fn, &paths::ITER_REPEAT);
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(collect_expr), sym::string_type); if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(collect_expr), sym::String);
if let Some(collect_id) = cx.typeck_results().type_dependent_def_id(collect_expr.hir_id); if let Some(collect_id) = cx.typeck_results().type_dependent_def_id(collect_expr.hir_id);
if let Some(take_id) = cx.typeck_results().type_dependent_def_id(take_expr.hir_id); if let Some(take_id) = cx.typeck_results().type_dependent_def_id(take_expr.hir_id);
if let Some(iter_trait_id) = cx.tcx.get_diagnostic_item(sym::Iterator); if let Some(iter_trait_id) = cx.tcx.get_diagnostic_item(sym::Iterator);

View file

@ -23,7 +23,7 @@ pub(super) fn check(
if is_trait_method(cx, collect_recv, sym::Iterator); if is_trait_method(cx, collect_recv, sym::Iterator);
// return of collect `Result<(),_>` // return of collect `Result<(),_>`
let collect_ret_ty = cx.typeck_results().expr_ty(expr); let collect_ret_ty = cx.typeck_results().expr_ty(expr);
if is_type_diagnostic_item(cx, collect_ret_ty, sym::result_type); if is_type_diagnostic_item(cx, collect_ret_ty, sym::Result);
if let ty::Adt(_, substs) = collect_ret_ty.kind(); if let ty::Adt(_, substs) = collect_ret_ty.kind();
if let Some(result_t) = substs.types().next(); if let Some(result_t) = substs.types().next();
if result_t.is_unit(); if result_t.is_unit();

View file

@ -27,7 +27,7 @@ pub(super) fn check<'tcx>(
_ => map_closure_ty.fn_sig(cx.tcx), _ => map_closure_ty.fn_sig(cx.tcx),
}; };
let map_closure_return_ty = cx.tcx.erase_late_bound_regions(map_closure_sig.output()); let map_closure_return_ty = cx.tcx.erase_late_bound_regions(map_closure_sig.output());
is_type_diagnostic_item(cx, map_closure_return_ty, sym::option_type) is_type_diagnostic_item(cx, map_closure_return_ty, sym::Option)
}, },
_ => false, _ => false,
}; };
@ -55,9 +55,9 @@ pub(super) fn check<'tcx>(
// lint if caller of `.map().flatten()` is an Option or Result // lint if caller of `.map().flatten()` is an Option or Result
let caller_type = match cx.typeck_results().expr_ty(recv).kind() { let caller_type = match cx.typeck_results().expr_ty(recv).kind() {
ty::Adt(adt, _) => { ty::Adt(adt, _) => {
if cx.tcx.is_diagnostic_item(sym::option_type, adt.did) { if cx.tcx.is_diagnostic_item(sym::Option, adt.did) {
"Option" "Option"
} else if cx.tcx.is_diagnostic_item(sym::result_type, adt.did) { } else if cx.tcx.is_diagnostic_item(sym::Result, adt.did) {
"Result" "Result"
} else { } else {
return; return;

View file

@ -19,8 +19,8 @@ pub(super) fn check(
if_chain! { if_chain! {
if is_trait_method(cx, expr, sym::Iterator) if is_trait_method(cx, expr, sym::Iterator)
|| is_type_diagnostic_item(cx, caller_ty, sym::result_type) || is_type_diagnostic_item(cx, caller_ty, sym::Result)
|| is_type_diagnostic_item(cx, caller_ty, sym::option_type); || is_type_diagnostic_item(cx, caller_ty, sym::Option);
if is_expr_identity_function(cx, map_arg); if is_expr_identity_function(cx, map_arg);
if let Some(sugg_span) = expr.span.trim_start(caller.span); if let Some(sugg_span) = expr.span.trim_start(caller.span);
then { then {

View file

@ -22,8 +22,8 @@ pub(super) fn check<'tcx>(
msrv: Option<&RustcVersion>, msrv: Option<&RustcVersion>,
) -> bool { ) -> bool {
// lint if the caller of `map()` is an `Option` // lint if the caller of `map()` is an `Option`
let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::option_type); let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Option);
let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::result_type); let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Result);
if is_result && !meets_msrv(msrv, &msrvs::RESULT_MAP_OR_ELSE) { if is_result && !meets_msrv(msrv, &msrvs::RESULT_MAP_OR_ELSE) {
return false; return false;

View file

@ -12,7 +12,7 @@ use super::OK_EXPECT;
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) { pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) {
if_chain! { if_chain! {
// lint if the caller of `ok()` is a `Result` // lint if the caller of `ok()` is a `Result`
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::result_type); if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Result);
let result_type = cx.typeck_results().expr_ty(recv); let result_type = cx.typeck_results().expr_ty(recv);
if let Some(error_type) = get_error_type(cx, result_type); if let Some(error_type) = get_error_type(cx, result_type);
if has_debug_impl(error_type, cx); if has_debug_impl(error_type, cx);
@ -33,7 +33,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr
/// Given a `Result<T, E>` type, return its error type (`E`). /// Given a `Result<T, E>` type, return its error type (`E`).
fn get_error_type<'a>(cx: &LateContext<'_>, ty: Ty<'a>) -> Option<Ty<'a>> { fn get_error_type<'a>(cx: &LateContext<'_>, ty: Ty<'a>) -> Option<Ty<'a>> {
match ty.kind() { match ty.kind() {
ty::Adt(_, substs) if is_type_diagnostic_item(cx, ty, sym::result_type) => substs.types().nth(1), ty::Adt(_, substs) if is_type_diagnostic_item(cx, ty, sym::Result) => substs.types().nth(1),
_ => None, _ => None,
} }
} }
@ -41,6 +41,6 @@ fn get_error_type<'a>(cx: &LateContext<'_>, ty: Ty<'a>) -> Option<Ty<'a>> {
/// This checks whether a given type is known to implement Debug. /// This checks whether a given type is known to implement Debug.
fn has_debug_impl<'tcx>(ty: Ty<'tcx>, cx: &LateContext<'tcx>) -> bool { fn has_debug_impl<'tcx>(ty: Ty<'tcx>, cx: &LateContext<'tcx>) -> bool {
cx.tcx cx.tcx
.get_diagnostic_item(sym::debug_trait) .get_diagnostic_item(sym::Debug)
.map_or(false, |debug| implements_trait(cx, ty, debug, &[])) .map_or(false, |debug| implements_trait(cx, ty, debug, &[]))
} }

View file

@ -28,7 +28,7 @@ pub(super) fn check<'tcx>(
let same_mutability = |m| (is_mut && m == &hir::Mutability::Mut) || (!is_mut && m == &hir::Mutability::Not); let same_mutability = |m| (is_mut && m == &hir::Mutability::Mut) || (!is_mut && m == &hir::Mutability::Not);
let option_ty = cx.typeck_results().expr_ty(as_ref_recv); let option_ty = cx.typeck_results().expr_ty(as_ref_recv);
if !is_type_diagnostic_item(cx, option_ty, sym::option_type) { if !is_type_diagnostic_item(cx, option_ty, sym::Option) {
return; return;
} }

View file

@ -19,8 +19,8 @@ pub(super) fn check<'tcx>(
def_arg: &'tcx hir::Expr<'_>, def_arg: &'tcx hir::Expr<'_>,
map_arg: &'tcx hir::Expr<'_>, map_arg: &'tcx hir::Expr<'_>,
) { ) {
let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::option_type); let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Option);
let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::result_type); let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Result);
// There are two variants of this `map_or` lint: // There are two variants of this `map_or` lint:
// (1) using `map_or` as an adapter from `Result<T,E>` to `Option<T>` // (1) using `map_or` as an adapter from `Result<T,E>` to `Option<T>`

View file

@ -25,7 +25,7 @@ pub(super) fn check<'tcx>(
map_span: Span, map_span: Span,
) { ) {
// lint if the caller of `map()` is an `Option` // lint if the caller of `map()` is an `Option`
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::option_type) { if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Option) {
if !is_copy(cx, cx.typeck_results().expr_ty(unwrap_arg)) { if !is_copy(cx, cx.typeck_results().expr_ty(unwrap_arg)) {
// Do not lint if the `map` argument uses identifiers in the `map` // Do not lint if the `map` argument uses identifiers in the `map`
// argument that are also used in the `unwrap_or` argument // argument that are also used in the `unwrap_or` argument

View file

@ -105,7 +105,7 @@ pub(super) fn check<'tcx>(
_ => (), _ => (),
} }
if is_type_diagnostic_item(cx, ty, sym::vec_type) { if is_type_diagnostic_item(cx, ty, sym::Vec) {
return; return;
} }
} }

View file

@ -101,7 +101,7 @@ pub(super) fn check<'tcx>(
else if search_method == "find" { else if search_method == "find" {
let is_string_or_str_slice = |e| { let is_string_or_str_slice = |e| {
let self_ty = cx.typeck_results().expr_ty(e).peel_refs(); let self_ty = cx.typeck_results().expr_ty(e).peel_refs();
if is_type_diagnostic_item(cx, self_ty, sym::string_type) { if is_type_diagnostic_item(cx, self_ty, sym::String) {
true true
} else { } else {
*self_ty.kind() == ty::Str *self_ty.kind() == ty::Str

View file

@ -12,7 +12,7 @@ use super::STRING_EXTEND_CHARS;
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>, arg: &hir::Expr<'_>) { pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>, arg: &hir::Expr<'_>) {
let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs(); let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs();
if !is_type_diagnostic_item(cx, obj_ty, sym::string_type) { if !is_type_diagnostic_item(cx, obj_ty, sym::String) {
return; return;
} }
if let Some(arglists) = method_chain_args(arg, &["chars"]) { if let Some(arglists) = method_chain_args(arg, &["chars"]) {
@ -20,7 +20,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr
let self_ty = cx.typeck_results().expr_ty(target).peel_refs(); let self_ty = cx.typeck_results().expr_ty(target).peel_refs();
let ref_str = if *self_ty.kind() == ty::Str { let ref_str = if *self_ty.kind() == ty::Str {
"" ""
} else if is_type_diagnostic_item(cx, self_ty, sym::string_type) { } else if is_type_diagnostic_item(cx, self_ty, sym::String) {
"&" "&"
} else { } else {
return; return;

View file

@ -35,7 +35,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, arg: &hir::Expr<
let in_ty = cx.typeck_results().node_type(body.params[0].hir_id); let in_ty = cx.typeck_results().node_type(body.params[0].hir_id);
match cx.typeck_results().expr_ty(&body.value).kind() { match cx.typeck_results().expr_ty(&body.value).kind() {
ty::Adt(adt, subst) ty::Adt(adt, subst)
if cx.tcx.is_diagnostic_item(sym::option_type, adt.did) if cx.tcx.is_diagnostic_item(sym::Option, adt.did)
&& TyS::same_type(in_ty, subst.type_at(0)) => && TyS::same_type(in_ty, subst.type_at(0)) =>
{ {
"filter" "filter"

View file

@ -18,8 +18,8 @@ pub(super) fn check<'tcx>(
arg: &'tcx hir::Expr<'_>, arg: &'tcx hir::Expr<'_>,
simplify_using: &str, simplify_using: &str,
) { ) {
let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::option_type); let is_option = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Option);
let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::result_type); let is_result = is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(recv), sym::Result);
if is_option || is_result { if is_option || is_result {
if let hir::ExprKind::Closure(_, _, eid, _, _) = arg.kind { if let hir::ExprKind::Closure(_, _, eid, _, _) = arg.kind {

View file

@ -19,8 +19,8 @@ pub(super) fn check<'tcx>(
// ^^^^^^^^^- recv ^^^^^^^^^^^^^^^^- u_arg // ^^^^^^^^^- recv ^^^^^^^^^^^^^^^^- u_arg
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- expr // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^- expr
let recv_ty = cx.typeck_results().expr_ty(recv); let recv_ty = cx.typeck_results().expr_ty(recv);
let is_option = is_type_diagnostic_item(cx, recv_ty, sym::option_type); let is_option = is_type_diagnostic_item(cx, recv_ty, sym::Option);
let is_result = is_type_diagnostic_item(cx, recv_ty, sym::result_type); let is_result = is_type_diagnostic_item(cx, recv_ty, sym::Result);
if_chain! { if_chain! {
if is_option || is_result; if is_option || is_result;

View file

@ -10,9 +10,9 @@ use super::UNWRAP_USED;
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) { pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>) {
let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs(); let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs();
let mess = if is_type_diagnostic_item(cx, obj_ty, sym::option_type) { let mess = if is_type_diagnostic_item(cx, obj_ty, sym::Option) {
Some((UNWRAP_USED, "an Option", "None")) Some((UNWRAP_USED, "an Option", "None"))
} else if is_type_diagnostic_item(cx, obj_ty, sym::result_type) { } else if is_type_diagnostic_item(cx, obj_ty, sym::Result) {
Some((UNWRAP_USED, "a Result", "Err")) Some((UNWRAP_USED, "a Result", "Err"))
} else { } else {
None None

View file

@ -17,7 +17,7 @@ pub(super) fn derefs_to_slice<'tcx>(
match ty.kind() { match ty.kind() {
ty::Slice(_) => true, ty::Slice(_) => true,
ty::Adt(def, _) if def.is_box() => may_slice(cx, ty.boxed_ty()), ty::Adt(def, _) if def.is_box() => may_slice(cx, ty.boxed_ty()),
ty::Adt(..) => is_type_diagnostic_item(cx, ty, sym::vec_type), ty::Adt(..) => is_type_diagnostic_item(cx, ty, sym::Vec),
ty::Array(_, size) => size.try_eval_usize(cx.tcx, cx.param_env).is_some(), ty::Array(_, size) => size.try_eval_usize(cx.tcx, cx.param_env).is_some(),
ty::Ref(_, inner, _) => may_slice(cx, inner), ty::Ref(_, inner, _) => may_slice(cx, inner),
_ => false, _ => false,

View file

@ -122,7 +122,7 @@ fn check_sig<'tcx>(cx: &LateContext<'tcx>, item_hir_id: hir::HirId, decl: &hir::
fn check_ty<'tcx>(cx: &LateContext<'tcx>, span: Span, ty: Ty<'tcx>) { fn check_ty<'tcx>(cx: &LateContext<'tcx>, span: Span, ty: Ty<'tcx>) {
let ty = ty.peel_refs(); let ty = ty.peel_refs();
if let Adt(def, substs) = ty.kind() { if let Adt(def, substs) = ty.kind() {
let is_keyed_type = [sym::hashmap_type, sym::BTreeMap, sym::hashset_type, sym::BTreeSet] let is_keyed_type = [sym::HashMap, sym::BTreeMap, sym::HashSet, sym::BTreeSet]
.iter() .iter()
.any(|diag_item| cx.tcx.is_diagnostic_item(*diag_item, def.did)); .any(|diag_item| cx.tcx.is_diagnostic_item(*diag_item, def.did));
if is_keyed_type && is_interior_mutable_type(cx, substs.type_at(0), span) { if is_keyed_type && is_interior_mutable_type(cx, substs.type_at(0), span) {
@ -147,11 +147,11 @@ fn is_interior_mutable_type<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>, span: Sp
// that of their type parameters. Note: we don't include `HashSet` and `HashMap` // that of their type parameters. Note: we don't include `HashSet` and `HashMap`
// because they have no impl for `Hash` or `Ord`. // because they have no impl for `Hash` or `Ord`.
let is_std_collection = [ let is_std_collection = [
sym::option_type, sym::Option,
sym::result_type, sym::Result,
sym::LinkedList, sym::LinkedList,
sym::vec_type, sym::Vec,
sym::vecdeque_type, sym::VecDeque,
sym::BTreeMap, sym::BTreeMap,
sym::BTreeSet, sym::BTreeSet,
sym::Rc, sym::Rc,

View file

@ -6,6 +6,7 @@ use rustc_hir::{Expr, ExprKind, Mutability};
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::ty; use rustc_middle::ty;
use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::sym;
declare_clippy_lint! { declare_clippy_lint! {
/// ### What it does /// ### What it does
@ -51,7 +52,7 @@ impl<'tcx> LateLintPass<'tcx> for MutMutexLock {
if path.ident.name == sym!(lock); if path.ident.name == sym!(lock);
let ty = cx.typeck_results().expr_ty(self_arg); let ty = cx.typeck_results().expr_ty(self_arg);
if let ty::Ref(_, inner_ty, Mutability::Mut) = ty.kind(); if let ty::Ref(_, inner_ty, Mutability::Mut) = ty.kind();
if is_type_diagnostic_item(cx, inner_ty, sym!(mutex_type)); if is_type_diagnostic_item(cx, inner_ty, sym::Mutex);
then { then {
span_lint_and_sugg( span_lint_and_sugg(
cx, cx,

View file

@ -8,6 +8,7 @@ use rustc_hir::Expr;
use rustc_lint::{LateContext, LateLintPass}; use rustc_lint::{LateContext, LateLintPass};
use rustc_middle::ty::{self, Ty}; use rustc_middle::ty::{self, Ty};
use rustc_session::{declare_lint_pass, declare_tool_lint}; use rustc_session::{declare_lint_pass, declare_tool_lint};
use rustc_span::sym;
declare_clippy_lint! { declare_clippy_lint! {
/// ### What it does /// ### What it does
@ -74,7 +75,7 @@ impl<'tcx> LateLintPass<'tcx> for Mutex {
fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) { fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) {
let ty = cx.typeck_results().expr_ty(expr); let ty = cx.typeck_results().expr_ty(expr);
if let ty::Adt(_, subst) = ty.kind() { if let ty::Adt(_, subst) = ty.kind() {
if is_type_diagnostic_item(cx, ty, sym!(mutex_type)) { if is_type_diagnostic_item(cx, ty, sym::Mutex) {
let mutex_param = subst.type_at(0); let mutex_param = subst.type_at(0);
if let Some(atomic_name) = get_atomic_name(mutex_param) { if let Some(atomic_name) = get_atomic_name(mutex_param) {
let msg = format!( let msg = format!(

View file

@ -45,7 +45,7 @@ impl<'tcx> LateLintPass<'tcx> for OptionNeedlessDeref {
let outer_ty = typeck.expr_ty(expr); let outer_ty = typeck.expr_ty(expr);
if_chain! { if_chain! {
if is_type_diagnostic_item(cx,outer_ty,sym::option_type); if is_type_diagnostic_item(cx,outer_ty,sym::Option);
if let ExprKind::MethodCall(path, _, [sub_expr], _) = expr.kind; if let ExprKind::MethodCall(path, _, [sub_expr], _) = expr.kind;
let symbol = path.ident.as_str(); let symbol = path.ident.as_str();
if symbol=="as_deref" || symbol=="as_deref_mut"; if symbol=="as_deref" || symbol=="as_deref_mut";

View file

@ -206,7 +206,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
let deref_span = spans_need_deref.get(&canonical_id); let deref_span = spans_need_deref.get(&canonical_id);
if_chain! { if_chain! {
if is_type_diagnostic_item(cx, ty, sym::vec_type); if is_type_diagnostic_item(cx, ty, sym::Vec);
if let Some(clone_spans) = if let Some(clone_spans) =
get_spans(cx, Some(body.id()), idx, &[("clone", ".to_owned()")]); get_spans(cx, Some(body.id()), idx, &[("clone", ".to_owned()")]);
if let TyKind::Path(QPath::Resolved(_, path)) = input.kind; if let TyKind::Path(QPath::Resolved(_, path)) = input.kind;
@ -245,7 +245,7 @@ impl<'tcx> LateLintPass<'tcx> for NeedlessPassByValue {
} }
} }
if is_type_diagnostic_item(cx, ty, sym::string_type) { if is_type_diagnostic_item(cx, ty, sym::String) {
if let Some(clone_spans) = if let Some(clone_spans) =
get_spans(cx, Some(body.id()), idx, &[("clone", ".to_string()"), ("as_str", "")]) { get_spans(cx, Some(body.id()), idx, &[("clone", ".to_string()"), ("as_str", "")]) {
diag.span_suggestion( diag.span_suggestion(

View file

@ -70,7 +70,7 @@ declare_lint_pass!(OptionIfLetElse => [OPTION_IF_LET_ELSE]);
fn is_result_ok(cx: &LateContext<'_>, expr: &'_ Expr<'_>) -> bool { fn is_result_ok(cx: &LateContext<'_>, expr: &'_ Expr<'_>) -> bool {
if let ExprKind::MethodCall(path, _, &[ref receiver], _) = &expr.kind { if let ExprKind::MethodCall(path, _, &[ref receiver], _) = &expr.kind {
path.ident.name.as_str() == "ok" path.ident.name.as_str() == "ok"
&& is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(receiver), sym::result_type) && is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(receiver), sym::Result)
} else { } else {
false false
} }

View file

@ -47,7 +47,7 @@ impl<'tcx> LateLintPass<'tcx> for PanicInResultFn {
span: Span, span: Span,
hir_id: hir::HirId, hir_id: hir::HirId,
) { ) {
if !matches!(fn_kind, FnKind::Closure) && is_type_diagnostic_item(cx, return_ty(cx, hir_id), sym::result_type) { if !matches!(fn_kind, FnKind::Closure) && is_type_diagnostic_item(cx, return_ty(cx, hir_id), sym::Result) {
lint_impl_body(cx, span, body); lint_impl_body(cx, span, body);
} }
} }

View file

@ -258,7 +258,7 @@ fn check_fn(cx: &LateContext<'_>, decl: &FnDecl<'_>, fn_id: HirId, opt_body_id:
} }
if let ty::Ref(_, ty, Mutability::Not) = ty.kind() { if let ty::Ref(_, ty, Mutability::Not) = ty.kind() {
if is_type_diagnostic_item(cx, ty, sym::vec_type) { if is_type_diagnostic_item(cx, ty, sym::Vec) {
if let Some(spans) = get_spans(cx, opt_body_id, idx, &[("clone", ".to_owned()")]) { if let Some(spans) = get_spans(cx, opt_body_id, idx, &[("clone", ".to_owned()")]) {
span_lint_and_then( span_lint_and_then(
cx, cx,
@ -288,7 +288,7 @@ fn check_fn(cx: &LateContext<'_>, decl: &FnDecl<'_>, fn_id: HirId, opt_body_id:
}, },
); );
} }
} else if is_type_diagnostic_item(cx, ty, sym::string_type) { } else if is_type_diagnostic_item(cx, ty, sym::String) {
if let Some(spans) = get_spans(cx, opt_body_id, idx, &[("clone", ".to_string()"), ("as_str", "")]) { if let Some(spans) = get_spans(cx, opt_body_id, idx, &[("clone", ".to_string()"), ("as_str", "")]) {
span_lint_and_then( span_lint_and_then(
cx, cx,

View file

@ -143,7 +143,7 @@ impl QuestionMark {
fn is_option(cx: &LateContext<'_>, expression: &Expr<'_>) -> bool { fn is_option(cx: &LateContext<'_>, expression: &Expr<'_>) -> bool {
let expr_ty = cx.typeck_results().expr_ty(expression); let expr_ty = cx.typeck_results().expr_ty(expression);
is_type_diagnostic_item(cx, expr_ty, sym::option_type) is_type_diagnostic_item(cx, expr_ty, sym::Option)
} }
fn expression_returns_none(cx: &LateContext<'_>, expression: &Expr<'_>) -> bool { fn expression_returns_none(cx: &LateContext<'_>, expression: &Expr<'_>) -> bool {

View file

@ -123,7 +123,7 @@ impl<'tcx> LateLintPass<'tcx> for RedundantClone {
let from_borrow = match_def_path(cx, fn_def_id, &paths::CLONE_TRAIT_METHOD) let from_borrow = match_def_path(cx, fn_def_id, &paths::CLONE_TRAIT_METHOD)
|| match_def_path(cx, fn_def_id, &paths::TO_OWNED_METHOD) || match_def_path(cx, fn_def_id, &paths::TO_OWNED_METHOD)
|| (match_def_path(cx, fn_def_id, &paths::TO_STRING_METHOD) || (match_def_path(cx, fn_def_id, &paths::TO_STRING_METHOD)
&& is_type_diagnostic_item(cx, arg_ty, sym::string_type)); && is_type_diagnostic_item(cx, arg_ty, sym::String));
let from_deref = !from_borrow let from_deref = !from_borrow
&& (match_def_path(cx, fn_def_id, &paths::PATH_TO_PATH_BUF) && (match_def_path(cx, fn_def_id, &paths::PATH_TO_PATH_BUF)

View file

@ -45,7 +45,7 @@ impl<'tcx> LateLintPass<'tcx> for RefOptionRef {
if let Some(res) = last.res; if let Some(res) = last.res;
if let Some(def_id) = res.opt_def_id(); if let Some(def_id) = res.opt_def_id();
if cx.tcx.is_diagnostic_item(sym::option_type, def_id); if cx.tcx.is_diagnostic_item(sym::Option, def_id);
if let Some(params) = last_path_segment(qpath).args ; if let Some(params) = last_path_segment(qpath).args ;
if !params.parenthesized; if !params.parenthesized;
if let Some(inner_ty) = params.args.iter().find_map(|arg| match arg { if let Some(inner_ty) = params.args.iter().find_map(|arg| match arg {

View file

@ -72,7 +72,7 @@ impl<'tcx> LateLintPass<'tcx> for RepeatOnce {
format!("{}.to_vec()", snippet(cx, receiver.span, r#""...""#)), format!("{}.to_vec()", snippet(cx, receiver.span, r#""...""#)),
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} else if is_type_diagnostic_item(cx, ty, sym::string_type) { } else if is_type_diagnostic_item(cx, ty, sym::String) {
span_lint_and_sugg( span_lint_and_sugg(
cx, cx,
REPEAT_ONCE, REPEAT_ONCE,

View file

@ -120,7 +120,7 @@ impl SlowVectorInit {
if let ExprKind::Call(func, [arg]) = expr.kind; if let ExprKind::Call(func, [arg]) = expr.kind;
if let ExprKind::Path(QPath::TypeRelative(ty, name)) = func.kind; if let ExprKind::Path(QPath::TypeRelative(ty, name)) = func.kind;
if name.ident.as_str() == "with_capacity"; if name.ident.as_str() == "with_capacity";
if is_type_diagnostic_item(cx, cx.typeck_results().node_type(ty.hir_id), sym::vec_type); if is_type_diagnostic_item(cx, cx.typeck_results().node_type(ty.hir_id), sym::Vec);
then { then {
Some(arg) Some(arg)
} else { } else {

View file

@ -157,7 +157,7 @@ impl<'tcx> LateLintPass<'tcx> for StringAdd {
} }
fn is_string(cx: &LateContext<'_>, e: &Expr<'_>) -> bool { fn is_string(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(e).peel_refs(), sym::string_type) is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(e).peel_refs(), sym::String)
} }
fn is_add(cx: &LateContext<'_>, src: &Expr<'_>, target: &Expr<'_>) -> bool { fn is_add(cx: &LateContext<'_>, src: &Expr<'_>, target: &Expr<'_>) -> bool {
@ -397,7 +397,7 @@ impl LateLintPass<'_> for StringToString {
if let ExprKind::MethodCall(path, _, [self_arg, ..], _) = &expr.kind; if let ExprKind::MethodCall(path, _, [self_arg, ..], _) = &expr.kind;
if path.ident.name == sym!(to_string); if path.ident.name == sym!(to_string);
let ty = cx.typeck_results().expr_ty(self_arg); let ty = cx.typeck_results().expr_ty(self_arg);
if is_type_diagnostic_item(cx, ty, sym::string_type); if is_type_diagnostic_item(cx, ty, sym::String);
then { then {
span_lint_and_help( span_lint_and_help(
cx, cx,

View file

@ -86,8 +86,8 @@ fn generate_swap_warning(cx: &LateContext<'_>, e1: &Expr<'_>, e2: &Expr<'_>, spa
if matches!(ty.kind(), ty::Slice(_)) if matches!(ty.kind(), ty::Slice(_))
|| matches!(ty.kind(), ty::Array(_, _)) || matches!(ty.kind(), ty::Array(_, _))
|| is_type_diagnostic_item(cx, ty, sym::vec_type) || is_type_diagnostic_item(cx, ty, sym::Vec)
|| is_type_diagnostic_item(cx, ty, sym::vecdeque_type) || is_type_diagnostic_item(cx, ty, sym::VecDeque)
{ {
let slice = Sugg::hir_with_applicability(cx, lhs1, "<slice>", &mut applicability); let slice = Sugg::hir_with_applicability(cx, lhs1, "<slice>", &mut applicability);
span_lint_and_sugg( span_lint_and_sugg(
@ -231,7 +231,7 @@ fn check_xor_swap(cx: &LateContext<'_>, block: &Block<'_>) {
} }
} }
/// Returns the lhs and rhs of an xor assignment statement. /// Returns the lhs and rhs of an xor assignment statement.
fn extract_sides_of_xor_assign<'a, 'hir>(stmt: &'a Stmt<'hir>) -> Option<(&'a Expr<'hir>, &'a Expr<'hir>)> { fn extract_sides_of_xor_assign<'a, 'hir>(stmt: &'a Stmt<'hir>) -> Option<(&'a Expr<'hir>, &'a Expr<'hir>)> {
if let StmtKind::Semi(expr) = stmt.kind { if let StmtKind::Semi(expr) = stmt.kind {
if let ExprKind::AssignOp( if let ExprKind::AssignOp(

View file

@ -9,13 +9,13 @@ use rustc_span::symbol::{sym, Symbol};
// used to check for UNSOUND_COLLECTION_TRANSMUTE // used to check for UNSOUND_COLLECTION_TRANSMUTE
static COLLECTIONS: &[Symbol] = &[ static COLLECTIONS: &[Symbol] = &[
sym::vec_type, sym::Vec,
sym::vecdeque_type, sym::VecDeque,
sym::BinaryHeap, sym::BinaryHeap,
sym::BTreeSet, sym::BTreeSet,
sym::BTreeMap, sym::BTreeMap,
sym::hashset_type, sym::HashSet,
sym::hashmap_type, sym::HashMap,
]; ];
/// Checks for `unsound_collection_transmute` lint. /// Checks for `unsound_collection_transmute` lint.

View file

@ -143,7 +143,7 @@ fn find_return_type<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx ExprKind<'_>) -> O
fn result_error_type<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> Option<Ty<'tcx>> { fn result_error_type<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
if_chain! { if_chain! {
if let ty::Adt(_, subst) = ty.kind(); if let ty::Adt(_, subst) = ty.kind();
if is_type_diagnostic_item(cx, ty, sym::result_type); if is_type_diagnostic_item(cx, ty, sym::Result);
then { then {
Some(subst.type_at(1)) Some(subst.type_at(1))
} else { } else {
@ -160,7 +160,7 @@ fn poll_result_error_type<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> Option<
let ready_ty = subst.type_at(0); let ready_ty = subst.type_at(0);
if let ty::Adt(ready_def, ready_subst) = ready_ty.kind(); if let ty::Adt(ready_def, ready_subst) = ready_ty.kind();
if cx.tcx.is_diagnostic_item(sym::result_type, ready_def.did); if cx.tcx.is_diagnostic_item(sym::Result, ready_def.did);
then { then {
Some(ready_subst.type_at(1)) Some(ready_subst.type_at(1))
} else { } else {
@ -177,11 +177,11 @@ fn poll_option_result_error_type<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) ->
let ready_ty = subst.type_at(0); let ready_ty = subst.type_at(0);
if let ty::Adt(ready_def, ready_subst) = ready_ty.kind(); if let ty::Adt(ready_def, ready_subst) = ready_ty.kind();
if cx.tcx.is_diagnostic_item(sym::option_type, ready_def.did); if cx.tcx.is_diagnostic_item(sym::Option, ready_def.did);
let some_ty = ready_subst.type_at(0); let some_ty = ready_subst.type_at(0);
if let ty::Adt(some_def, some_subst) = some_ty.kind(); if let ty::Adt(some_def, some_subst) = some_ty.kind();
if cx.tcx.is_diagnostic_item(sym::result_type, some_def.did); if cx.tcx.is_diagnostic_item(sym::Result, some_def.did);
then { then {
Some(some_subst.type_at(1)) Some(some_subst.type_at(1))
} else { } else {

View file

@ -38,11 +38,11 @@ pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_
} }
fn get_std_collection(cx: &LateContext<'_>, qpath: &QPath<'_>) -> Option<&'static str> { fn get_std_collection(cx: &LateContext<'_>, qpath: &QPath<'_>) -> Option<&'static str> {
if is_ty_param_diagnostic_item(cx, qpath, sym::vec_type).is_some() { if is_ty_param_diagnostic_item(cx, qpath, sym::Vec).is_some() {
Some("Vec") Some("Vec")
} else if is_ty_param_diagnostic_item(cx, qpath, sym::string_type).is_some() { } else if is_ty_param_diagnostic_item(cx, qpath, sym::String).is_some() {
Some("String") Some("String")
} else if is_ty_param_diagnostic_item(cx, qpath, sym::hashmap_type).is_some() { } else if is_ty_param_diagnostic_item(cx, qpath, sym::HashMap).is_some() {
Some("HashMap") Some("HashMap")
} else { } else {
None None

View file

@ -7,8 +7,8 @@ use rustc_span::symbol::sym;
use super::OPTION_OPTION; use super::OPTION_OPTION;
pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool { pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool {
if cx.tcx.is_diagnostic_item(sym::option_type, def_id) if cx.tcx.is_diagnostic_item(sym::Option, def_id)
&& is_ty_param_diagnostic_item(cx, qpath, sym::option_type).is_some() && is_ty_param_diagnostic_item(cx, qpath, sym::Option).is_some()
{ {
span_lint( span_lint(
cx, cx,

View file

@ -20,7 +20,7 @@ pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_
format!("Rc<{}>", alternate), format!("Rc<{}>", alternate),
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} else if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::vec_type) { } else if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::Vec) {
let qpath = match &ty.kind { let qpath = match &ty.kind {
TyKind::Path(qpath) => qpath, TyKind::Path(qpath) => qpath,
_ => return false, _ => return false,
@ -55,7 +55,7 @@ pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_
format!("Arc<{}>", alternate), format!("Arc<{}>", alternate),
Applicability::MachineApplicable, Applicability::MachineApplicable,
); );
} else if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::vec_type) { } else if let Some(ty) = is_ty_param_diagnostic_item(cx, qpath, sym::Vec) {
let qpath = match &ty.kind { let qpath = match &ty.kind {
TyKind::Path(qpath) => qpath, TyKind::Path(qpath) => qpath,
_ => return false, _ => return false,
@ -85,7 +85,7 @@ pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_
} }
fn match_buffer_type(cx: &LateContext<'_>, qpath: &QPath<'_>) -> Option<&'static str> { fn match_buffer_type(cx: &LateContext<'_>, qpath: &QPath<'_>) -> Option<&'static str> {
if is_ty_param_diagnostic_item(cx, qpath, sym::string_type).is_some() { if is_ty_param_diagnostic_item(cx, qpath, sym::String).is_some() {
Some("str") Some("str")
} else if is_ty_param_diagnostic_item(cx, qpath, sym::OsString).is_some() { } else if is_ty_param_diagnostic_item(cx, qpath, sym::OsString).is_some() {
Some("std::ffi::OsStr") Some("std::ffi::OsStr")

View file

@ -10,7 +10,7 @@ use super::RC_MUTEX;
pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool { pub(super) fn check(cx: &LateContext<'_>, hir_ty: &hir::Ty<'_>, qpath: &QPath<'_>, def_id: DefId) -> bool {
if_chain! { if_chain! {
if cx.tcx.is_diagnostic_item(sym::Rc, def_id) ; if cx.tcx.is_diagnostic_item(sym::Rc, def_id) ;
if let Some(_) = is_ty_param_diagnostic_item(cx, qpath, sym!(mutex_type)) ; if let Some(_) = is_ty_param_diagnostic_item(cx, qpath, sym::Mutex) ;
then { then {
span_lint_and_help( span_lint_and_help(
cx, cx,

View file

@ -19,7 +19,7 @@ pub(super) fn check(
def_id: DefId, def_id: DefId,
box_size_threshold: u64, box_size_threshold: u64,
) -> bool { ) -> bool {
if cx.tcx.is_diagnostic_item(sym::vec_type, def_id) { if cx.tcx.is_diagnostic_item(sym::Vec, def_id) {
if_chain! { if_chain! {
// Get the _ part of Vec<_> // Get the _ part of Vec<_>
if let Some(last) = last_path_segment(qpath).args; if let Some(last) = last_path_segment(qpath).args;

View file

@ -168,7 +168,7 @@ fn detect_lint(cx: &LateContext<'_>, expr: &Expr<'_>) -> Option<LintTrigger> {
if let name = name_ident.ident.name.to_ident_string(); if let name = name_ident.ident.name.to_ident_string();
if name == "sort_by" || name == "sort_unstable_by"; if name == "sort_by" || name == "sort_unstable_by";
if let [vec, Expr { kind: ExprKind::Closure(_, _, closure_body_id, _, _), .. }] = args; if let [vec, Expr { kind: ExprKind::Closure(_, _, closure_body_id, _, _), .. }] = args;
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(vec), sym::vec_type); if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(vec), sym::Vec);
if let closure_body = cx.tcx.hir().body(*closure_body_id); if let closure_body = cx.tcx.hir().body(*closure_body_id);
if let &[ if let &[
Param { pat: Pat { kind: PatKind::Binding(_, _, left_ident, _), .. }, ..}, Param { pat: Pat { kind: PatKind::Binding(_, _, left_ident, _), .. }, ..},

View file

@ -101,9 +101,9 @@ impl<'tcx> LateLintPass<'tcx> for UnnecessaryWraps {
// Get the wrapper and inner types, if can't, abort. // Get the wrapper and inner types, if can't, abort.
let (return_type_label, lang_item, inner_type) = if let ty::Adt(adt_def, subst) = return_ty(cx, hir_id).kind() { let (return_type_label, lang_item, inner_type) = if let ty::Adt(adt_def, subst) = return_ty(cx, hir_id).kind() {
if cx.tcx.is_diagnostic_item(sym::option_type, adt_def.did) { if cx.tcx.is_diagnostic_item(sym::Option, adt_def.did) {
("Option", OptionSome, subst.type_at(0)) ("Option", OptionSome, subst.type_at(0))
} else if cx.tcx.is_diagnostic_item(sym::result_type, adt_def.did) { } else if cx.tcx.is_diagnostic_item(sym::Result, adt_def.did) {
("Result", ResultOk, subst.type_at(0)) ("Result", ResultOk, subst.type_at(0))
} else { } else {
return; return;

View file

@ -132,11 +132,11 @@ fn collect_unwrap_info<'tcx>(
is_entire_condition: bool, is_entire_condition: bool,
) -> Vec<UnwrapInfo<'tcx>> { ) -> Vec<UnwrapInfo<'tcx>> {
fn is_relevant_option_call(cx: &LateContext<'_>, ty: Ty<'_>, method_name: &str) -> bool { fn is_relevant_option_call(cx: &LateContext<'_>, ty: Ty<'_>, method_name: &str) -> bool {
is_type_diagnostic_item(cx, ty, sym::option_type) && ["is_some", "is_none"].contains(&method_name) is_type_diagnostic_item(cx, ty, sym::Option) && ["is_some", "is_none"].contains(&method_name)
} }
fn is_relevant_result_call(cx: &LateContext<'_>, ty: Ty<'_>, method_name: &str) -> bool { fn is_relevant_result_call(cx: &LateContext<'_>, ty: Ty<'_>, method_name: &str) -> bool {
is_type_diagnostic_item(cx, ty, sym::result_type) && ["is_ok", "is_err"].contains(&method_name) is_type_diagnostic_item(cx, ty, sym::Result) && ["is_ok", "is_err"].contains(&method_name)
} }
if let ExprKind::Binary(op, left, right) = &expr.kind { if let ExprKind::Binary(op, left, right) = &expr.kind {
@ -165,7 +165,7 @@ fn collect_unwrap_info<'tcx>(
_ => unreachable!(), _ => unreachable!(),
}; };
let safe_to_unwrap = unwrappable != invert; let safe_to_unwrap = unwrappable != invert;
let kind = if is_type_diagnostic_item(cx, ty, sym::option_type) { let kind = if is_type_diagnostic_item(cx, ty, sym::Option) {
UnwrappableKind::Option UnwrappableKind::Option
} else { } else {
UnwrappableKind::Result UnwrappableKind::Result

View file

@ -64,8 +64,8 @@ impl<'tcx> LateLintPass<'tcx> for UnwrapInResult {
// first check if it's a method or function // first check if it's a method or function
if let hir::ImplItemKind::Fn(ref _signature, _) = impl_item.kind; if let hir::ImplItemKind::Fn(ref _signature, _) = impl_item.kind;
// checking if its return type is `result` or `option` // checking if its return type is `result` or `option`
if is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::result_type) if is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::Result)
|| is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::option_type); || is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::Option);
then { then {
lint_impl_body(cx, impl_item.span, impl_item); lint_impl_body(cx, impl_item.span, impl_item);
} }
@ -86,8 +86,8 @@ impl<'a, 'tcx> Visitor<'tcx> for FindExpectUnwrap<'a, 'tcx> {
// check for `expect` // check for `expect`
if let Some(arglists) = method_chain_args(expr, &["expect"]) { if let Some(arglists) = method_chain_args(expr, &["expect"]) {
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs(); let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
if is_type_diagnostic_item(self.lcx, reciever_ty, sym::option_type) if is_type_diagnostic_item(self.lcx, reciever_ty, sym::Option)
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym::result_type) || is_type_diagnostic_item(self.lcx, reciever_ty, sym::Result)
{ {
self.result.push(expr.span); self.result.push(expr.span);
} }
@ -96,8 +96,8 @@ impl<'a, 'tcx> Visitor<'tcx> for FindExpectUnwrap<'a, 'tcx> {
// check for `unwrap` // check for `unwrap`
if let Some(arglists) = method_chain_args(expr, &["unwrap"]) { if let Some(arglists) = method_chain_args(expr, &["unwrap"]) {
let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs(); let reciever_ty = self.typeck_results.expr_ty(&arglists[0][0]).peel_refs();
if is_type_diagnostic_item(self.lcx, reciever_ty, sym::option_type) if is_type_diagnostic_item(self.lcx, reciever_ty, sym::Option)
|| is_type_diagnostic_item(self.lcx, reciever_ty, sym::result_type) || is_type_diagnostic_item(self.lcx, reciever_ty, sym::Result)
{ {
self.result.push(expr.span); self.result.push(expr.span);
} }

View file

@ -63,7 +63,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
}, },
ExprKind::MethodCall(name, .., args, _) => { ExprKind::MethodCall(name, .., args, _) => {
if is_trait_method(cx, e, sym::into_trait) && &*name.ident.as_str() == "into" { if is_trait_method(cx, e, sym::Into) && &*name.ident.as_str() == "into" {
let a = cx.typeck_results().expr_ty(e); let a = cx.typeck_results().expr_ty(e);
let b = cx.typeck_results().expr_ty(&args[0]); let b = cx.typeck_results().expr_ty(&args[0]);
if same_type_and_consts(a, b) { if same_type_and_consts(a, b) {
@ -103,10 +103,10 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
} }
} }
if_chain! { if_chain! {
if is_trait_method(cx, e, sym::try_into_trait) && name.ident.name == sym::try_into; if is_trait_method(cx, e, sym::TryInto) && name.ident.name == sym::try_into;
let a = cx.typeck_results().expr_ty(e); let a = cx.typeck_results().expr_ty(e);
let b = cx.typeck_results().expr_ty(&args[0]); let b = cx.typeck_results().expr_ty(&args[0]);
if is_type_diagnostic_item(cx, a, sym::result_type); if is_type_diagnostic_item(cx, a, sym::Result);
if let ty::Adt(_, substs) = a.kind(); if let ty::Adt(_, substs) = a.kind();
if let Some(a_type) = substs.types().next(); if let Some(a_type) = substs.types().next();
if same_type_and_consts(a_type, b); if same_type_and_consts(a_type, b);
@ -134,7 +134,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessConversion {
let b = cx.typeck_results().expr_ty(&args[0]); let b = cx.typeck_results().expr_ty(&args[0]);
if_chain! { if_chain! {
if match_def_path(cx, def_id, &paths::TRY_FROM); if match_def_path(cx, def_id, &paths::TRY_FROM);
if is_type_diagnostic_item(cx, a, sym::result_type); if is_type_diagnostic_item(cx, a, sym::Result);
if let ty::Adt(_, substs) = a.kind(); if let ty::Adt(_, substs) = a.kind();
if let Some(a_type) = substs.types().next(); if let Some(a_type) = substs.types().next();
if same_type_and_consts(a_type, b); if same_type_and_consts(a_type, b);

View file

@ -242,7 +242,7 @@ declare_clippy_lint! {
/// ///
/// Good: /// Good:
/// ```rust,ignore /// ```rust,ignore
/// utils::is_type_diagnostic_item(cx, ty, sym::vec_type) /// utils::is_type_diagnostic_item(cx, ty, sym::Vec)
/// ``` /// ```
pub MATCH_TYPE_ON_DIAGNOSTIC_ITEM, pub MATCH_TYPE_ON_DIAGNOSTIC_ITEM,
internal, internal,

View file

@ -157,7 +157,7 @@ fn get_vec_init_kind<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Op
if let ExprKind::Call(func, args) = expr.kind { if let ExprKind::Call(func, args) = expr.kind {
match func.kind { match func.kind {
ExprKind::Path(QPath::TypeRelative(ty, name)) ExprKind::Path(QPath::TypeRelative(ty, name))
if is_type_diagnostic_item(cx, cx.typeck_results().node_type(ty.hir_id), sym::vec_type) => if is_type_diagnostic_item(cx, cx.typeck_results().node_type(ty.hir_id), sym::Vec) =>
{ {
if name.ident.name == sym::new { if name.ident.name == sym::new {
return Some(VecInitKind::New); return Some(VecInitKind::New);
@ -177,7 +177,7 @@ fn get_vec_init_kind<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Op
} }
ExprKind::Path(QPath::Resolved(_, path)) ExprKind::Path(QPath::Resolved(_, path))
if match_def_path(cx, path.res.opt_def_id()?, &paths::DEFAULT_TRAIT_METHOD) if match_def_path(cx, path.res.opt_def_id()?, &paths::DEFAULT_TRAIT_METHOD)
&& is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::vec_type) => && is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(expr), sym::Vec) =>
{ {
return Some(VecInitKind::New); return Some(VecInitKind::New);
} }

View file

@ -49,7 +49,7 @@ impl LateLintPass<'_> for ZeroSizedMapValues {
if !hir_ty.span.from_expansion(); if !hir_ty.span.from_expansion();
if !in_trait_impl(cx, hir_ty.hir_id); if !in_trait_impl(cx, hir_ty.hir_id);
let ty = ty_from_hir_ty(cx, hir_ty); let ty = ty_from_hir_ty(cx, hir_ty);
if is_type_diagnostic_item(cx, ty, sym::hashmap_type) || is_type_diagnostic_item(cx, ty, sym::BTreeMap); if is_type_diagnostic_item(cx, ty, sym::HashMap) || is_type_diagnostic_item(cx, ty, sym::BTreeMap);
if let Adt(_, substs) = ty.kind(); if let Adt(_, substs) = ty.kind();
let ty = substs.type_at(1); let ty = substs.type_at(1);
// Fixes https://github.com/rust-lang/rust-clippy/issues/7447 because of // Fixes https://github.com/rust-lang/rust-clippy/issues/7447 because of

View file

@ -101,7 +101,7 @@ fn identify_some_potentially_expensive_patterns<'tcx>(cx: &LateContext<'tcx>, ex
ExprKind::Call(..) => !is_ctor_or_promotable_const_function(self.cx, expr), ExprKind::Call(..) => !is_ctor_or_promotable_const_function(self.cx, expr),
ExprKind::Index(obj, _) => { ExprKind::Index(obj, _) => {
let ty = self.cx.typeck_results().expr_ty(obj); let ty = self.cx.typeck_results().expr_ty(obj);
is_type_diagnostic_item(self.cx, ty, sym::hashmap_type) is_type_diagnostic_item(self.cx, ty, sym::HashMap)
|| is_type_diagnostic_item(self.cx, ty, sym::BTreeMap) || is_type_diagnostic_item(self.cx, ty, sym::BTreeMap)
}, },
ExprKind::MethodCall(..) => true, ExprKind::MethodCall(..) => true,

View file

@ -647,13 +647,13 @@ pub fn can_mut_borrow_both(cx: &LateContext<'_>, e1: &Expr<'_>, e2: &Expr<'_>) -
/// constructor from the std library /// constructor from the std library
fn is_default_equivalent_ctor(cx: &LateContext<'_>, def_id: DefId, path: &QPath<'_>) -> bool { fn is_default_equivalent_ctor(cx: &LateContext<'_>, def_id: DefId, path: &QPath<'_>) -> bool {
let std_types_symbols = &[ let std_types_symbols = &[
sym::string_type, sym::String,
sym::vec_type, sym::Vec,
sym::vecdeque_type, sym::VecDeque,
sym::LinkedList, sym::LinkedList,
sym::hashmap_type, sym::HashMap,
sym::BTreeMap, sym::BTreeMap,
sym::hashset_type, sym::HashSet,
sym::BTreeSet, sym::BTreeSet,
sym::BinaryHeap, sym::BinaryHeap,
]; ];

View file

@ -88,7 +88,7 @@ pub const MEM_SIZE_OF_VAL: [&str; 3] = ["core", "mem", "size_of_val"];
pub const MUTEX_GUARD: [&str; 4] = ["std", "sync", "mutex", "MutexGuard"]; pub const MUTEX_GUARD: [&str; 4] = ["std", "sync", "mutex", "MutexGuard"];
pub const OPEN_OPTIONS: [&str; 3] = ["std", "fs", "OpenOptions"]; pub const OPEN_OPTIONS: [&str; 3] = ["std", "fs", "OpenOptions"];
pub const OPS_MODULE: [&str; 2] = ["core", "ops"]; pub const OPS_MODULE: [&str; 2] = ["core", "ops"];
/// Preferably use the diagnostic item `sym::option_type` where possible /// Preferably use the diagnostic item `sym::Option` where possible
pub const OPTION: [&str; 3] = ["core", "option", "Option"]; pub const OPTION: [&str; 3] = ["core", "option", "Option"];
pub const OPTION_NONE: [&str; 4] = ["core", "option", "Option", "None"]; pub const OPTION_NONE: [&str; 4] = ["core", "option", "Option", "None"];
pub const OPTION_SOME: [&str; 4] = ["core", "option", "Option", "Some"]; pub const OPTION_SOME: [&str; 4] = ["core", "option", "Option", "Some"];
@ -135,7 +135,7 @@ pub const REGEX_BYTES_NEW: [&str; 4] = ["regex", "re_bytes", "Regex", "new"];
pub const REGEX_BYTES_SET_NEW: [&str; 5] = ["regex", "re_set", "bytes", "RegexSet", "new"]; pub const REGEX_BYTES_SET_NEW: [&str; 5] = ["regex", "re_set", "bytes", "RegexSet", "new"];
pub const REGEX_NEW: [&str; 4] = ["regex", "re_unicode", "Regex", "new"]; pub const REGEX_NEW: [&str; 4] = ["regex", "re_unicode", "Regex", "new"];
pub const REGEX_SET_NEW: [&str; 5] = ["regex", "re_set", "unicode", "RegexSet", "new"]; pub const REGEX_SET_NEW: [&str; 5] = ["regex", "re_set", "unicode", "RegexSet", "new"];
/// Preferably use the diagnostic item `sym::result_type` where possible /// Preferably use the diagnostic item `sym::Result` where possible
pub const RESULT: [&str; 3] = ["core", "result", "Result"]; pub const RESULT: [&str; 3] = ["core", "result", "Result"];
pub const RESULT_ERR: [&str; 4] = ["core", "result", "Result", "Err"]; pub const RESULT_ERR: [&str; 4] = ["core", "result", "Result", "Err"];
pub const RESULT_OK: [&str; 4] = ["core", "result", "Result", "Ok"]; pub const RESULT_OK: [&str; 4] = ["core", "result", "Result", "Ok"];

View file

@ -77,16 +77,16 @@ pub fn has_iter_method(cx: &LateContext<'_>, probably_ref_ty: Ty<'_>) -> Option<
// exists and has the desired signature. Unfortunately FnCtxt is not exported // exists and has the desired signature. Unfortunately FnCtxt is not exported
// so we can't use its `lookup_method` method. // so we can't use its `lookup_method` method.
let into_iter_collections: &[Symbol] = &[ let into_iter_collections: &[Symbol] = &[
sym::vec_type, sym::Vec,
sym::option_type, sym::Option,
sym::result_type, sym::Result,
sym::BTreeMap, sym::BTreeMap,
sym::BTreeSet, sym::BTreeSet,
sym::vecdeque_type, sym::VecDeque,
sym::LinkedList, sym::LinkedList,
sym::BinaryHeap, sym::BinaryHeap,
sym::hashset_type, sym::HashSet,
sym::hashmap_type, sym::HashMap,
sym::PathBuf, sym::PathBuf,
sym::Path, sym::Path,
sym::Receiver, sym::Receiver,

View file

@ -2,7 +2,7 @@ error: usage of `clippy_utils::ty::match_type()` on a type diagnostic item
--> $DIR/match_type_on_diag_item.rs:30:17 --> $DIR/match_type_on_diag_item.rs:30:17
| |
LL | let _ = match_type(cx, ty, &OPTION); LL | let _ = match_type(cx, ty, &OPTION);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `clippy_utils::ty::is_type_diagnostic_item(cx, ty, sym::option_type)` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `clippy_utils::ty::is_type_diagnostic_item(cx, ty, sym::Option)`
| |
note: the lint level is defined here note: the lint level is defined here
--> $DIR/match_type_on_diag_item.rs:1:9 --> $DIR/match_type_on_diag_item.rs:1:9
@ -15,7 +15,7 @@ error: usage of `clippy_utils::ty::match_type()` on a type diagnostic item
--> $DIR/match_type_on_diag_item.rs:31:17 --> $DIR/match_type_on_diag_item.rs:31:17
| |
LL | let _ = match_type(cx, ty, &["core", "result", "Result"]); LL | let _ = match_type(cx, ty, &["core", "result", "Result"]);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `clippy_utils::ty::is_type_diagnostic_item(cx, ty, sym::result_type)` | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `clippy_utils::ty::is_type_diagnostic_item(cx, ty, sym::Result)`
error: usage of `clippy_utils::ty::match_type()` on a type diagnostic item error: usage of `clippy_utils::ty::match_type()` on a type diagnostic item
--> $DIR/match_type_on_diag_item.rs:34:17 --> $DIR/match_type_on_diag_item.rs:34:17