Skip to content

Commit cfd4673

Browse files
committed
Auto merge of #144607 - camsteffen:impl-trait-header-option, r=lcnr
Limit impl_trait_header query to only trait impls Changes `impl_trait_header` to panic on inherent impls intstead of returning None. A few downstream functions are split into option and non-option returning functions. This gets rid of a lot of unwraps where we know we have a trait impl, while there are still some cases where the Option is helpful. Summary of changes to tcx methods: * `impl_is_of_trait` (new) * `impl_trait_header` -> `impl_trait_header`/`impl_opt_trait_header` * `impl_trait_ref` -> `impl_trait_ref`/`impl_opt_trait_ref` * `trait_id_of_impl` -> `impl_trait_id`/`impl_opt_trait_id`
2 parents 27e6879 + bc72375 commit cfd4673

14 files changed

+31
-42
lines changed

clippy_lints/src/derive/derive_ord_xor_partial_ord.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ pub(super) fn check<'tcx>(
2828
return;
2929
}
3030

31-
let trait_ref = cx.tcx.impl_trait_ref(impl_id).expect("must be a trait implementation");
31+
let trait_ref = cx.tcx.impl_trait_ref(impl_id);
3232

3333
// Only care about `impl PartialOrd<Foo> for Foo`
3434
// For `impl PartialOrd<B> for A, input_types is [A, B]

clippy_lints/src/derive/derived_hash_with_manual_eq.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub(super) fn check<'tcx>(
2727
return;
2828
}
2929

30-
let trait_ref = cx.tcx.impl_trait_ref(impl_id).expect("must be a trait implementation");
30+
let trait_ref = cx.tcx.impl_trait_ref(impl_id);
3131

3232
// Only care about `impl PartialEq<Foo> for Foo`
3333
// For `impl PartialEq<B> for A, input_types is [A, B]

clippy_lints/src/fallible_impl_from.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,9 @@ declare_lint_pass!(FallibleImplFrom => [FALLIBLE_IMPL_FROM]);
5252
impl<'tcx> LateLintPass<'tcx> for FallibleImplFrom {
5353
fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'_>) {
5454
// check for `impl From<???> for ..`
55-
if let hir::ItemKind::Impl(_) = &item.kind
56-
&& let Some(impl_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id)
57-
&& cx
58-
.tcx
59-
.is_diagnostic_item(sym::From, impl_trait_ref.skip_binder().def_id)
55+
if let hir::ItemKind::Impl(hir::Impl { of_trait: Some(_), .. }) = &item.kind
56+
&& let impl_trait_id = cx.tcx.impl_trait_id(item.owner_id)
57+
&& cx.tcx.is_diagnostic_item(sym::From, impl_trait_id)
6058
{
6159
lint_impl_body(cx, item.owner_id, item.span);
6260
}

clippy_lints/src/from_over_into.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ impl<'tcx> LateLintPass<'tcx> for FromOverInto {
7676
// `impl Into<target_ty> for self_ty`
7777
&& let Some(GenericArgs { args: [GenericArg::Type(target_ty)], .. }) = into_trait_seg.args
7878
&& span_is_local(item.span)
79-
&& let Some(middle_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id)
80-
.map(ty::EarlyBinder::instantiate_identity)
79+
&& let middle_trait_ref = cx.tcx.impl_trait_ref(item.owner_id).instantiate_identity()
8180
&& cx.tcx.is_diagnostic_item(sym::Into, middle_trait_ref.def_id)
8281
&& !matches!(middle_trait_ref.args.type_at(1).kind(), ty::Alias(ty::Opaque, _))
8382
&& self.msrv.meets(cx, msrvs::RE_REBALANCING_COHERENCE)

clippy_lints/src/implicit_saturating_sub.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,7 @@ fn check_with_condition<'tcx>(
339339
ExprKind::Path(QPath::TypeRelative(_, name)) => {
340340
if name.ident.name == sym::MIN
341341
&& let Some(const_id) = cx.typeck_results().type_dependent_def_id(cond_num_val.hir_id)
342-
&& let Some(impl_id) = cx.tcx.impl_of_assoc(const_id)
343-
&& let None = cx.tcx.impl_trait_ref(impl_id) // An inherent impl
342+
&& let Some(impl_id) = cx.tcx.inherent_impl_of_assoc(const_id)
344343
&& cx.tcx.type_of(impl_id).instantiate_identity().is_integral()
345344
{
346345
print_lint_and_sugg(cx, var_name, expr);
@@ -350,8 +349,7 @@ fn check_with_condition<'tcx>(
350349
if let ExprKind::Path(QPath::TypeRelative(_, name)) = func.kind
351350
&& name.ident.name == sym::min_value
352351
&& let Some(func_id) = cx.typeck_results().type_dependent_def_id(func.hir_id)
353-
&& let Some(impl_id) = cx.tcx.impl_of_assoc(func_id)
354-
&& let None = cx.tcx.impl_trait_ref(impl_id) // An inherent impl
352+
&& let Some(impl_id) = cx.tcx.inherent_impl_of_assoc(func_id)
355353
&& cx.tcx.type_of(impl_id).instantiate_identity().is_integral()
356354
{
357355
print_lint_and_sugg(cx, var_name, expr);

clippy_lints/src/methods/suspicious_splitn.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ use super::SUSPICIOUS_SPLITN;
1010
pub(super) fn check(cx: &LateContext<'_>, method_name: Symbol, expr: &Expr<'_>, self_arg: &Expr<'_>, count: u128) {
1111
if count <= 1
1212
&& let Some(call_id) = cx.typeck_results().type_dependent_def_id(expr.hir_id)
13-
&& let Some(impl_id) = cx.tcx.impl_of_assoc(call_id)
14-
&& cx.tcx.impl_trait_ref(impl_id).is_none()
13+
&& let Some(impl_id) = cx.tcx.inherent_impl_of_assoc(call_id)
1514
&& let self_ty = cx.tcx.type_of(impl_id).instantiate_identity()
1615
&& (self_ty.is_slice() || self_ty.is_str())
1716
{

clippy_lints/src/missing_inline.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingInline {
167167
let container_id = assoc_item.container_id(cx.tcx);
168168
let trait_def_id = match assoc_item.container {
169169
AssocContainer::Trait => Some(container_id),
170-
AssocContainer::TraitImpl(_) => cx.tcx.impl_trait_ref(container_id).map(|t| t.skip_binder().def_id),
170+
AssocContainer::TraitImpl(_) => Some(cx.tcx.impl_trait_id(container_id)),
171171
AssocContainer::InherentImpl => None,
172172
};
173173

clippy_lints/src/non_canonical_impls.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_errors::Applicability;
66
use rustc_hir::def_id::DefId;
77
use rustc_hir::{Block, Body, Expr, ExprKind, ImplItem, ImplItemKind, Item, ItemKind, LangItem, UnOp};
88
use rustc_lint::{LateContext, LateLintPass, LintContext};
9-
use rustc_middle::ty::{EarlyBinder, TyCtxt, TypeckResults};
9+
use rustc_middle::ty::{TyCtxt, TypeckResults};
1010
use rustc_session::impl_lint_pass;
1111
use rustc_span::sym;
1212
use rustc_span::symbol::kw;
@@ -173,10 +173,11 @@ impl LateLintPass<'_> for NonCanonicalImpls {
173173
}
174174
});
175175

176+
let trait_impl = cx.tcx.impl_trait_ref(item.owner_id).skip_binder();
177+
176178
match trait_ {
177179
Trait::Clone => {
178180
if let Some(copy_trait) = self.copy_trait
179-
&& let Some(trait_impl) = cx.tcx.impl_trait_ref(item.owner_id).map(EarlyBinder::skip_binder)
180181
&& implements_trait(cx, trait_impl.self_ty(), copy_trait, &[])
181182
{
182183
for (assoc, _, block) in assoc_fns {
@@ -185,10 +186,9 @@ impl LateLintPass<'_> for NonCanonicalImpls {
185186
}
186187
},
187188
Trait::PartialOrd => {
188-
if let Some(trait_impl) = cx.tcx.impl_trait_ref(item.owner_id).map(EarlyBinder::skip_binder)
189-
// If `Self` and `Rhs` are not the same type, then a corresponding `Ord` impl is not possible,
190-
// since it doesn't have an `Rhs`
191-
&& let [lhs, rhs] = trait_impl.args.as_slice()
189+
// If `Self` and `Rhs` are not the same type, then a corresponding `Ord` impl is not possible,
190+
// since it doesn't have an `Rhs`
191+
if let [lhs, rhs] = trait_impl.args.as_slice()
192192
&& lhs == rhs
193193
&& let Some(ord_trait) = self.ord_trait
194194
&& implements_trait(cx, trait_impl.self_ty(), ord_trait, &[])

clippy_lints/src/non_send_fields_in_send_ty.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ impl<'tcx> LateLintPass<'tcx> for NonSendFieldInSendTy {
8787
&& let Some(trait_id) = of_trait.trait_ref.trait_def_id()
8888
&& send_trait == trait_id
8989
&& of_trait.polarity == ImplPolarity::Positive
90-
&& let Some(ty_trait_ref) = cx.tcx.impl_trait_ref(item.owner_id)
90+
&& let ty_trait_ref = cx.tcx.impl_trait_ref(item.owner_id)
9191
&& let self_ty = ty_trait_ref.instantiate_identity().self_ty()
9292
&& let ty::Adt(adt_def, impl_trait_args) = self_ty.kind()
9393
{

clippy_lints/src/only_used_in_recursion.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ use rustc_data_structures::fx::FxHashMap;
66
use rustc_errors::Applicability;
77
use rustc_hir::def_id::DefId;
88
use rustc_hir::hir_id::HirIdMap;
9-
use rustc_hir::{Body, Expr, ExprKind, HirId, ImplItem, ImplItemKind, Node, PatKind, TraitItem, TraitItemKind};
9+
use rustc_hir::{Body, Expr, ExprKind, HirId, ImplItem, ImplItemImplKind, ImplItemKind, Node, PatKind, TraitItem, TraitItemKind};
1010
use rustc_lint::{LateContext, LateLintPass};
11-
use rustc_middle::ty::{self, ConstKind, EarlyBinder, GenericArgKind, GenericArgsRef};
11+
use rustc_middle::ty::{self, ConstKind, GenericArgKind, GenericArgsRef};
1212
use rustc_session::impl_lint_pass;
1313
use rustc_span::Span;
1414
use rustc_span::symbol::{Ident, kw};
@@ -320,15 +320,14 @@ impl<'tcx> LateLintPass<'tcx> for OnlyUsedInRecursion {
320320
Node::ImplItem(&ImplItem {
321321
kind: ImplItemKind::Fn(ref sig, _),
322322
owner_id,
323+
impl_kind,
323324
..
324325
}) => {
325-
if let Node::Item(item) = cx.tcx.parent_hir_node(owner_id.into())
326-
&& let Some(trait_ref) = cx
327-
.tcx
328-
.impl_trait_ref(item.owner_id)
329-
.map(EarlyBinder::instantiate_identity)
330-
&& let Some(trait_item_id) = cx.tcx.trait_item_of(owner_id)
326+
if let ImplItemImplKind::Trait { trait_item_def_id, .. } = impl_kind
327+
&& let Ok(trait_item_id) = trait_item_def_id
331328
{
329+
let impl_id = cx.tcx.parent(owner_id.into());
330+
let trait_ref = cx.tcx.impl_trait_ref(impl_id).instantiate_identity();
332331
(
333332
trait_item_id,
334333
FnKind::ImplTraitFn(

0 commit comments

Comments
 (0)