Skip to content

Commit 968569f

Browse files
committed
Auto merge of rust-lang#145186 - camsteffen:assoc-impl-kind, r=petrochenkov
Make `AssocItem` aware of its impl kind The general goal is to have fewer query dependencies by making `AssocItem` aware of its parent impl kind (inherent vs. trait) without having to query the parent def_kind. See individual commits.
2 parents 4328c95 + 324c214 commit 968569f

12 files changed

+61
-52
lines changed

clippy_lints/src/disallowed_macros.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use rustc_data_structures::fx::FxHashSet;
88
use rustc_hir::def::DefKind;
99
use rustc_hir::def_id::DefIdMap;
1010
use rustc_hir::{
11-
AmbigArg, Expr, ExprKind, ForeignItem, HirId, ImplItem, Item, ItemKind, OwnerId, Pat, Path, Stmt, TraitItem, Ty,
11+
AmbigArg, Expr, ExprKind, ForeignItem, HirId, ImplItem, ImplItemImplKind, Item, ItemKind, OwnerId, Pat, Path, Stmt, TraitItem, Ty,
1212
};
1313
use rustc_lint::{LateContext, LateLintPass};
1414
use rustc_middle::ty::TyCtxt;
@@ -177,7 +177,9 @@ impl LateLintPass<'_> for DisallowedMacros {
177177

178178
fn check_impl_item(&mut self, cx: &LateContext<'_>, item: &ImplItem<'_>) {
179179
self.check(cx, item.span, None);
180-
self.check(cx, item.vis_span, None);
180+
if let ImplItemImplKind::Inherent { vis_span, .. } = item.impl_kind {
181+
self.check(cx, vis_span, None);
182+
}
181183
}
182184

183185
fn check_trait_item(&mut self, cx: &LateContext<'_>, item: &TraitItem<'_>) {

clippy_lints/src/functions/renamed_function_params.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use rustc_errors::{Applicability, MultiSpan};
3-
use rustc_hir::def_id::{DefId, DefIdSet};
4-
use rustc_hir::hir_id::OwnerId;
3+
use rustc_hir::def_id::DefIdSet;
54
use rustc_hir::{Impl, ImplItem, ImplItemKind, ItemKind, Node, TraitRef};
65
use rustc_lint::LateContext;
76
use rustc_span::Span;
@@ -19,7 +18,7 @@ pub(super) fn check_impl_item(cx: &LateContext<'_>, item: &ImplItem<'_>, ignored
1918
of_trait: Some(of_trait),
2019
..
2120
}) = &parent_item.kind
22-
&& let Some(did) = trait_item_def_id_of_impl(cx, item.owner_id)
21+
&& let Some(did) = cx.tcx.trait_item_of(item.owner_id)
2322
&& !is_from_ignored_trait(&of_trait.trait_ref, ignored_traits)
2423
{
2524
let mut param_idents_iter = cx.tcx.hir_body_param_idents(body_id);
@@ -87,11 +86,6 @@ impl RenamedFnArgs {
8786
}
8887
}
8988

90-
/// Get the [`trait_item_def_id`](ImplItemRef::trait_item_def_id) of a relevant impl item.
91-
fn trait_item_def_id_of_impl(cx: &LateContext<'_>, target: OwnerId) -> Option<DefId> {
92-
cx.tcx.associated_item(target).trait_item_def_id
93-
}
94-
9589
fn is_from_ignored_trait(of_trait: &TraitRef<'_>, ignored_traits: &DefIdSet) -> bool {
9690
of_trait
9791
.trait_def_id()

clippy_lints/src/manual_async_fn.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use rustc_errors::Applicability;
44
use rustc_hir::intravisit::FnKind;
55
use rustc_hir::{
66
Block, Body, Closure, ClosureKind, CoroutineDesugaring, CoroutineKind, CoroutineSource, Expr, ExprKind, FnDecl,
7-
FnRetTy, GenericBound, ImplItem, Item, Node, OpaqueTy, TraitRef, Ty, TyKind,
7+
FnRetTy, GenericBound, Node, OpaqueTy, TraitRef, Ty, TyKind,
88
};
99
use rustc_lint::{LateContext, LateLintPass};
1010
use rustc_middle::middle::resolve_bound_vars::ResolvedArg;
@@ -60,8 +60,11 @@ impl<'tcx> LateLintPass<'tcx> for ManualAsyncFn {
6060
&& let ExprKind::Block(block, _) = body.value.kind
6161
&& block.stmts.is_empty()
6262
&& let Some(closure_body) = desugared_async_block(cx, block)
63-
&& let Node::Item(Item {vis_span, ..}) | Node::ImplItem(ImplItem {vis_span, ..}) =
64-
cx.tcx.hir_node_by_def_id(fn_def_id)
63+
&& let Some(vis_span_opt) = match cx.tcx.hir_node_by_def_id(fn_def_id) {
64+
Node::Item(item) => Some(Some(item.vis_span)),
65+
Node::ImplItem(impl_item) => Some(impl_item.vis_span()),
66+
_ => None,
67+
}
6568
&& !span.from_expansion()
6669
{
6770
let header_span = span.with_hi(ret_ty.span.hi());
@@ -72,7 +75,8 @@ impl<'tcx> LateLintPass<'tcx> for ManualAsyncFn {
7275
header_span,
7376
"this function can be simplified using the `async fn` syntax",
7477
|diag| {
75-
if let Some(vis_snip) = vis_span.get_source_text(cx)
78+
if let Some(vis_span) = vis_span_opt
79+
&& let Some(vis_snip) = vis_span.get_source_text(cx)
7680
&& let Some(header_snip) = header_span.get_source_text(cx)
7781
&& let Some(ret_pos) = position_before_rarrow(&header_snip)
7882
&& let Some((_, ret_snip)) = suggested_ret(cx, output)

clippy_lints/src/min_ident_chars.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use rustc_data_structures::fx::FxHashSet;
55
use rustc_hir::def::{DefKind, Res};
66
use rustc_hir::intravisit::{Visitor, walk_item, walk_trait_item};
77
use rustc_hir::{
8-
GenericParamKind, HirId, Impl, ImplItem, ImplItemKind, Item, ItemKind, ItemLocalId, Node, Pat, PatKind, TraitItem,
9-
UsePath,
8+
GenericParamKind, HirId, Impl, ImplItem, ImplItemImplKind, ImplItemKind, Item, ItemKind, ItemLocalId, Node, Pat,
9+
PatKind, TraitItem, UsePath,
1010
};
1111
use rustc_lint::{LateContext, LateLintPass, LintContext};
1212
use rustc_session::impl_lint_pass;
@@ -256,7 +256,7 @@ fn is_not_in_trait_impl(cx: &LateContext<'_>, pat: &Pat<'_>, ident: Ident) -> bo
256256
}
257257

258258
fn get_param_name(impl_item: &ImplItem<'_>, cx: &LateContext<'_>, ident: Ident) -> Option<Symbol> {
259-
if let Some(trait_item_def_id) = impl_item.trait_item_def_id {
259+
if let ImplItemImplKind::Trait { trait_item_def_id: Ok(trait_item_def_id), .. } = impl_item.impl_kind {
260260
let trait_param_names = cx.tcx.fn_arg_idents(trait_item_def_id);
261261

262262
let ImplItemKind::Fn(_, body_id) = impl_item.kind else {

clippy_lints/src/missing_const_for_fn.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,23 @@ impl<'tcx> LateLintPass<'tcx> for MissingConstForFn {
158158
let mir = cx.tcx.optimized_mir(def_id);
159159

160160
if let Ok(()) = is_min_const_fn(cx, mir, self.msrv)
161-
&& let hir::Node::Item(hir::Item { vis_span, .. }) | hir::Node::ImplItem(hir::ImplItem { vis_span, .. }) =
162-
cx.tcx.hir_node_by_def_id(def_id)
161+
&& let node = cx.tcx.hir_node_by_def_id(def_id)
162+
&& let Some((item_span, vis_span_opt)) = match node {
163+
hir::Node::Item(item) => Some((item.span, Some(item.vis_span))),
164+
hir::Node::ImplItem(impl_item) => Some((impl_item.span, impl_item.vis_span())),
165+
_ => None,
166+
}
163167
{
164-
let suggestion = if vis_span.is_empty() { "const " } else { " const" };
168+
let (sugg_span, suggestion) = if let Some(vis_span) = vis_span_opt
169+
&& !vis_span.is_empty()
170+
{
171+
(vis_span.shrink_to_hi(), " const")
172+
} else {
173+
(item_span.shrink_to_lo(), "const ")
174+
};
165175
span_lint_and_then(cx, MISSING_CONST_FOR_FN, span, "this could be a `const fn`", |diag| {
166176
diag.span_suggestion_verbose(
167-
vis_span.shrink_to_hi(),
177+
sugg_span,
168178
"make the function `const`",
169179
suggestion,
170180
Applicability::MachineApplicable,

clippy_lints/src/missing_doc.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use rustc_hir::Attribute;
1616
use rustc_hir::def::DefKind;
1717
use rustc_hir::def_id::LocalDefId;
1818
use rustc_lint::{LateContext, LateLintPass, LintContext};
19-
use rustc_middle::ty::Visibility;
19+
use rustc_middle::ty::{AssocContainer, Visibility};
2020
use rustc_session::impl_lint_pass;
2121
use rustc_span::def_id::CRATE_DEF_ID;
2222
use rustc_span::symbol::kw;
@@ -246,12 +246,11 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc {
246246

247247
fn check_impl_item(&mut self, cx: &LateContext<'tcx>, impl_item: &'tcx hir::ImplItem<'_>) {
248248
// If the method is an impl for a trait, don't doc.
249-
if let Some(cid) = cx.tcx.associated_item(impl_item.owner_id).impl_container(cx.tcx) {
250-
if cx.tcx.impl_trait_ref(cid).is_some() {
249+
match cx.tcx.associated_item(impl_item.owner_id).container {
250+
AssocContainer::Trait | AssocContainer::TraitImpl(_) => {
251251
note_prev_span_then_ret!(self.prev_span, impl_item.span);
252-
}
253-
} else {
254-
note_prev_span_then_ret!(self.prev_span, impl_item.span);
252+
},
253+
AssocContainer::InherentImpl => {}
255254
}
256255

257256
let (article, desc) = cx.tcx.article_and_description(impl_item.owner_id.to_def_id());

clippy_lints/src/missing_inline.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use rustc_hir::attrs::AttributeKind;
33
use rustc_hir::def_id::DefId;
44
use rustc_hir::{self as hir, Attribute, find_attr};
55
use rustc_lint::{LateContext, LateLintPass, LintContext};
6-
use rustc_middle::ty::AssocItemContainer;
6+
use rustc_middle::ty::AssocContainer;
77
use rustc_session::declare_lint_pass;
88
use rustc_span::Span;
99

@@ -166,8 +166,9 @@ impl<'tcx> LateLintPass<'tcx> for MissingInline {
166166
let assoc_item = cx.tcx.associated_item(impl_item.owner_id);
167167
let container_id = assoc_item.container_id(cx.tcx);
168168
let trait_def_id = match assoc_item.container {
169-
AssocItemContainer::Trait => Some(container_id),
170-
AssocItemContainer::Impl => cx.tcx.impl_trait_ref(container_id).map(|t| t.skip_binder().def_id),
169+
AssocContainer::Trait => Some(container_id),
170+
AssocContainer::TraitImpl(_) => cx.tcx.impl_trait_ref(container_id).map(|t| t.skip_binder().def_id),
171+
AssocContainer::InherentImpl => None,
171172
};
172173

173174
if let Some(trait_def_id) = trait_def_id

clippy_lints/src/missing_trait_methods.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingTraitMethods {
7070
.tcx
7171
.associated_items(item.owner_id)
7272
.in_definition_order()
73-
.filter_map(|assoc_item| assoc_item.trait_item_def_id)
73+
.filter_map(|assoc_item| assoc_item.expect_trait_impl().ok())
7474
.collect();
7575

7676
for assoc in cx

clippy_lints/src/only_used_in_recursion.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ impl<'tcx> LateLintPass<'tcx> for OnlyUsedInRecursion {
248248
.tcx
249249
.impl_trait_ref(item.owner_id)
250250
.map(EarlyBinder::instantiate_identity)
251-
&& let Some(trait_item_id) = cx.tcx.associated_item(owner_id).trait_item_def_id
251+
&& let Some(trait_item_id) = cx.tcx.trait_item_of(owner_id)
252252
{
253253
(
254254
trait_item_id,

clippy_lints/src/use_self.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,7 @@ impl<'tcx> LateLintPass<'tcx> for UseSelf {
151151
// trait, not in the impl of the trait.
152152
let trait_method = cx
153153
.tcx
154-
.associated_item(impl_item.owner_id)
155-
.trait_item_def_id
154+
.trait_item_of(impl_item.owner_id)
156155
.expect("impl method matches a trait method");
157156
let trait_method_sig = cx.tcx.fn_sig(trait_method).instantiate_identity();
158157
let trait_method_sig = cx.tcx.instantiate_bound_regions_with_erased(trait_method_sig);

0 commit comments

Comments
 (0)