Skip to content

Commit 80a4699

Browse files
committed
Auto merge of rust-lang#98914 - fee1-dead-contrib:min-deref-patterns, r=compiler-errors
Minimal implementation of implicit deref patterns for Strings cc `@compiler-errors` `@BoxyUwU` rust-lang/lang-team#88 rust-lang#87121 ~~I forgot to add a feature gate, will do so in a minute~~ Done
2 parents 27c4c17 + a09423f commit 80a4699

26 files changed

+95
-91
lines changed

clippy_lints/src/format.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ impl<'tcx> LateLintPass<'tcx> for UselessFormat {
7373
if format_args.format_string.parts == [kw::Empty];
7474
if arg.format.is_default();
7575
if match cx.typeck_results().expr_ty(value).peel_refs().kind() {
76-
ty::Adt(adt, _) => cx.tcx.is_diagnostic_item(sym::String, adt.did()),
76+
ty::Adt(adt, _) => Some(adt.did()) == cx.tcx.lang_items().string(),
7777
ty::Str => true,
7878
_ => false,
7979
};

clippy_lints/src/format_push_string.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_help;
2-
use clippy_utils::ty::is_type_diagnostic_item;
2+
use clippy_utils::ty::is_type_lang_item;
33
use clippy_utils::{match_def_path, paths, peel_hir_expr_refs};
4-
use rustc_hir::{BinOpKind, Expr, ExprKind};
4+
use rustc_hir::{BinOpKind, Expr, ExprKind, LangItem};
55
use rustc_lint::{LateContext, LateLintPass};
66
use rustc_session::{declare_lint_pass, declare_tool_lint};
77
use rustc_span::sym;
@@ -41,7 +41,7 @@ declare_clippy_lint! {
4141
declare_lint_pass!(FormatPushString => [FORMAT_PUSH_STRING]);
4242

4343
fn is_string(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
44-
is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(e).peel_refs(), sym::String)
44+
is_type_lang_item(cx, cx.typeck_results().expr_ty(e).peel_refs(), LangItem::String)
4545
}
4646
fn is_format(cx: &LateContext<'_>, e: &Expr<'_>) -> bool {
4747
if let Some(macro_def_id) = e.span.ctxt().outer_expn_data().macro_def_id {

clippy_lints/src/from_str_radix_10.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::is_integer_literal;
33
use clippy_utils::sugg::Sugg;
4-
use clippy_utils::ty::is_type_diagnostic_item;
4+
use clippy_utils::ty::{is_type_diagnostic_item, is_type_lang_item};
55
use if_chain::if_chain;
66
use rustc_errors::Applicability;
7-
use rustc_hir::{def, Expr, ExprKind, PrimTy, QPath, TyKind};
7+
use rustc_hir::{def, Expr, ExprKind, LangItem, PrimTy, QPath, TyKind};
88
use rustc_lint::{LateContext, LateLintPass};
99
use rustc_middle::ty::Ty;
1010
use rustc_session::{declare_lint_pass, declare_tool_lint};
@@ -98,5 +98,5 @@ impl<'tcx> LateLintPass<'tcx> for FromStrRadix10 {
9898

9999
/// Checks if a Ty is `String` or `&str`
100100
fn is_ty_stringish(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
101-
is_type_diagnostic_item(cx, ty, sym::String) || is_type_diagnostic_item(cx, ty, sym::str)
101+
is_type_lang_item(cx, ty, LangItem::String) || is_type_diagnostic_item(cx, ty, sym::str)
102102
}

clippy_lints/src/inherent_to_string.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use clippy_utils::diagnostics::span_lint_and_help;
2-
use clippy_utils::ty::{implements_trait, is_type_diagnostic_item};
2+
use clippy_utils::ty::{implements_trait, is_type_lang_item};
33
use clippy_utils::{return_ty, trait_ref_of_method};
44
use if_chain::if_chain;
5-
use rustc_hir::{GenericParamKind, ImplItem, ImplItemKind};
5+
use rustc_hir::{GenericParamKind, ImplItem, ImplItemKind, LangItem};
66
use rustc_lint::{LateContext, LateLintPass};
77
use rustc_session::{declare_lint_pass, declare_tool_lint};
88
use rustc_span::sym;
@@ -105,7 +105,7 @@ impl<'tcx> LateLintPass<'tcx> for InherentToString {
105105
if impl_item.generics.params.iter().all(|p| matches!(p.kind, GenericParamKind::Lifetime { .. }));
106106

107107
// Check if return type is String
108-
if is_type_diagnostic_item(cx, return_ty(cx, impl_item.hir_id()), sym::String);
108+
if is_type_lang_item(cx, return_ty(cx, impl_item.hir_id()), LangItem::String);
109109

110110
// Filters instances of to_string which are required by a trait
111111
if trait_ref_of_method(cx, impl_item.owner_id.def_id).is_none();

clippy_lints/src/manual_retain.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::snippet;
3-
use clippy_utils::ty::is_type_diagnostic_item;
3+
use clippy_utils::ty::{is_type_diagnostic_item, is_type_lang_item};
44
use clippy_utils::{get_parent_expr, match_def_path, paths, SpanlessEq};
55
use clippy_utils::{meets_msrv, msrvs};
66
use rustc_errors::Applicability;
@@ -140,7 +140,7 @@ fn check_to_owned(
140140
&& let Some(chars_expr_def_id) = cx.typeck_results().type_dependent_def_id(chars_expr.hir_id)
141141
&& match_def_path(cx, chars_expr_def_id, &paths::STR_CHARS)
142142
&& let ty = cx.typeck_results().expr_ty(str_expr).peel_refs()
143-
&& is_type_diagnostic_item(cx, ty, sym::String)
143+
&& is_type_lang_item(cx, ty, hir::LangItem::String)
144144
&& SpanlessEq::new(cx).eq_expr(left_expr, str_expr) {
145145
suggest(cx, parent_expr, left_expr, filter_expr);
146146
}

clippy_lints/src/manual_string_new.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ impl LateLintPass<'_> for ManualStringNew {
4444
let ty = cx.typeck_results().expr_ty(expr);
4545
match ty.kind() {
4646
ty::Adt(adt_def, _) if adt_def.is_struct() => {
47-
if !cx.tcx.is_diagnostic_item(sym::String, adt_def.did()) {
47+
if cx.tcx.lang_items().string() != Some(adt_def.did()) {
4848
return;
4949
}
5050
},

clippy_lints/src/matches/match_str_case_mismatch.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
2-
use clippy_utils::ty::is_type_diagnostic_item;
2+
use clippy_utils::ty::is_type_lang_item;
33
use rustc_ast::ast::LitKind;
44
use rustc_errors::Applicability;
55
use rustc_hir::intravisit::{walk_expr, Visitor};
6-
use rustc_hir::{Arm, Expr, ExprKind, PatKind};
6+
use rustc_hir::{Arm, Expr, ExprKind, LangItem, PatKind};
77
use rustc_lint::LateContext;
88
use rustc_middle::ty;
99
use rustc_span::symbol::Symbol;
10-
use rustc_span::{sym, Span};
10+
use rustc_span::Span;
1111

1212
use super::MATCH_STR_CASE_MISMATCH;
1313

@@ -59,7 +59,7 @@ impl<'a, 'tcx> MatchExprVisitor<'a, 'tcx> {
5959
if let Some(case_method) = get_case_method(segment_ident) {
6060
let ty = self.cx.typeck_results().expr_ty(receiver).peel_refs();
6161

62-
if is_type_diagnostic_item(self.cx, ty, sym::String) || ty.kind() == &ty::Str {
62+
if is_type_lang_item(self.cx, ty, LangItem::String) || ty.kind() == &ty::Str {
6363
self.case_method = Some(case_method);
6464
return true;
6565
}

clippy_lints/src/methods/bytes_count_to_len.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::snippet_with_applicability;
3-
use clippy_utils::ty::is_type_diagnostic_item;
3+
use clippy_utils::ty::is_type_lang_item;
44
use if_chain::if_chain;
55
use rustc_errors::Applicability;
66
use rustc_hir as hir;
77
use rustc_lint::LateContext;
8-
use rustc_span::sym;
98

109
use super::BYTES_COUNT_TO_LEN;
1110

@@ -20,7 +19,7 @@ pub(super) fn check<'tcx>(
2019
if let Some(impl_id) = cx.tcx.impl_of_method(bytes_id);
2120
if cx.tcx.type_of(impl_id).is_str();
2221
let ty = cx.typeck_results().expr_ty(bytes_recv).peel_refs();
23-
if ty.is_str() || is_type_diagnostic_item(cx, ty, sym::String);
22+
if ty.is_str() || is_type_lang_item(cx, ty, hir::LangItem::String);
2423
then {
2524
let mut applicability = Applicability::MachineApplicable;
2625
span_lint_and_sugg(

clippy_lints/src/methods/bytes_nth.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::source::snippet_with_applicability;
3-
use clippy_utils::ty::is_type_diagnostic_item;
3+
use clippy_utils::ty::is_type_lang_item;
44
use rustc_errors::Applicability;
5-
use rustc_hir::Expr;
5+
use rustc_hir::{Expr, LangItem};
66
use rustc_lint::LateContext;
7-
use rustc_span::sym;
87

98
use super::BYTES_NTH;
109

1110
pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &Expr<'_>, recv: &'tcx Expr<'tcx>, n_arg: &'tcx Expr<'tcx>) {
1211
let ty = cx.typeck_results().expr_ty(recv).peel_refs();
1312
let caller_type = if ty.is_str() {
1413
"str"
15-
} else if is_type_diagnostic_item(cx, ty, sym::String) {
14+
} else if is_type_lang_item(cx, ty, LangItem::String) {
1615
"String"
1716
} else {
1817
return;

clippy_lints/src/methods/case_sensitive_file_extension_comparisons.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use clippy_utils::diagnostics::span_lint_and_help;
2-
use clippy_utils::ty::is_type_diagnostic_item;
2+
use clippy_utils::ty::is_type_lang_item;
33
use if_chain::if_chain;
44
use rustc_ast::ast::LitKind;
5-
use rustc_hir::{Expr, ExprKind};
5+
use rustc_hir::{Expr, ExprKind, LangItem};
66
use rustc_lint::LateContext;
7-
use rustc_span::{source_map::Spanned, symbol::sym, Span};
7+
use rustc_span::{source_map::Spanned, Span};
88

99
use super::CASE_SENSITIVE_FILE_EXTENSION_COMPARISONS;
1010

@@ -26,7 +26,7 @@ pub(super) fn check<'tcx>(
2626
if ext_str.chars().skip(1).all(|c| c.is_uppercase() || c.is_ascii_digit())
2727
|| ext_str.chars().skip(1).all(|c| c.is_lowercase() || c.is_ascii_digit());
2828
let recv_ty = cx.typeck_results().expr_ty(recv).peel_refs();
29-
if recv_ty.is_str() || is_type_diagnostic_item(cx, recv_ty, sym::String);
29+
if recv_ty.is_str() || is_type_lang_item(cx, recv_ty, LangItem::String);
3030
then {
3131
span_lint_and_help(
3232
cx,

clippy_lints/src/methods/expect_fun_call.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::macros::{root_macro_call_first_node, FormatArgsExpn};
33
use clippy_utils::source::snippet_with_applicability;
4-
use clippy_utils::ty::is_type_diagnostic_item;
4+
use clippy_utils::ty::{is_type_diagnostic_item, is_type_lang_item};
55
use rustc_errors::Applicability;
66
use rustc_hir as hir;
77
use rustc_lint::LateContext;
@@ -33,7 +33,7 @@ pub(super) fn check<'tcx>(
3333
if (method_name.ident.name == sym::as_str || method_name.ident.name == sym::as_ref) && {
3434
let arg_type = cx.typeck_results().expr_ty(receiver);
3535
let base_type = arg_type.peel_refs();
36-
*base_type.kind() == ty::Str || is_type_diagnostic_item(cx, base_type, sym::String)
36+
*base_type.kind() == ty::Str || is_type_lang_item(cx, base_type, hir::LangItem::String)
3737
} {
3838
receiver
3939
} else {
@@ -50,7 +50,7 @@ pub(super) fn check<'tcx>(
5050
// converted to string.
5151
fn requires_to_string(cx: &LateContext<'_>, arg: &hir::Expr<'_>) -> bool {
5252
let arg_ty = cx.typeck_results().expr_ty(arg);
53-
if is_type_diagnostic_item(cx, arg_ty, sym::String) {
53+
if is_type_lang_item(cx, arg_ty, hir::LangItem::String) {
5454
return false;
5555
}
5656
if let ty::Ref(_, ty, ..) = arg_ty.kind() {

clippy_lints/src/methods/inefficient_to_string.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use clippy_utils::source::snippet_with_applicability;
3-
use clippy_utils::ty::{is_type_diagnostic_item, walk_ptrs_ty_depth};
3+
use clippy_utils::ty::{is_type_lang_item, walk_ptrs_ty_depth};
44
use clippy_utils::{match_def_path, paths};
55
use if_chain::if_chain;
66
use rustc_errors::Applicability;
77
use rustc_hir as hir;
88
use rustc_lint::LateContext;
99
use rustc_middle::ty::{self, Ty};
10-
use rustc_span::symbol::{sym, Symbol};
10+
use rustc_span::symbol::{Symbol, sym};
1111

1212
use super::INEFFICIENT_TO_STRING;
1313

@@ -60,7 +60,7 @@ fn specializes_tostring(cx: &LateContext<'_>, ty: Ty<'_>) -> bool {
6060
return true;
6161
}
6262

63-
if is_type_diagnostic_item(cx, ty, sym::String) {
63+
if is_type_lang_item(cx, ty, hir::LangItem::String) {
6464
return true;
6565
}
6666

clippy_lints/src/methods/manual_str_repeat.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,14 @@ fn parse_repeat_arg(cx: &LateContext<'_>, e: &Expr<'_>) -> Option<RepeatKind> {
3636
}
3737
} else {
3838
let ty = cx.typeck_results().expr_ty(e);
39-
if is_type_diagnostic_item(cx, ty, sym::String)
39+
if is_type_lang_item(cx, ty, LangItem::String)
4040
|| (is_type_lang_item(cx, ty, LangItem::OwnedBox) && get_ty_param(ty).map_or(false, Ty::is_str))
4141
|| (is_type_diagnostic_item(cx, ty, sym::Cow) && get_ty_param(ty).map_or(false, Ty::is_str))
4242
{
4343
Some(RepeatKind::String)
4444
} else {
4545
let ty = ty.peel_refs();
46-
(ty.is_str() || is_type_diagnostic_item(cx, ty, sym::String)).then_some(RepeatKind::String)
46+
(ty.is_str() || is_type_lang_item(cx, ty, LangItem::String)).then_some(RepeatKind::String)
4747
}
4848
}
4949
}
@@ -58,7 +58,7 @@ pub(super) fn check(
5858
if_chain! {
5959
if let ExprKind::Call(repeat_fn, [repeat_arg]) = take_self_arg.kind;
6060
if is_path_diagnostic_item(cx, repeat_fn, sym::iter_repeat);
61-
if is_type_diagnostic_item(cx, cx.typeck_results().expr_ty(collect_expr), sym::String);
61+
if is_type_lang_item(cx, cx.typeck_results().expr_ty(collect_expr), LangItem::String);
6262
if let Some(collect_id) = cx.typeck_results().type_dependent_def_id(collect_expr.hir_id);
6363
if let Some(take_id) = cx.typeck_results().type_dependent_def_id(take_expr.hir_id);
6464
if let Some(iter_trait_id) = cx.tcx.get_diagnostic_item(sym::Iterator);

clippy_lints/src/methods/no_effect_replace.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use clippy_utils::diagnostics::span_lint;
2-
use clippy_utils::ty::is_type_diagnostic_item;
2+
use clippy_utils::ty::is_type_lang_item;
33
use clippy_utils::SpanlessEq;
44
use if_chain::if_chain;
55
use rustc_ast::LitKind;
6-
use rustc_hir::ExprKind;
6+
use rustc_hir::{ExprKind, LangItem};
77
use rustc_lint::LateContext;
8-
use rustc_span::sym;
98

109
use super::NO_EFFECT_REPLACE;
1110

@@ -16,7 +15,7 @@ pub(super) fn check<'tcx>(
1615
arg2: &'tcx rustc_hir::Expr<'_>,
1716
) {
1817
let ty = cx.typeck_results().expr_ty(expr).peel_refs();
19-
if !(ty.is_str() || is_type_diagnostic_item(cx, ty, sym::String)) {
18+
if !(ty.is_str() || is_type_lang_item(cx, ty, LangItem::String)) {
2019
return;
2120
}
2221

clippy_lints/src/methods/repeat_once.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use clippy_utils::consts::{constant_context, Constant};
22
use clippy_utils::diagnostics::span_lint_and_sugg;
33
use clippy_utils::source::snippet;
4-
use clippy_utils::ty::is_type_diagnostic_item;
4+
use clippy_utils::ty::is_type_lang_item;
55
use rustc_errors::Applicability;
6-
use rustc_hir::Expr;
6+
use rustc_hir::{Expr, LangItem};
77
use rustc_lint::LateContext;
8-
use rustc_span::sym;
98

109
use super::REPEAT_ONCE;
1110

@@ -37,7 +36,7 @@ pub(super) fn check<'tcx>(
3736
format!("{}.to_vec()", snippet(cx, recv.span, r#""...""#)),
3837
Applicability::MachineApplicable,
3938
);
40-
} else if is_type_diagnostic_item(cx, ty, sym::String) {
39+
} else if is_type_lang_item(cx, ty, LangItem::String) {
4140
span_lint_and_sugg(
4241
cx,
4342
REPEAT_ONCE,

clippy_lints/src/methods/search_is_some.rs

+2-2
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};
22
use clippy_utils::source::{snippet, snippet_with_applicability};
33
use clippy_utils::sugg::deref_closure_args;
4-
use clippy_utils::ty::is_type_diagnostic_item;
4+
use clippy_utils::ty::is_type_lang_item;
55
use clippy_utils::{is_trait_method, strip_pat_refs};
66
use if_chain::if_chain;
77
use rustc_errors::Applicability;
@@ -105,7 +105,7 @@ pub(super) fn check<'tcx>(
105105
else if search_method == "find" {
106106
let is_string_or_str_slice = |e| {
107107
let self_ty = cx.typeck_results().expr_ty(e).peel_refs();
108-
if is_type_diagnostic_item(cx, self_ty, sym::String) {
108+
if is_type_lang_item(cx, self_ty, hir::LangItem::String) {
109109
true
110110
} else {
111111
*self_ty.kind() == ty::Str

clippy_lints/src/methods/string_extend_chars.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
use clippy_utils::diagnostics::span_lint_and_sugg;
22
use clippy_utils::method_chain_args;
33
use clippy_utils::source::snippet_with_applicability;
4-
use clippy_utils::ty::is_type_diagnostic_item;
4+
use clippy_utils::ty::is_type_lang_item;
55
use rustc_errors::Applicability;
66
use rustc_hir as hir;
77
use rustc_lint::LateContext;
88
use rustc_middle::ty;
9-
use rustc_span::symbol::sym;
109

1110
use super::STRING_EXTEND_CHARS;
1211

1312
pub(super) fn check(cx: &LateContext<'_>, expr: &hir::Expr<'_>, recv: &hir::Expr<'_>, arg: &hir::Expr<'_>) {
1413
let obj_ty = cx.typeck_results().expr_ty(recv).peel_refs();
15-
if !is_type_diagnostic_item(cx, obj_ty, sym::String) {
14+
if !is_type_lang_item(cx, obj_ty, hir::LangItem::String) {
1615
return;
1716
}
1817
if let Some(arglists) = method_chain_args(arg, &["chars"]) {
1918
let target = &arglists[0].0;
2019
let self_ty = cx.typeck_results().expr_ty(target).peel_refs();
2120
let ref_str = if *self_ty.kind() == ty::Str {
2221
""
23-
} else if is_type_diagnostic_item(cx, self_ty, sym::String) {
22+
} else if is_type_lang_item(cx, self_ty, hir::LangItem::String) {
2423
"&"
2524
} else {
2625
return;

clippy_lints/src/methods/unnecessary_join.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
use clippy_utils::{diagnostics::span_lint_and_sugg, ty::is_type_diagnostic_item};
1+
use clippy_utils::{diagnostics::span_lint_and_sugg, ty::is_type_lang_item};
22
use rustc_ast::ast::LitKind;
33
use rustc_errors::Applicability;
4-
use rustc_hir::{Expr, ExprKind};
4+
use rustc_hir::{Expr, ExprKind, LangItem};
55
use rustc_lint::LateContext;
66
use rustc_middle::ty::{Ref, Slice};
7-
use rustc_span::{sym, Span};
7+
use rustc_span::Span;
88

99
use super::UNNECESSARY_JOIN;
1010

@@ -21,7 +21,7 @@ pub(super) fn check<'tcx>(
2121
// the turbofish for collect is ::<Vec<String>>
2222
if let Ref(_, ref_type, _) = collect_output_adjusted_type.kind();
2323
if let Slice(slice) = ref_type.kind();
24-
if is_type_diagnostic_item(cx, *slice, sym::String);
24+
if is_type_lang_item(cx, *slice, LangItem::String);
2525
// the argument for join is ""
2626
if let ExprKind::Lit(spanned) = &join_arg.kind;
2727
if let LitKind::Str(symbol, _) = spanned.node;

0 commit comments

Comments
 (0)